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.snippetDataJson.data.map(snippet => ({ title: snippet.title, html: props.data.allMarkdownRemark.edges.find( v => v.node.frontmatter.title === snippet.title, ).node.html, tags: snippet.attributes.tags, id: snippet.id, })); 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( v => v.tags.filter(t => t.indexOf(q) !== -1).length || v.title.toLowerCase().indexOf(q) !== -1, ); setSearchResults(results); }, [searchQuery]); React.useEffect(() => { props.dispatch(pushNewPage('Search', '/search')); }, []); return ( <>

Click on a snippet's name to view its code.

{/* 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(snippet => ( ))} )}
); }; 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 { snippetDataJson(meta: { type: { eq: "snippetListingArray" }, scope: {eq: "./snippets"} }) { data { id title attributes { tags } } } allMarkdownRemark { edges { node { html frontmatter { title } } } } } `;