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;