'use client'; import React, { useState } from 'react'; import { createClient } from '@/lib/supabase/client'; import { LogIn, UserPlus, Mail, Lock, Loader2, AlertCircle, User, AtSign } from 'lucide-react'; export default function AuthForm() { const supabase = createClient(); const [isLogin, setIsLogin] = useState(true); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [username, setUsername] = useState(''); const [fullName, setFullName] = useState(''); const [rememberMe, setRememberMe] = useState(true); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [message, setMessage] = useState(null); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setLoading(true); setError(null); setMessage(null); try { if (isLogin) { // Set session persistence based on remember-me const { error } = await supabase.auth.signInWithPassword({ email, password, }); if (error) throw error; // If remember-me is checked, session will persist (default Supabase behavior) if (!rememberMe) { sessionStorage.setItem('dramlog_session_only', 'true'); } else { sessionStorage.removeItem('dramlog_session_only'); } } else { // Validate username if (!username.trim()) { throw new Error('Bitte gib einen Benutzernamen ein.'); } if (username.length < 3) { throw new Error('Benutzername muss mindestens 3 Zeichen haben.'); } if (!/^[a-zA-Z0-9_]+$/.test(username)) { throw new Error('Benutzername darf nur Buchstaben, Zahlen und Unterstriche enthalten.'); } // Check if username is already taken const { data: existingUser } = await supabase .from('profiles') .select('id') .eq('username', username.toLowerCase()) .single(); if (existingUser) { throw new Error('Dieser Benutzername ist bereits vergeben.'); } // Create user with metadata const { data: signUpData, error } = await supabase.auth.signUp({ email, password, options: { emailRedirectTo: `${window.location.origin}/auth/callback`, data: { username: username.toLowerCase(), full_name: fullName.trim() || undefined, } } }); if (error) throw error; // After successful signup, create subscription with starter plan if (signUpData.user) { // Get starter plan ID const { data: starterPlan } = await supabase .from('subscription_plans') .select('id') .eq('name', 'starter') .single(); if (starterPlan) { await supabase .from('user_subscriptions') .upsert({ user_id: signUpData.user.id, plan_id: starterPlan.id, }, { onConflict: 'user_id' }); } } setMessage('Checke deine E-Mails, um dein Konto zu bestätigen!'); } } catch (err) { setError(err instanceof Error ? err.message : 'Ein Fehler ist aufgetreten'); } finally { setLoading(false); } }; return (
{isLogin ? : }

{isLogin ? 'Willkommen zurück' : 'Vault erstellen'}

{isLogin ? 'Logge dich ein, um auf deine Sammlung zuzugreifen.' : 'Starte heute mit deinem digitalen Whisky-Vault.'}

{/* Registration-only fields */} {!isLogin && ( <>
setUsername(e.target.value.toLowerCase().replace(/[^a-z0-9_]/g, ''))} placeholder="dein_username" required maxLength={20} className="w-full pl-10 pr-4 py-3 bg-zinc-950 border border-zinc-800 rounded-xl focus:ring-1 focus:ring-orange-600 focus:border-transparent outline-none transition-all text-white placeholder:text-zinc-600" />

Nur Kleinbuchstaben, Zahlen und _

setFullName(e.target.value)} placeholder="Max Mustermann" maxLength={50} className="w-full pl-10 pr-4 py-3 bg-zinc-950 border border-zinc-800 rounded-xl focus:ring-1 focus:ring-orange-600 focus:border-transparent outline-none transition-all text-white placeholder:text-zinc-600" />
)}
setEmail(e.target.value)} placeholder="name@beispiel.de" required className="w-full pl-10 pr-4 py-3 bg-zinc-950 border border-zinc-800 rounded-xl focus:ring-1 focus:ring-orange-600 focus:border-transparent outline-none transition-all text-white placeholder:text-zinc-600" />
setPassword(e.target.value)} placeholder="••••••••" required className="w-full pl-10 pr-4 py-3 bg-zinc-950 border border-zinc-800 rounded-xl focus:ring-1 focus:ring-orange-600 focus:border-transparent outline-none transition-all text-white placeholder:text-zinc-600" />
{/* Remember Me Checkbox - only show for login */} {isLogin && (