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'; import { getRawCodeBlocks as getCodeBlocks } from '../util'; // =================================================== // Home page (splash and search) // =================================================== const IndexPage = 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, text: snippet.attributes.text, id: snippet.id, code: getCodeBlocks( props.data.allMarkdownRemark.edges.find( v => v.node.frontmatter.title === snippet.title, ).node.rawMarkdownBody, ).code, })); 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 ( <> {props.data.site.siteMetadata.title} {props.data.site.siteMetadata.description} {searchQuery.length === 0 ? ( Start typing a keyword to see matching snippets. ) : searchResults.length === 0 ? ( We couldn't find any results for the keyword{' '} {searchQuery}. ) : ( <> Click on a snippet's name to view its code. 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, )(IndexPage); export const indexPageQuery = graphql` query snippetList { site { siteMetadata { title description author } } file(relativePath: { eq: "30s-icon.png" }) { id childImageSharp { original { src } } } snippetDataJson(meta: { type: { eq: "snippetListingArray" } }) { data { id title attributes { tags text } } } allMarkdownRemark( limit: 1000 sort: { fields: [frontmatter___title], order: ASC } ) { totalCount edges { node { id html rawMarkdownBody fields { slug } frontmatter { title tags } } } } } `;
{props.data.site.siteMetadata.description}
Start typing a keyword to see matching snippets.
We couldn't find any results for the keyword{' '} {searchQuery}.
Click on a snippet's name to view its code.