import React, { Fragment, useState } from 'react';
import PropTypes from 'prop-types';
import { Link } from 'react-router-dom';
import { get } from 'lodash';
import useApi from 'shared/hooks/api';
import { sortByNewest } from 'shared/utils/javascript';
import { IssueTypeIcon } from 'shared/components';
import NoResultsSVG from './NoResultsSvg';
import {
IssueSearch,
SearchInputCont,
SearchInputDebounced,
SearchIcon,
SearchSpinner,
Issue,
IssueData,
IssueTitle,
IssueTypeId,
SectionTitle,
NoResults,
NoResultsTitle,
NoResultsTip,
} from './Styles';
const propTypes = {
project: PropTypes.object.isRequired,
};
const ProjectIssueSearch = ({ project }) => {
const [isSearchTermEmpty, setIsSearchTermEmpty] = useState(true);
const [{ data, isLoading }, fetchIssues] = useApi.get('/issues', {}, { lazy: true });
const matchingIssues = get(data, 'issues', []);
const recentIssues = sortByNewest(project.issues, 'createdAt').slice(0, 10);
const handleSearchChange = value => {
const searchTerm = value.trim();
setIsSearchTermEmpty(!searchTerm);
if (searchTerm) {
fetchIssues({ searchTerm });
}
};
return (
{isLoading && }
{isSearchTermEmpty && recentIssues.length > 0 && (
Recent Issues
{recentIssues.map(renderIssue)}
)}
{!isSearchTermEmpty && matchingIssues.length > 0 && (
Matching Issues
{matchingIssues.map(renderIssue)}
)}
{!isSearchTermEmpty && !isLoading && matchingIssues.length === 0 && (
We couldn't find anything matching your search
Try again with a different term.
)}
);
};
const renderIssue = issue => (
{issue.title}
{`${issue.type}-${issue.id}`}
);
ProjectIssueSearch.propTypes = propTypes;
export default ProjectIssueSearch;