auth provider
in folder Routes create file AuthProvider.jsx
dont forget to install the store for storage
npm install store
import { useToast } from "@chakra-ui/react";
import { createUserWithEmailAndPassword, getAuth, onAuthStateChanged, signInWithEmailAndPassword } from "firebase/auth";
import { arrayUnion, doc, getDoc, updateDoc } from "firebase/firestore";
import { useState, useEffect } from "react";
import { useNavigate } from "react-router-dom";
import { auth, db, fetchToken } from "../Configs/firebase";
import AuthContext from "./hooks/AuthContext";
import store from "store";
export const AuthProvider = ({ children }) => {
const [currentUser, setCurrentUser] = useState();
const [subscriptionUser, setSubscriptionUser] = useState();
const [tokenId, setTokenId] = useState("");
const [loading, setLoading] = useState(true);
const navigate = useNavigate();
const toast = useToast();
const login = (email, password) => {
return signInWithEmailAndPassword(auth, email, password)
.then(async (response) => {
try {
const docRef = doc(db, "users", response.user.uid);
const docSnap = await getDoc(docRef);
if (docSnap.exists()) {
store.set("user_data", docSnap.data());
await updateDoc(docRef, { tokenId: arrayUnion(tokenId) });
// console.log('test')
} else {
console.log("No such document!");
}
} catch (error) {
console.log(error, "ini error");
}
toast({
title: "Success Login",
description: `Success Login account ${response.user.displayName} `,
status: "success",
duration: 10000,
isClosable: true,
position: "top-right",
});
return navigate("/");
})
.catch((error) => {
toast({
title: "Something wrong !",
description: error.message,
status: "error",
duration: 10000,
isClosable: true,
position: "top-right",
});
});
};
const signOut = () => {
return auth.signOut();
};
//this option for subscription file db context
const getSubscription = async () => {
try {
const docRef = doc(db, "users", currentUser.uid);
const docSnap = await getDoc(docRef);
if (docSnap.exists()) {
setSubscriptionUser(docSnap.data());
} else {
console.log("No such document!");
}
} catch (error) {
console.log(error, "ini error");
}
return subscriptionUser;
};
//this option for storage context
const getUserStorage = () => {
return store.get("user_data");
};
const signUp = (email, password) => {
return createUserWithEmailAndPassword(auth, email, password);
};
//this option for get auth uid in firebase
const getUser = () => {
return auth.currentUser;
};
useEffect(() => {
onAuthStateChanged(auth, (user) => {
setCurrentUser(user);
setLoading(false);
});
}, []);
const value = {
currentUser,
tokenId,
getUser,
login,
signOut,
signUp,
getSubscription,
getUserStorage,
};
return <AuthContext.Provider value={value}>{!loading && children}</AuthContext.Provider>;
};
and then you must set in index.js
import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
import { BrowserRouter } from "react-router-dom";
import { ChakraProvider, extendTheme } from "@chakra-ui/react";
import { AuthProvider } from "./Routes/AuthProvider";
//this option for token messaging
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('../firebase-messaging-sw.js')
.then(function (registration) {
// Successful registration
console.log('Hooray. Registration successful, scope is:', registration.scope);
}).catch(function (error) {
// Failed registration, service worker won’t be installed
console.log('Whoops. Service worker registration failed, error:', error);
});
});
}
const themes = extendTheme({
config:{
initialColorMode: 'dark',
useSystemColorMode: false,
},
shadows: {
purple: '0 0 0 3px rgba(159, 122, 234, 0.6)'
},
colors: {
brand: {
100: "#ffd600",
900: "#1a202c",
},
},
});
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<BrowserRouter>
<ChakraProvider>
<AuthProvider>
<App />
</AuthProvider>
</ChakraProvider>
</BrowserRouter>
);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
Last updated
Was this helpful?