import { useState } from 'react' import { z } from 'zod' import { useForm } from 'react-hook-form' import { zodResolver } from '@hookform/resolvers/zod' import { Link, useNavigate } from '@tanstack/react-router' import { Loader2, LogIn } from 'lucide-react' import { toast } from 'sonner' import { useAuthStore } from '@/stores/auth-store' import { cn } from '@/lib/utils' import { Button } from '@/components/ui/button' import { supabase } from '@/lib/supabase' import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@/components/ui/form' import { Input } from '@/components/ui/input' import { PasswordInput } from '@/components/password-input' const formSchema = z.object({ email: z.email({ error: (iss) => (iss.input === '' ? 'Please enter your email' : undefined), }), password: z .string() .min(1, 'Please enter your password') .min(7, 'Password must be at least 7 characters long'), }) interface UserAuthFormProps extends React.HTMLAttributes { redirectTo?: string } export function UserAuthForm({ className, redirectTo, ...props }: UserAuthFormProps) { const [isLoading, setIsLoading] = useState(false) const navigate = useNavigate() const { auth } = useAuthStore() const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { email: '', password: '', }, }) async function onSubmit(data: z.infer) { setIsLoading(true) try { const { data: authData, error } = await supabase.auth.signInWithPassword({ email: data.email, password: data.password, }) if (error) throw error if (authData.session && authData.user) { setIsLoading(false) const user = { accountNo: authData.user.id, email: authData.user.email || '', role: ['admin'], exp: authData.session.expires_at ? authData.session.expires_at * 1000 : Date.now() + 24 * 60 * 60 * 1000, } auth.setUser(user) auth.setAccessToken(authData.session.access_token) const targetPath = redirectTo || '/' navigate({ to: targetPath, replace: true }) toast.success(`Welcome back, ${user.email}!`) } } catch (error: any) { setIsLoading(false) toast.error(error.message || 'Login failed') } } return (
( 邮箱 )} /> ( 密码 忘记密码? )} />
或使用以下方式
{/*
*/} ) }