'use client'; import { zodResolver } from '@hookform/resolvers/zod'; import { Loader2, Lock, Mail } from 'lucide-react'; import { useRouter } from 'next/navigation'; import { useState } from 'react'; import { useForm } from 'react-hook-form'; import * as z from 'zod'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form'; import { Input } from '@/components/ui/input'; import { apiClient } from '@/lib/api-client'; import { useAuthStore } from '@/lib/auth-store'; import { toast } from 'sonner'; const loginSchema = z.object({ email: z.string().email('Please enter a valid email address'), password: z.string().min(6, 'Password must be at least 6 characters long'), }); type LoginFormData = z.infer; export function LoginForm() { const [isLoading, setIsLoading] = useState(false); const { login } = useAuthStore(); const router = useRouter(); const form = useForm({ resolver: zodResolver(loginSchema), defaultValues: { email: '', password: '', }, }); const onSubmit = async (data: LoginFormData) => { setIsLoading(true); try { const response = await apiClient.authenticate(data.email, data.password); const token = response.data.attributes.token; // Set token in API client apiClient.setToken(token); // Set token in auth store useAuthStore.setState({ token }); // Store in auth state login(token, { email: data.email, }); toast.success('Login successful'); router.push('/dashboard'); } catch (error) { if(error instanceof Error) { toast.error(error.message); } else { toast.error('Invalid credentials. Please try again.'); } } finally { setIsLoading(false); } }; return (
Keygen Dashboard Sign in to manage your licensing server
( Email
)} /> ( Password
)} />
); }