import { useState, useEffect } from 'react'; import { toast } from 'react-toastify'; import { getSupabase } from '~/lib/supabase/client'; import type { AuthError, Session, User, AuthChangeEvent } from '@supabase/supabase-js'; export function ClientAuth() { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); const [showSignIn, setShowSignIn] = useState(false); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [isSigningIn, setIsSigningIn] = useState(false); const [showDropdown, setShowDropdown] = useState(false); const [usageData, setUsageData] = useState<{ peanuts_used: number; peanuts_refunded: number } | null>(null); useEffect(() => { async function getUser() { try { const { data } = await getSupabase().auth.getUser(); setUser(data.user); } catch (error) { console.error('Error fetching user:', error); } finally { setLoading(false); } } getUser(); const { data: { subscription }, } = getSupabase().auth.onAuthStateChange((event: AuthChangeEvent, session: Session | null) => { setUser(session?.user ?? null); }); return () => { subscription.unsubscribe(); }; }, []); useEffect(() => { async function updateUsageData() { try { const { data, error } = await getSupabase() .from('profiles') .select('peanuts_used, peanuts_refunded') .eq('id', user?.id) .single(); if (error) { throw error; } setUsageData(data); } catch (error) { console.error('Error fetching usage data:', error); } } if (showDropdown) { updateUsageData(); } }, [showDropdown]); const handleSignIn = async (e: React.FormEvent) => { e.preventDefault(); setIsSigningIn(true); try { const { error } = await getSupabase().auth.signInWithPassword({ email, password }); if (error) { throw error; } setShowSignIn(false); toast.success('Successfully signed in!'); } catch (error) { const authError = error as AuthError; toast.error(authError.message || 'Failed to sign in'); } finally { setIsSigningIn(false); } }; const handleSignUp = async (e: React.FormEvent) => { e.preventDefault(); setIsSigningIn(true); try { const { error } = await getSupabase().auth.signUp({ email, password }); if (error) { throw error; } toast.success('Check your email for the confirmation link!'); setShowSignIn(false); } catch (error) { const authError = error as AuthError; toast.error(authError.message || 'Failed to sign up'); } finally { setIsSigningIn(false); } }; const handleSignOut = async () => { await getSupabase().auth.signOut(); setShowDropdown(false); toast.success('Signed out successfully'); }; const handleGoogleSignIn = async () => { const { error } = await getSupabase().auth.signInWithOAuth({ provider: 'google', }); console.log('GoogleSignIn', error); }; if (loading) { return
; } // Avatar URLs are disabled due to broken links from CORS issues. const useAvatarURL = false; return ( <> {user ? (
{showDropdown && (
{user.email}
{`Peanuts used: ${usageData?.peanuts_used ?? '...'}`}
{`Peanuts refunded: ${usageData?.peanuts_refunded ?? '...'}`}
)}
) : ( )} {showSignIn && (
setShowSignIn(false)} >
e.stopPropagation()} >

Sign In

setEmail(e.target.value)} className="w-full p-2 border rounded bg-bolt-elements-background-depth-2 text-bolt-elements-textPrimary border-bolt-elements-borderColor" required />
setPassword(e.target.value)} className="w-full p-2 border rounded bg-bolt-elements-background-depth-2 text-bolt-elements-textPrimary border-bolt-elements-borderColor" required />
)} ); }