import { Routes, Route, Link, Navigate } from 'react-router-dom' import Authors from './components/Authors' import Books from './components/Books' import NewBook from './components/NewBook' import { useState } from 'react' import LoginForm from './components/LoginForm' import { useApolloClient, useSubscription } from '@apollo/client' import Recommend from './components/Recommended' import { ALL_BOOKS, BOOK_ADDED } from './queries' const updateCache = (cache, query, addedBook) => { const uniqById = a => { let seen = new Set() return a.filter(item => { let k = item.title return seen.has(k) ? false : seen.add(k) }) } cache.updateQuery(query, ({ allBooks }) => { return { allBooks: uniqById(allBooks.concat(addedBook)) } }) } const App = () => { const [token, setToken ] = useState(null) const [errorMessage, setErrorMessage] = useState(null) const client = useApolloClient() const padding = { paddingRight: 5 } useSubscription(BOOK_ADDED, { onData: ({ data }) => { const addedBook = data.data.bookAdded window.alert(`Book Added: ${addedBook.title} by ${addedBook.author.name}`) updateCache(client.cache, { query: ALL_BOOKS }, addedBook) } }) const logout = () => { setToken(null) localStorage.clear() client.resetStore() } const notify = (message) => { setErrorMessage(message) setTimeout(() => { setErrorMessage(null) }, 10000) } const Login = () => { if (token) { return ( <> > ) } else return Login } return (