import React from 'react'; import { graphql } from 'gatsby'; import { connect } from 'react-redux'; import { pushNewPage, pushNewQuery } from '../state/app'; import Shell from '../components/Shell'; import Meta from '../components/Meta'; import Search from '../components/Search'; import SnippetCard from '../components/SnippetCard'; // =================================================== // Search page // =================================================== const SearchPage = props => { const snippets = props.data.allSnippet.edges; const [searchQuery, setSearchQuery] = React.useState(props.searchQuery); const [searchResults, setSearchResults] = React.useState(snippets); React.useEffect(() => { props.dispatch(pushNewQuery(searchQuery)); let q = searchQuery.toLowerCase(); let results = snippets; if (q.trim().length) results = snippets.filter( ({ node }) => node.tags.all.filter(t => t.indexOf(q) !== -1).length || node.title.toLowerCase().indexOf(q) !== -1, ); setSearchResults(results); }, [searchQuery]); React.useEffect(() => { props.dispatch(pushNewPage('Search', '/search')); }, []); return ( <>

Click on a snippet card to view the snippet.

{/* Display page background or results depending on state */} {searchQuery.length === 0 ? ( <>

Start typing a keyword to see matching snippets.

) : searchResults.length === 0 ? ( <>

No results found

We couldn't find any results for the keyword{' '} {searchQuery}.

) : ( <>

Search results

{searchResults.map(({node}) => ( ))} )}
); }; export default connect( state => ({ isDarkMode: state.app.isDarkMode, lastPageTitle: state.app.lastPageTitle, lastPageUrl: state.app.lastPageUrl, searchQuery: state.app.searchQuery, }), null, )(SearchPage); export const searchPageQuery = graphql` query searchSnippetList { allSnippet { edges { node { title html { text } tags { all } id } } } } `;