From defa5cb196d624b2ead29fb03bc01a87d0d28a83 Mon Sep 17 00:00:00 2001 From: Vishnu KS Date: Sun, 23 Aug 2020 00:28:09 +0530 Subject: [PATCH] Refactor feed into a component. --- app/gatsby-node.js | 38 +++++++++++++++++++++++---- app/src/components/feed.js | 18 +++++++++++++ app/src/components/sidebar.js | 13 ++++++--- app/src/data/categories.json | 6 ++--- app/src/pages/index.js | 19 +++++--------- app/src/templates/categoryTemplate.js | 28 +++++++++++++++----- 6 files changed, 92 insertions(+), 30 deletions(-) create mode 100644 app/src/components/feed.js diff --git a/app/gatsby-node.js b/app/gatsby-node.js index 05a5668..6d2f276 100644 --- a/app/gatsby-node.js +++ b/app/gatsby-node.js @@ -2,18 +2,46 @@ const fs = require("fs") const categories = JSON.parse(fs.readFileSync("src/data/categories.json")) function createSlug (categoryName) { - const categoryNameLower = categoryName.toLowerCase(); - return categoryNameLower.replace(" ", "-"); + categoryName = categoryName.toLowerCase(); + categoryName = categoryName.replace(/ /g, "-"); + categoryName = categoryName.replace(/,/g, ""); + return categoryName; }; -exports.createPages = ({ actions }) => { +exports.createPages = async function ({ actions, graphql }) { const { createPage } = actions - categories.forEach(category => { + categories.forEach(async function(category) { + const data = await graphql(`query categoryBooksQuery($categoryName: String) { + allBooksJson( + filter: { + category: { + eq: $categoryName + } + } + ){ + edges { + node { + id + title + url + rating + author + year + category + } + } + } + } + `, + {categoryName: category.name}) + createPage({ path: createSlug(category.name), component: require.resolve("./src/templates/categoryTemplate.js"), context: { - categoryName: category.name + categoryName: category.name, + data: data, + limit: null, }, }) }) diff --git a/app/src/components/feed.js b/app/src/components/feed.js new file mode 100644 index 0000000..cf2de11 --- /dev/null +++ b/app/src/components/feed.js @@ -0,0 +1,18 @@ +import React from "react"; +import { Nav } from "react-bootstrap"; +import { StaticQuery, graphql } from "gatsby" +import '../styles/sidebar.css' +import BookCard from "../components/bookcard" + +export default ({data, limit}) => { + return data.allBooksJson.edges.map(function(x, index) { + console.log(index, limit) + if(!limit || index < limit){ + return ( + + ) + } else { + return null; + } + }) +}; diff --git a/app/src/components/sidebar.js b/app/src/components/sidebar.js index 14b613a..6b9526f 100644 --- a/app/src/components/sidebar.js +++ b/app/src/components/sidebar.js @@ -3,6 +3,13 @@ import { Nav } from "react-bootstrap"; import { StaticQuery, graphql } from "gatsby" import '../styles/sidebar.css' +function createSlug (categoryName) { + categoryName = categoryName.toLowerCase(); + categoryName = categoryName.replace(/ /g, "-"); + categoryName = categoryName.replace(/,/g, ""); + return categoryName; +}; + export default () => { return ( { render={data => ( )} /> diff --git a/app/src/data/categories.json b/app/src/data/categories.json index c3146f6..bbd8be3 100644 --- a/app/src/data/categories.json +++ b/app/src/data/categories.json @@ -1,12 +1,12 @@ [ { - "name": "Startups and Business" + "name": "🚀 Startups and Business" }, { - "name": "Philosophy and Psychology" + "name": "☯️ Philosophy and Psychology" }, { - "name": "Autobiographies and Biographies" + "name": "👩🏾 Autobiographies and Biographies" }, { "name": "History" diff --git a/app/src/pages/index.js b/app/src/pages/index.js index 9fc12cc..4d55561 100644 --- a/app/src/pages/index.js +++ b/app/src/pages/index.js @@ -6,17 +6,18 @@ import SEO from "../components/seo" import BookCard from "../components/bookcard" import SideBar from "../components/sidebar"; import {Container, Row, Col} from 'react-bootstrap'; +import BookFeed from "../components/feed"; -function myFunction(setEnd, end) { +function myFunction(setMaximumBooksToShow, maximumBooksToShow) { if (document.documentElement.clientHeight+document.documentElement.scrollTop>=document.documentElement.scrollHeight) { - setEnd(end+12) + setMaximumBooksToShow(maximumBooksToShow + 12) } } export default ({data}) => { - let [end, setEnd] = useState(12); + let [maximumBooksToShow, setMaximumBooksToShow] = useState(12); useEffect(()=>{ - window.document.onscroll = () => myFunction(setEnd, end); + window.document.onscroll = () => myFunction(setMaximumBooksToShow, maximumBooksToShow); }) return ( @@ -27,15 +28,7 @@ export default ({data}) => { - {data.allBooksJson.edges.map(function(x, index) { - if(index - ) - }else{ - return null; - } - })} + diff --git a/app/src/templates/categoryTemplate.js b/app/src/templates/categoryTemplate.js index 593e7c1..08db62b 100644 --- a/app/src/templates/categoryTemplate.js +++ b/app/src/templates/categoryTemplate.js @@ -1,14 +1,30 @@ -import React from "react"; -import { Link } from "gatsby"; +import React, { useState, useEffect } from "react" +import { graphql } from 'gatsby' + +import Layout from "../components/layout" +import SEO from "../components/seo" +import SideBar from "../components/sidebar"; +import {Container, Row, Col} from 'react-bootstrap'; +import BookFeed from "../components/feed"; const basicTemplate = props => { const { pageContext } = props - const { categoryName } = pageContext + const { categoryName, books } = pageContext return ( -
- {categoryName} -
+ + + + + + + + + + + + + ) } export default basicTemplate