import { useState } from "react"; import { supabase } from "@/integrations/supabase/client"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { toast } from "sonner"; import { z } from "zod"; import { Sparkles, Eye, EyeOff } from "lucide-react"; const emailSchema = z.string().email("Invalid email address"); const passwordSchema = z.string().min(8, "Password must be at least 8 characters"); interface AuthFormProps { onSuccess: () => void; } export function AuthForm({ onSuccess }: AuthFormProps) { const [loading, setLoading] = useState(false); const [showPassword, setShowPassword] = useState(false); // Sign In State const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); // Sign Up State const [signUpEmail, setSignUpEmail] = useState(""); const [signUpPassword, setSignUpPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); const [binanceApiKey, setBinanceApiKey] = useState(""); const [binanceApiSecret, setBinanceApiSecret] = useState(""); const [showApiSecret, setShowApiSecret] = useState(false); const handleSignUp = async (e: React.FormEvent) => { e.preventDefault(); try { emailSchema.parse(signUpEmail); passwordSchema.parse(signUpPassword); if (signUpPassword !== confirmPassword) { toast.error("Passwords do not match"); return; } setLoading(true); const { data: authData, error: authError } = await supabase.auth.signUp({ email: signUpEmail, password: signUpPassword, options: { emailRedirectTo: `${window.location.origin}/`, } }); if (authError) throw authError; if (!authData.user) throw new Error("Failed to create account"); const { data: sessionData, error: sessionError } = await supabase.functions.invoke('create-aureon-session', { body: { userId: authData.user.id, apiKey: binanceApiKey || null, apiSecret: binanceApiSecret || null, }, }); if (sessionError || !sessionData?.success) { throw new Error(sessionError?.message || sessionData?.error || 'Session creation failed'); } toast.success("Account created! Welcome."); onSuccess(); } catch (error) { if (error instanceof z.ZodError) { toast.error(error.errors[0].message); } else if (error instanceof Error) { toast.error(error.message); } } finally { setLoading(false); } }; const handleSignIn = async (e: React.FormEvent) => { e.preventDefault(); try { emailSchema.parse(email); passwordSchema.parse(password); setLoading(true); const { error } = await supabase.auth.signInWithPassword({ email, password }); if (error) throw error; toast.success("Welcome back!"); onSuccess(); } catch (error) { if (error instanceof z.ZodError) { toast.error(error.errors[0].message); } else if (error instanceof Error) { toast.error(error.message); } } finally { setLoading(false); } }; return (
AUREON Sign in to access trade feeds
Sign In Sign Up
setEmail(e.target.value)} required />
setPassword(e.target.value)} required />
setSignUpEmail(e.target.value)} required />
setSignUpPassword(e.target.value)} required />
setConfirmPassword(e.target.value)} required className={confirmPassword && signUpPassword !== confirmPassword ? "border-destructive" : ""} /> {confirmPassword && signUpPassword !== confirmPassword && (

Passwords do not match

)}

Binance API (optional - add later in Settings)

setBinanceApiKey(e.target.value)} />
setBinanceApiSecret(e.target.value)} />
); }