import { useState, useEffect } from 'react'; import { useSubmit, useNavigation, useActionData, useNavigate, redirect } from 'react-router'; import type { Route } from './+types/login'; import { pb } from '~/lib/pocketbase'; import { Lock, Mail, Eye, EyeOff, Loader2, ArrowRight } from 'lucide-react'; import { Input } from '~/components/ui/input'; import { Button } from '~/components/ui/button'; import { Label } from '~/components/ui/label'; import { Card } from '~/components/ui/card'; import { toast } from 'sonner'; export async function clientLoader() { if (pb.authStore.isValid) { return redirect('/'); } return null; } export async function clientAction({ request }: Route.ClientActionArgs) { const formData = await request.formData(); const email = formData.get('email') as string; const password = formData.get('password') as string; if (!email || !password) { return { error: 'Please enter both email and password' }; } try { await pb.collection('users').authWithPassword(email, password); return redirect('/'); } catch (err: any) { return { error: err?.message || 'Invalid email or password' }; } } export default function Login() { const navigate = useNavigate(); const submit = useSubmit(); const navigation = useNavigation(); const actionData = useActionData(); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [showPassword, setShowPassword] = useState(false); const [localError, setLocalError] = useState(''); const isLoading = navigation.state !== 'idle'; // Already-authenticated redirect fallback useEffect(() => { if (pb.authStore.isValid) { navigate('/', { replace: true }); } }, [navigate]); // Handle authentication feedback useEffect(() => { if (actionData) { if (actionData.error) { setLocalError(actionData.error); toast.error(actionData.error); } else { toast.success('Logged in successfully'); } } }, [actionData]); const handleLogin = (e: React.FormEvent) => { e.preventDefault(); if (!email || !password) { setLocalError('Please enter both email and password'); return; } setLocalError(''); const formData = new FormData(); formData.append('email', email); formData.append('password', password); submit(formData, { method: 'post' }); }; return (
t.

AR Management

Authorized Access Only

{(localError || actionData?.error) && (
{localError || actionData?.error}
)}
setEmail(e.target.value)} />
setPassword(e.target.value)} />
SYSTEM IP MONITORED SECURE PORTAL
); }