Spaces:
Paused
Paused
| import { | |
| signInWithEmailAndPassword, | |
| signInWithPopup, | |
| createUserWithEmailAndPassword, | |
| signOut as firebaseSignOut, | |
| onAuthStateChanged | |
| } from 'firebase/auth' | |
| import { auth, googleProvider } from './firebase' | |
| import { toast } from 'sonner' | |
| export const signInWithEmail = async (email: string, password: string) => { | |
| try { | |
| const result = await signInWithEmailAndPassword(auth, email, password) | |
| // Call API to store/update user in database | |
| await fetch('/api/auth/sync-user', { | |
| method: 'POST', | |
| headers: { 'Content-Type': 'application/json' }, | |
| body: JSON.stringify({ | |
| uid: result.user.uid, | |
| email: result.user.email, | |
| displayName: result.user.displayName, | |
| photoURL: result.user.photoURL, | |
| provider: 'email' | |
| }) | |
| }) | |
| toast.success("Login successful!", { | |
| description: "Welcome back!", | |
| position: "top-right" | |
| }) | |
| return { user: result.user, error: null } | |
| } catch (error: any) { | |
| toast.error("Login failed", { | |
| description: error.message, | |
| position: "top-right" | |
| }) | |
| return { user: null, error: error.message } | |
| } | |
| } | |
| export const signInWithGoogle = async () => { | |
| try { | |
| const result = await signInWithPopup(auth, googleProvider) | |
| // Call API to store/update user in database | |
| await fetch('/api/auth/sync-user', { | |
| method: 'POST', | |
| headers: { 'Content-Type': 'application/json' }, | |
| body: JSON.stringify({ | |
| uid: result.user.uid, | |
| email: result.user.email, | |
| displayName: result.user.displayName, | |
| photoURL: result.user.photoURL, | |
| provider: 'google' | |
| }) | |
| }) | |
| toast.success("Login successful!", { | |
| description: "Welcome back!", | |
| position: "top-right" | |
| }) | |
| return { user: result.user, error: null } | |
| } catch (error: any) { | |
| toast.error("Login failed", { | |
| description: error.message, | |
| position: "top-right" | |
| }) | |
| return { user: null, error: error.message } | |
| } | |
| } | |
| export const signUpWithEmail = async (email: string, password: string) => { | |
| try { | |
| const result = await createUserWithEmailAndPassword(auth, email, password) | |
| // Call API to store user in database | |
| await fetch('/api/auth/sync-user', { | |
| method: 'POST', | |
| headers: { 'Content-Type': 'application/json' }, | |
| body: JSON.stringify({ | |
| uid: result.user.uid, | |
| email: result.user.email, | |
| displayName: result.user.displayName, | |
| photoURL: result.user.photoURL, | |
| provider: 'email' | |
| }) | |
| }) | |
| toast.success("Account created successfully!", { | |
| description: "Welcome! Please verify your email.", | |
| position: "top-right" | |
| }) | |
| return { user: result.user, error: null } | |
| } catch (error: any) { | |
| toast.error("Signup failed", { | |
| description: error.message, | |
| position: "top-right" | |
| }) | |
| return { user: null, error: error.message } | |
| } | |
| } | |
| export const signOut = async () => { | |
| // Show loading toast | |
| toast.loading("Signing out...", { | |
| id: "logout-toast", | |
| position: "top-right" | |
| }) | |
| return new Promise((resolve) => { | |
| setTimeout(async () => { | |
| try { | |
| await firebaseSignOut(auth) | |
| toast.success("Logged out successfully", { | |
| id: "logout-toast", | |
| position: "top-right" | |
| }) | |
| resolve({ error: null }) | |
| } catch (error: any) { | |
| toast.error("Logout failed", { | |
| id: "logout-toast", | |
| description: error.message, | |
| position: "top-right" | |
| }) | |
| resolve({ error: error.message }) | |
| } | |
| }, 1500) // 1.5 second delay to show the loading toast | |
| }) | |
| } | |
| export const onAuthStateChange = (callback: (user: any) => void) => { | |
| return onAuthStateChanged(auth, callback) | |
| } | |