#electron-vite firebase onAuthStateChanged
3 messages · Page 1 of 1 (latest)
import { Navigate, Outlet } from "react-router-dom";
import { useAuth } from "../provider/AuthProvider";
const PrivateRoutes = () => {
const { user } = useAuth();
if (!user) {
return <Navigate to="/login" />
}
return <Outlet/>
};
export default PrivateRoutes;
import { onAuthStateChanged, User } from "firebase/auth";
import { createContext, ReactNode, useContext, useEffect, useState } from "react";
import { auth } from "../firebase";
import storage from "electron-json-storage";
import { useNavigate } from "react-router-dom";
interface Type { user: User | null, loading: boolean }
const AuthContext = createContext<Type>({ user: null, loading: true });
function useAuth() {
return useContext(AuthContext);
}
const AuthProvider = ({ children }: { children: ReactNode }) => {
const [user, setUser] = useState<User | null>(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
const navigate = useNavigate();
const subscriber = onAuthStateChanged(auth, (user) => {
if (user) {
setUser(user);
setLoading(false);
storage.set("user", { email: user.email, uid: user.uid }, err => console.log(err))
} else {
setUser(null);
storage.remove("user", (err) => console.log(err));
setLoading(true);
navigate("/login");
}
setLoading(false);
});
return () => subscriber();
}, []);
if (loading) return <a>Loading</a>;
return (
<AuthContext.Provider value={{ user, loading }}>
{children}
</AuthContext.Provider>
);
};
export { useAuth, AuthProvider }