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 ( <> Logo

{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 } } } } } `;