boxy/app/context/AuthContext.tsx
2025-06-23 01:25:35 +05:30

105 lines
2.3 KiB
TypeScript

'use client';
import { createContext, useContext, useEffect, useState } from 'react';
import {
User,
signInWithEmailAndPassword,
createUserWithEmailAndPassword,
signOut,
onAuthStateChanged,
GoogleAuthProvider,
signInWithPopup,
sendPasswordResetEmail,
} from 'firebase/auth';
import { auth } from '../lib/firebase';
interface AuthContextType {
user: User | null;
loading: boolean;
signIn: (email: string, password: string) => Promise<void>;
signUp: (email: string, password: string) => Promise<void>;
signInWithGoogle: () => Promise<void>;
logout: () => Promise<void>;
resetPassword: (email: string) => Promise<void>;
}
const AuthContext = createContext<AuthContextType>({} as AuthContextType);
export function AuthProvider({ children }: { children: React.ReactNode }) {
const [user, setUser] = useState<User | null>(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
const unsubscribe = onAuthStateChanged(auth, (user) => {
setUser(user);
setLoading(false);
});
return () => unsubscribe();
}, []);
const signIn = async (email: string, password: string) => {
try {
await signInWithEmailAndPassword(auth, email, password);
} catch (error) {
throw error;
}
};
const signUp = async (email: string, password: string) => {
try {
await createUserWithEmailAndPassword(auth, email, password);
} catch (error) {
throw error;
}
};
const signInWithGoogle = async () => {
try {
const provider = new GoogleAuthProvider();
await signInWithPopup(auth, provider);
} catch (error) {
throw error;
}
};
const logout = async () => {
try {
await signOut(auth);
} catch (error) {
throw error;
}
};
const resetPassword = async (email: string) => {
try {
await sendPasswordResetEmail(auth, email);
} catch (error) {
throw error;
}
};
const value = {
user,
loading,
signIn,
signUp,
signInWithGoogle,
logout,
resetPassword,
};
return (
<AuthContext.Provider value={value}>
{!loading && children}
</AuthContext.Provider>
);
}
export const useAuth = () => {
const context = useContext(AuthContext);
if (!context) {
throw new Error('useAuth must be used within an AuthProvider');
}
return context;
};