(
+
diff --git a/app/src/components/bookmark.js b/app/src/components/bookmark.js
new file mode 100644
index 0000000..ac4d0d5
--- /dev/null
+++ b/app/src/components/bookmark.js
@@ -0,0 +1,26 @@
+import React, { useContext } from 'react'
+import { Button } from "react-bootstrap"
+import { BookmarkContext } from '../context/globalState'
+
+export default ({ book }) => {
+ const { updateReadingList, readingList } = useContext(BookmarkContext)
+ const readingListIds = readingList.bookIds
+
+ return (
+
updateReadingList({ type: 'bookmark', retrievedBook: book })}>
+
+
+ )
+}
diff --git a/app/src/components/sidebar.js b/app/src/components/sidebar.js
index 9f6930a..69f69cb 100644
--- a/app/src/components/sidebar.js
+++ b/app/src/components/sidebar.js
@@ -1,10 +1,13 @@
-import React from "react"
+import React, { useContext } from "react"
import { Nav } from "react-bootstrap"
-import { StaticQuery, graphql } from "gatsby"
+import { StaticQuery, graphql, Link } from "gatsby"
import "../styles/sidebar.css"
+import { BookmarkContext } from '../context/globalState'
var slugify = require('slugify')
export default () => {
+ const { readingList } = useContext(BookmarkContext)
+
return (
{
activeKey="/home"
>
+
+ 🔖 Reading List ({readingList.bookIds.length})
+
{data.allCategoriesJson.edges.map(function(x, index) {
return (
diff --git a/app/src/context/bookReducer.js b/app/src/context/bookReducer.js
new file mode 100644
index 0000000..b61da1f
--- /dev/null
+++ b/app/src/context/bookReducer.js
@@ -0,0 +1,33 @@
+export default function bookReducer(state, action) {
+ let readingListCopy = {...state}
+
+ switch (action.type) {
+ case 'init': {
+ if (action.content) {
+ return action.content
+ }
+ return readingListCopy
+ }
+ case 'bookmark': {
+ let { bookIds, books } = readingListCopy
+ const { retrievedBook } = action
+ const retrievedBookId = retrievedBook.id
+ // Delete existing bookmark
+ if (bookIds.includes(retrievedBookId)) {
+ readingListCopy.bookIds = bookIds.filter(id => id !== retrievedBookId)
+ delete books[retrievedBookId]
+ if (typeof window !== undefined) {
+ localStorage.setItem('Bookmarks', JSON.stringify(readingListCopy))
+ }
+ // Add new bookmark
+ } else {
+ books[retrievedBookId] = retrievedBook
+ bookIds.push(retrievedBookId)
+ if (typeof window !== undefined) {
+ localStorage.setItem('Bookmarks', JSON.stringify(readingListCopy))
+ }
+ }
+ return readingListCopy
+ }
+ }
+ }
\ No newline at end of file
diff --git a/app/src/context/globalState.js b/app/src/context/globalState.js
new file mode 100644
index 0000000..e5e7f8a
--- /dev/null
+++ b/app/src/context/globalState.js
@@ -0,0 +1,25 @@
+import React, { useReducer, useEffect } from 'react'
+import bookReducer from './bookReducer'
+
+export const BookmarkContext = React.createContext()
+
+export default function GlobalState({children}) {
+ let [readingList, updateReadingList] = useReducer(bookReducer, {
+ books: {},
+ bookIds: []
+ })
+
+ useEffect(() => {
+ if (typeof window !== undefined) {
+ const retrievedBooks = JSON.parse(localStorage.getItem('Bookmarks'))
+ console.log(retrievedBooks)
+ updateReadingList({type: 'init', content: retrievedBooks})
+ }
+ }, [])
+
+ return (
+
+ {children}
+
+ )
+}
diff --git a/app/src/pages/index.js b/app/src/pages/index.js
index 4a51d2d..3ee57ed 100644
--- a/app/src/pages/index.js
+++ b/app/src/pages/index.js
@@ -18,11 +18,13 @@ function myFunction(setMaximumBooksToShow, maximumBooksToShow) {
}
export default ({ data }) => {
- let [maximumBooksToShow, setMaximumBooksToShow] = useState(12)
+ let [maximumBooksToShow, setMaximumBooksToShow] = useState(12)
+
useEffect(() => {
window.document.onscroll = () =>
myFunction(setMaximumBooksToShow, maximumBooksToShow)
- })
+ })
+
return (
diff --git a/app/src/pages/readingList.js b/app/src/pages/readingList.js
new file mode 100644
index 0000000..8818c0b
--- /dev/null
+++ b/app/src/pages/readingList.js
@@ -0,0 +1,36 @@
+import React, { useContext } from "react"
+import { Link } from "gatsby"
+import { Container, Row, Col } from "react-bootstrap"
+import SideBar from "../components/sidebar"
+import Layout from "../components/layout"
+import SEO from "../components/seo"
+import Bookcard from "../components/bookcard"
+import { BookmarkContext } from "../context/globalState"
+
+const ReadingList = () => {
+ const { readingList } = useContext(BookmarkContext)
+
+ return (
+
+
+
+
+
+
+
+
+ Your reading list
+ Go back to the homepage
+ {
+ readingList.bookIds.map(bookId => {
+ return
+ })
+ }
+
+
+
+ Reading List
+
+)}
+
+export default ReadingList