From 2b1bd46268ea1ba8c66662abeec43b59a51b6df8 Mon Sep 17 00:00:00 2001 From: Ruidy Nemausat Date: Wed, 13 May 2020 17:57:24 +0200 Subject: [PATCH] connect App to firebase auth; display splash screen while loading auth state --- src/App.tsx | 27 ++++++++++++++++++++++----- src/components/NavBar.tsx | 13 +++++++------ src/services/firebase/index.ts | 19 +++++++++++++++++++ src/store/auth/index.ts | 9 ++++----- src/store/firebase/config.ts | 17 +++++++++++++++++ src/store/firebase/index.ts | 34 +++------------------------------- src/store/index.ts | 7 +++++-- 7 files changed, 77 insertions(+), 49 deletions(-) create mode 100644 src/services/firebase/index.ts create mode 100644 src/store/firebase/config.ts diff --git a/src/App.tsx b/src/App.tsx index 772ef55..1b03e2d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -4,11 +4,12 @@ import {BrowserRouter} from 'react-router-dom'; import Router from './router/Router'; import NavBar from './components/NavBar'; // Redux -import {Provider} from 'react-redux'; +import {Provider, useSelector} from 'react-redux'; import store from './store'; // Firebase -import {ReactReduxFirebaseProvider} from 'react-redux-firebase'; -import rrfProps from './store/firebase'; +import {ReactReduxFirebaseProvider, isLoaded} from 'react-redux-firebase'; +import rrfProps from './store/firebase/config'; +import {selectAuthState} from './store/firebase'; /** * Main App container @@ -20,12 +21,28 @@ const App: FC = () => { - - + ); }; +/** + * Display a loading screen while fetching authentication state + */ +const AuthApp: FC = () => { + const auth = useSelector(selectAuthState); + if (!isLoaded(auth)) { + // TODO: insert Splash Screen here + return
Loading...
; + } + return ( + <> + + + + ); +}; + export default App; diff --git a/src/components/NavBar.tsx b/src/components/NavBar.tsx index a57f2c1..09122e9 100644 --- a/src/components/NavBar.tsx +++ b/src/components/NavBar.tsx @@ -3,20 +3,20 @@ import React, {FC} from 'react'; import {Link} from 'react-router-dom'; import * as ROUTES from '../constants/routes'; //Redux -import {connect} from 'react-redux'; -import {selectAuthState} from '../store/auth'; +// import {connect} from 'react-redux'; +// import {selectAuthState} from '../store/auth'; // Style import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import {faCode, faSignOutAlt, faUser} from '@fortawesome/free-solid-svg-icons'; interface IProps { - isAuthenticated: boolean; - loading: boolean; + isAuthenticated?: boolean; + loading?: boolean; } /** * Main Navbar serves navigation routes. */ -const NavBar: FC = ({isAuthenticated, loading}) => { +const NavBar: FC = ({isAuthenticated = true, loading = false}) => { const publicLinks = (
  • @@ -80,4 +80,5 @@ const NavBar: FC = ({isAuthenticated, loading}) => { }; /** connect HOC subscribes to the store */ -export default connect(selectAuthState)(NavBar); +export default NavBar; +//connect(selectAuthState)(NavBar); diff --git a/src/services/firebase/index.ts b/src/services/firebase/index.ts new file mode 100644 index 0000000..92faed9 --- /dev/null +++ b/src/services/firebase/index.ts @@ -0,0 +1,19 @@ +//Firebase +import firebase from 'firebase/app'; +import 'firebase/auth'; + +const CONFIG = { + apiKey: process.env.REACT_APP_API_KEY, + authDomain: process.env.REACT_APP_AUTH_DOMAIN, + databaseURL: process.env.REACT_APP_DB_URL, + projectId: process.env.REACT_APP_PROJECT_ID, + storageBucket: process.env.REACT_APP_STORAGE_BUCKET, + messagingSenderId: process.env.REACT_APP_MSG_SENDER_ID, + appId: process.env.REACT_APP_APP_ID, + measurementId: process.env.REACT_APP_MEASUREMENT_ID, +}; + +// initialize firebase +firebase.initializeApp(CONFIG); + +export default firebase; diff --git a/src/store/auth/index.ts b/src/store/auth/index.ts index a3899a5..fac40f3 100644 --- a/src/store/auth/index.ts +++ b/src/store/auth/index.ts @@ -1,6 +1,5 @@ // Redux import {createSlice} from '@reduxjs/toolkit'; -import {RootState} from '..'; // Typing import User from '../../models/User'; @@ -28,10 +27,10 @@ const authSlice = createSlice({ export const {} = authSlice.actions; // export selectors -export const selectAuthState = (state: RootState) => { - const {isAuthenticated, loading} = state.auth; - return {isAuthenticated, loading}; -}; +// export const selectAuthState = (state: RootState) => { +// const {isAuthenticated, loading} = state.auth; +// return {isAuthenticated, loading}; +// }; // export reducer export default authSlice.reducer; diff --git a/src/store/firebase/config.ts b/src/store/firebase/config.ts new file mode 100644 index 0000000..fca91e3 --- /dev/null +++ b/src/store/firebase/config.ts @@ -0,0 +1,17 @@ +// Redux +import store from '..'; +// Firebase +import firebase from '../../services/firebase'; + +// react-redux-firebase config +const RRF_CONFIG = { + // userProfile: 'users' +}; +// object required by RRFProvider +const rrfProps = { + firebase, + config: RRF_CONFIG, + dispatch: store.dispatch, +}; + +export default rrfProps; diff --git a/src/store/firebase/index.ts b/src/store/firebase/index.ts index 917835f..be41505 100644 --- a/src/store/firebase/index.ts +++ b/src/store/firebase/index.ts @@ -1,32 +1,4 @@ -//Firebase -import firebase from 'firebase/app'; -import 'firebase/auth'; -// Redux -import store from '..'; +import {RootState} from '..'; -const CONFIG = { - apiKey: process.env.REACT_APP_API_KEY, - authDomain: process.env.REACT_APP_AUTH_DOMAIN, - databaseURL: process.env.REACT_APP_DB_URL, - projectId: process.env.REACT_APP_PROJECT_ID, - storageBucket: process.env.REACT_APP_STORAGE_BUCKET, - messagingSenderId: process.env.REACT_APP_MSG_SENDER_ID, - appId: process.env.REACT_APP_APP_ID, - measurementId: process.env.REACT_APP_MEASUREMENT_ID, -}; - -// initialize firebase -firebase.initializeApp(CONFIG); - -// react-redux-firebase config -const RRF_CONFIG = { - // userProfile: 'users' -}; -// object required by RRFProvider -const rrfProps = { - firebase, - config: RRF_CONFIG, - dispatch: store.dispatch, -}; - -export default rrfProps; +/** export firebase authentication */ +export const selectAuthState = (state: RootState) => state.firebase.auth; diff --git a/src/store/index.ts b/src/store/index.ts index f7b540b..fd63d42 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -2,7 +2,7 @@ import {configureStore} from '@reduxjs/toolkit'; import authReducer from './auth/'; // Firebase -import {firebaseReducer} from 'react-redux-firebase'; +import {firebaseReducer, FirebaseReducer} from 'react-redux-firebase'; const store = configureStore({ reducer: { @@ -12,6 +12,9 @@ const store = configureStore({ }); // State type -export type RootState = ReturnType; +export interface RootState { + firebase: FirebaseReducer.Reducer; +} +// export type RootState = ReturnType; export default store;