'use client'; import { useState } from 'react'; import { useRouter } from 'next/navigation'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { toast } from 'sonner'; import { api } from '@/lib/api'; import { useAuthStore } from '@/lib/auth-store'; 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 { Loader2 } from 'lucide-react'; const loginSchema = z.object({ tenantSlug: z.string().min(1, 'Tenant slug is required'), email: z.string().email('Invalid email address'), password: z.string().min(6, 'Password must be at least 6 characters'), }); type LoginForm = z.infer; export default function LoginPage() { const router = useRouter(); const setAuth = useAuthStore((s) => s.setAuth); const [loading, setLoading] = useState(false); const { register, handleSubmit, formState: { errors }, } = useForm({ resolver: zodResolver(loginSchema), }); const onSubmit = async (data: LoginForm) => { setLoading(true); try { const res = await api.post('/api/v1/auth/login', data); const { accessToken, user } = res.data; setAuth({ accessToken, tenantSlug: data.tenantSlug, user }); toast.success('Welcome back, ' + user.firstName + '!'); router.push('/dashboard'); } catch (err: unknown) { const error = err as { response?: { data?: { message?: string } } }; toast.error(error.response?.data?.message || 'Login failed. Check your credentials.'); } finally { setLoading(false); } }; return (
{/* Logo */}
F

FiberOps

ISP Management Platform

Sign in to your account Enter your tenant and credentials to continue
{errors.tenantSlug && (

{errors.tenantSlug.message}

)}
{errors.email && (

{errors.email.message}

)}
{errors.password && (

{errors.password.message}

)}
); }