From dcdf57f4eed0daca60238af752ad79cf0a1c27cc Mon Sep 17 00:00:00 2001 From: Shams mosowi Date: Tue, 30 Jun 2020 12:55:41 +0800 Subject: [PATCH] favorite tables --- www/src/contexts/appContext.tsx | 51 +++++++++--------- www/src/views/TablesView.tsx | 95 ++++++++++++++++++++++++--------- 2 files changed, 96 insertions(+), 50 deletions(-) diff --git a/www/src/contexts/appContext.tsx b/www/src/contexts/appContext.tsx index 68aa3489..752c62d1 100644 --- a/www/src/contexts/appContext.tsx +++ b/www/src/contexts/appContext.tsx @@ -1,13 +1,16 @@ import React, { useEffect, useState, useContext } from "react"; import { auth, db } from "../firebase"; import firebase from "firebase/app"; +import useDoc from "hooks/useDoc"; interface AppContextInterface { currentUser: firebase.User | null | undefined; + userDoc: any; } export const AppContext = React.createContext({ currentUser: undefined, + userDoc: undefined, }); export const useAppContext = () => useContext(AppContext); @@ -25,23 +28,21 @@ export const AppProvider: React.FC = ({ firebase.User | null | undefined >(); + const [userDoc, dispatchUserDoc] = useDoc({}); useEffect(() => { auth.onAuthStateChanged(auth => { setCurrentUser(auth); }); }, []); - - const getUserTheme = async (currentUser: firebase.User) => { - const userDoc = await db - .collection("_FT_USERS") - .doc(currentUser.uid) - .get(); - if (userDoc.exists) { - const userDocData = userDoc.data(); - if (userDocData && userDocData.theme) { - setTheme(userDocData.theme); - } - } else { + useEffect(() => { + if (userDoc.doc) { + setTheme(userDoc.doc.theme); + } else if ( + !userDoc.doc && + !userDoc.loading && + userDoc.path && + currentUser + ) { const userFields = ["email", "displayName", "photoURL", "phoneNumber"]; const userData = userFields.reduce((acc, curr) => { if (currentUser[curr]) { @@ -49,30 +50,30 @@ export const AppProvider: React.FC = ({ } return acc; }, {}); - db.collection("_FT_USERS") - .doc(currentUser.uid) - .set( - { - user: userData, - theme: { - palette: { - primary: { main: "#ef4747" }, - }, + db.doc(userDoc.path).set( + { + user: userData, + theme: { + palette: { + primary: { main: "#ef4747" }, }, }, - { merge: true } - ); + }, + { merge: true } + ); } - }; + }, [userDoc]); + useEffect(() => { if (currentUser) { - getUserTheme(currentUser); + dispatchUserDoc({ path: `_FT_USERS/${currentUser.uid}` }); } }, [currentUser]); return ( diff --git a/www/src/views/TablesView.tsx b/www/src/views/TablesView.tsx index e1230172..aed60eb9 100644 --- a/www/src/views/TablesView.tsx +++ b/www/src/views/TablesView.tsx @@ -1,27 +1,28 @@ import React from "react"; import _groupBy from "lodash/groupBy"; - +import _find from "lodash/find"; import { createStyles, makeStyles, Container, Grid, Link, - Button, Typography, Divider, + Checkbox, } from "@material-ui/core"; +import Favorite from "@material-ui/icons/Favorite"; +import FavoriteBorder from "@material-ui/icons/FavoriteBorder"; import SecurityIcon from "@material-ui/icons/Security"; - import AppBar from "components/AppBar"; import Loading from "components/Loading"; import EmptyState from "components/EmptyState"; import StyledCard from "components/StyledCard"; import CreateTableDialog from "components/CreateTableDialog"; - import routes from "constants/routes"; import { useFiretableContext } from "contexts/firetableContext"; - +import { useAppContext } from "contexts/appContext"; +import { DocActions } from "hooks/useDoc"; const useStyles = makeStyles(theme => createStyles({ root: { minHeight: "100vh", paddingBottom: theme.spacing(8) }, @@ -70,11 +71,57 @@ const useStyles = makeStyles(theme => const TablesView = () => { const classes = useStyles(); const { sections, createTable, userClaims } = useFiretableContext(); + const { userDoc } = useAppContext(); + const favs = userDoc.state.doc?.favoriteTables + ? userDoc.state.doc.favoriteTables + : []; + + const TableCard = props => { + const { table } = props; + const checked = Boolean(_find(favs, table)); + return ( + + { + userDoc.dispatch({ + action: DocActions.update, + data: { + favoriteTables: checked + ? favs.filter(t => t.collection !== table.collection) + : [...favs, table], + }, + }); + }} + checked={checked} + icon={} + checkedIcon={} + name="checkedH" + /> + } + /> + + ); + }; return (
- {(!userClaims?.roles || userClaims.roles.length === 0) && ( { } /> )} - + {favs.length !== 0 && ( +
+ favorites + + + {favs.map(table => ( + + ))} + +
+ )} {sections ? ( Object.keys(sections).map(sectionName => (
@@ -114,24 +176,7 @@ const TablesView = () => { className={classes.cardGrid} > {sections[sectionName].map(table => ( - - - + ))}