import React, { createContext, useContext, useEffect, useState } from "react";
import {
createUserWithEmailAndPassword,
signInWithEmailAndPassword,
signOut,
onAuthStateChanged,
} from "firebase/auth";
import { auth, firestore } from "../firebase";
import { createUserDocument } from "../firebase";
import { doc, getDoc } from "firebase/firestore";
import { getAuth } from "firebase/auth";
import { browserSessionPersistence, setPersistence } from "firebase/auth";
const UserContext = createContext();
export const AuthContextProvider = ({ children }) => {
const [user, setUser] = useState(null);
const createUser = (email, password) => {
return createUserWithEmailAndPassword(auth, email, password);
};
async function getRole(uid) {
const docRef = doc(firestore, "users", uid);
const docSnap = await getDoc(docRef);
if ([Link]()) {
[Link]("Document data:", [Link]());
return [Link]().role;
} else {
// [Link]() will be undefined in this case
[Link]("No such document!");
}
}
const signIn = async ({ email, password }) => {
try {
[Link](email, password);
const result = await signInWithEmailAndPassword(auth, email, password);
const userDocument = await [Link](`users/${[Link]}`).get();
setUser({ ...[Link](), uid: [Link] });
} catch (error) {
[Link]("Error in user provider", error);
}
}
const logout = () => {
[Link]("authUser");
setUser(null);
return signOut(auth);
};
useEffect(() => {
const unsubscribe = [Link]((currentUser) =>
setUser(currentUser || null)
);
return () => unsubscribe();
}, []);
return (
<[Link] value={{ createUser, user, logout, signIn }}>
{children}
</[Link]>
);
};
export const UserAuth = () => {
return useContext(UserContext);
};
// old user provider:
// import React, { Component, createContext } from "react";
// import { createUserDocument } from "../firebase";
// import { onAuthStateChanged } from "firebase/auth";
// import { auth } from "../firebase";
// export const UserContext = createContext({ user: null });
// class UserProvider extends Component {
// state = { user: null, loading: true };
// componentDidMount = async () => {
// try {
// [Link]("UserProvider componentDidMount was called");
// [Link] = onAuthStateChanged(auth, async (user) => {
// [Link]("UserProvider onAuthStateChanged was called");
// [Link]("user:", user);
// if (user) {
// [Link]("UserProvider logging in...")
// [Link]("authUser", [Link](user));
// const userDocument = await createUserDocument(user);
// [Link]("UserProvider userDocument:", userDocument);
// return [Link]({ user: userDocument, loading: false });
// }
// [Link]("UserProvider logging out...")
// [Link]("authUser");
// [Link]("UserProvider logged out");
// [Link]({ user: null });
// });
// } catch (error) {
// [Link]("Error in user provider", error);
// }
// };
// componentWillUnmount = () => {
// [Link]("UserProvider componentWillUnmount was called");
// [Link]();
// };
// render() {
// [Link]("UserProvider render was called");
// const { children } = [Link];
// const { user, loading } = [Link];
// //if (loading) return <div>Loading...</div>;
// return <[Link] value={user}>{children}</[Link]>;
// }
// }
// export default UserProvider;