Untitled
unknown
plain_text
2 years ago
2.5 kB
7
Indexable
import React, { useContext, useState, useEffect, ReactNode } from "react";
import { auth } from "../firebase";
interface User {
updateEmail: (email: string) => Promise<void>;
updatePassword: (password: string) => Promise<void>;
}
interface AuthContextType {
currentUser: firebase.User | null | undefined;
login: (email: string, password: string) => Promise<firebase.auth.UserCredential>;
signup: (email: string, password: string) => Promise<firebase.auth.UserCredential>;
logout: () => Promise<void>;
resetPassword: (email: string) => Promise<void>;
updateEmail: (email: string) => Promise<void>;
updatePassword: (password: string) => Promise<void>;
}
const AuthContext = React.createContext<AuthContextType | undefined>(undefined);
export function useAuth(): AuthContextType {
const context = useContext(AuthContext);
if (!context) {
throw new Error("useAuth must be used within an AuthProvider");
}
return context;
}
interface AuthProviderProps {
children: ReactNode;
}
export function AuthProvider({ children }: AuthProviderProps): JSX.Element {
const [currentUser, setCurrentUser] = useState<firebase.User | null | undefined>();
const [loading, setLoading] = useState(true);
function signup(email: string, password: string): Promise<firebase.auth.UserCredential> {
return auth.createUserWithEmailAndPassword(email, password);
}
function login(email: string, password: string): Promise<firebase.auth.UserCredential> {
return auth.signInWithEmailAndPassword(email, password);
}
function logout(): Promise<void> {
return auth.signOut();
}
function resetPassword(email: string): Promise<void> {
return auth.sendPasswordResetEmail(email);
}
function updateEmail(email: string): Promise<void> {
if (!currentUser) {
throw new Error("Current user not available");
}
return currentUser.updateEmail(email);
}
function updatePassword(password: string): Promise<void> {
if (!currentUser) {
throw new Error("Current user not available");
}
return currentUser.updatePassword(password);
}
useEffect(() => {
const unsubscribe = auth.onAuthStateChanged(user => {
setCurrentUser(user);
setLoading(false);
});
return unsubscribe;
}, []);
const value: AuthContextType = {
currentUser,
login,
signup,
logout,
resetPassword,
updateEmail,
updatePassword,
};
return (
<AuthContext.Provider value={value}>
{!loading && children}
</AuthContext.Provider>
);
}
Editor is loading...
Leave a Comment