diff --git a/src/components/authentication/authentication.component.js b/src/components/authentication/authentication.component.js index 1da79b2..9ff76cd 100644 --- a/src/components/authentication/authentication.component.js +++ b/src/components/authentication/authentication.component.js @@ -13,7 +13,7 @@ export default function Authentication({ setAuth, setAuthProvider, isSignedIn, i const [error, setError] = useState(false); useEffect(() => { if (!authProvider) { - initializeAuthProvider(({ id, name, imageUrl }) => setAuth(id, name, imageUrl), setAuthProvider); + initializeAuthProvider(({ id, name, imageUrl }) => setAuth(id, name, imageUrl), setAuth, setAuthProvider); } }, [authProvider, setAuth, setAuthProvider]); if (!isSignedIn) { diff --git a/src/ducks/auth.duck.js b/src/ducks/auth.duck.js index 9080137..ee5b1ca 100644 --- a/src/ducks/auth.duck.js +++ b/src/ducks/auth.duck.js @@ -4,6 +4,7 @@ export const AUTH_UNSET = 'grapher/Auth/UNSET'; const initialState = { signedIn: false, + initialized: false, }; export default function reducer(state = initialState, action) { @@ -19,7 +20,8 @@ export default function reducer(state = initialState, action) { const { id, name, imageUrl } = action.payload; return { ...state, - signedIn: true, + initialized: true, + signedIn: !!id, id, name, imageUrl, @@ -89,3 +91,7 @@ export function getAuthProvider(state) { export function getId(state) { return authSelector(state).id; } + +export function isInitialized(state) { + return authSelector(state).initialized; +} diff --git a/src/scenes/welcome/welcome.component.js b/src/scenes/welcome/welcome.component.js index 0eb23cb..6e521a0 100644 --- a/src/scenes/welcome/welcome.component.js +++ b/src/scenes/welcome/welcome.component.js @@ -1,4 +1,4 @@ -import React, { forwardRef, useEffect } from 'react'; +import React, { forwardRef } from 'react'; import { Link as RouterLink } from 'react-router-dom'; import AppBar from '@material-ui/core/AppBar'; @@ -15,6 +15,7 @@ import { withStyles, useTheme } from '@material-ui/core/styles'; import useMediaQuery from '@material-ui/core/useMediaQuery'; import GitHubIcon from '@material-ui/icons/GitHub'; import Zoom from '@material-ui/core/Zoom'; +import Skeleton from '@material-ui/lab/Skeleton'; import NewGraphDialog from './new-graph'; import GraphCard from './graph-card'; @@ -53,13 +54,54 @@ const styles = (theme) => ({ }, }); -function Welcome({ openNewGraph, openGraph, graphNames, openImportGraph, readNames, classes }) { +function GridListWrapper({ className, children }) { const theme = useTheme(); const bigScreen = useMediaQuery(theme.breakpoints.up('md')); - useEffect(() => { - readNames(); - }, [readNames]); + return ( + + {children} + + ); +} + +function SkeletonGraphs({ show, className }) { + if (!show) { + return null; + } + return ( + + {new Array(5).fill(undefined).map((_, index) => ( + + + + ))} + + ); +} + +function GraphCards({ show, graphNames, openNewGraph, openGraph, className }) { + if (!show) { + return null; + } + return ( + + {graphNames.map(([graphId, graphName], index) => ( + + + openGraph(graphId)} /> + + + ))} + + + + + + + ); +} +function Welcome({ openNewGraph, openGraph, graphNames, openImportGraph, isAuthInitialized, classes }) { return ( <> @@ -89,20 +131,14 @@ function Welcome({ openNewGraph, openGraph, graphNames, openImportGraph, readNam Import graph - - {graphNames.map(([graphId, graphName], index) => ( - - - openGraph(graphId)} /> - - - ))} - - - - - - + + diff --git a/src/scenes/welcome/welcome.container.js b/src/scenes/welcome/welcome.container.js index 13f0bfd..46ffa4b 100644 --- a/src/scenes/welcome/welcome.container.js +++ b/src/scenes/welcome/welcome.container.js @@ -2,12 +2,14 @@ import { connect } from 'react-redux'; import Welcome from './welcome.component'; import { openDialog, DIALOG_IDS } from '../../ducks/dialog.duck'; -import { getGraphNamesAsArray, readNames } from './welcome.duck'; +import { getGraphNamesAsArray } from './welcome.duck'; import { openGraph } from '../../ducks/navigation.duck'; +import { isInitialized } from '../../ducks/auth.duck'; function mapStateToProps(state) { return { graphNames: getGraphNamesAsArray(state), + isAuthInitialized: isInitialized(state), }; } @@ -16,7 +18,6 @@ function mapDispatchToProps(dispatch) { openNewGraph: () => dispatch(openDialog(DIALOG_IDS.NEW_GRAPH)), openGraph: (graphId) => dispatch(openGraph(graphId)), openImportGraph: () => dispatch(openDialog(DIALOG_IDS.IMPORT_GRAPH)), - readNames: () => dispatch(readNames()), }; } diff --git a/src/services/google-auth.js b/src/services/google-auth.js index d248d0b..f75d0a4 100644 --- a/src/services/google-auth.js +++ b/src/services/google-auth.js @@ -14,7 +14,7 @@ function getUserData(user) { }; } -export function initializeAuthProvider(onUserLoggedIn, setAuthProvider) { +export function initializeAuthProvider(onUserLoggedIn, onUserNotLoggedIn, setAuthProvider) { const authProvider = new firebase.auth.GoogleAuthProvider(); authProvider.addScope('https://www.googleapis.com/auth/firebase.database'); setAuthProvider(authProvider); @@ -22,6 +22,8 @@ export function initializeAuthProvider(onUserLoggedIn, setAuthProvider) { onAuthStateChangedUnsubscribe = firebase.auth().onAuthStateChanged((currentUser) => { if (!!currentUser) { onUserLoggedIn(getUserData(currentUser)); + } else { + onUserNotLoggedIn(); } }); }