Untitled
unknown
plain_text
a year ago
2.5 kB
4
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