import React, { createContext, useEffect, useReducer } from 'react'; // third-party import firebase from 'firebase/app'; import 'firebase/auth'; // action - state management import { LOGIN, LOGOUT } from 'store/actions'; import accountReducer from 'store/accountReducer'; // project imports import Loader from 'ui-component/Loader'; import config from 'config'; import { initialLoginContextProps } from 'types'; import { FirebaseContextType } from 'types/auth'; // firebase initialize if (!firebase.apps.length) { firebase.initializeApp(config.firebase); } // const const initialState: initialLoginContextProps = { isLoggedIn: false, isInitialized: false, user: null }; // ==============================|| FIREBASE CONTEXT & PROVIDER ||============================== // const FirebaseContext = createContext(null); export const FirebaseProvider = ({ children }: { children: React.ReactElement }) => { const [state, dispatch] = useReducer(accountReducer, initialState); useEffect( () => firebase.auth().onAuthStateChanged((user) => { if (user) { dispatch({ type: LOGIN, payload: { isLoggedIn: true, user: { id: user.uid, email: user.email!, name: user.displayName || 'Betty' } } }); } else { dispatch({ type: LOGOUT }); } }), // eslint-disable-next-line react-hooks/exhaustive-deps [dispatch] ); const firebaseEmailPasswordSignIn = (email: string, password: string) => firebase.auth().signInWithEmailAndPassword(email, password); const firebaseGoogleSignIn = () => { const provider = new firebase.auth.GoogleAuthProvider(); return firebase.auth().signInWithPopup(provider); }; const firebaseRegister = async (email: string, password: string) => firebase.auth().createUserWithEmailAndPassword(email, password); const logout = () => firebase.auth().signOut(); const resetPassword = async (email: string) => { await firebase.auth().sendPasswordResetEmail(email); }; const updateProfile = () => {}; if (state.isInitialized !== undefined && !state.isInitialized) { return ; } return ( {}, firebaseGoogleSignIn, logout, resetPassword, updateProfile }} > {children} ); }; export default FirebaseContext;