'use client'; import { useState } from 'react'; import { useRouter } from 'next/navigation'; import { toast } from 'sonner'; import { Loader2 } from 'lucide-react'; import api from '@/lib/api'; import { useAuthStore } from '@/lib/auth-store'; export default function LoginPage() { const router = useRouter(); const setAuth = useAuthStore((s) => s.setAuth); const [loading, setLoading] = useState(false); const [form, setForm] = useState({ tenantSlug: '', email: '', password: '' }); const [errors, setErrors] = useState>({}); const validate = () => { const e: Record = {}; if (!form.tenantSlug) e.tenantSlug = 'Required'; if (!form.email || !/\S+@\S+\.\S+/.test(form.email)) e.email = 'Valid email required'; if (!form.password || form.password.length < 6) e.password = 'Min 6 characters'; setErrors(e); return Object.keys(e).length === 0; }; const onSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validate()) return; setLoading(true); try { const res = await api.post('/api/v1/auth/login', form); const { accessToken, user } = res.data; setAuth({ accessToken, tenantSlug: form.tenantSlug, user }); toast.success(`Welcome back, ${user.firstName}!`); router.push('/dashboard'); } catch (err: any) { toast.error(err.response?.data?.message || 'Login failed. Check your credentials.'); } finally { setLoading(false); } }; const field = (key: keyof typeof form) => ({ value: form[key], onChange: (e: React.ChangeEvent) => setForm(f => ({ ...f, [key]: e.target.value })), }); const inputClass = (key: string) => `w-full border rounded-lg px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 ${errors[key] ? 'border-red-400' : 'border-gray-300'}`; return (
{/* Logo */}
F

FiberOps

ISP Management Platform

Sign in to your account

{errors.tenantSlug &&

{errors.tenantSlug}

}
{errors.email &&

{errors.email}

}
{errors.password &&

{errors.password}

}
); }