'use client'; import {useState, useContext} from 'react'; import {SessionContext} from '@/context/SessionContext'; import {useTranslations} from '@/lib/i18n'; import {Lock, ShieldCheck, Eye, EyeOff} from 'lucide-react'; import * as tauri from '@/lib/tauri'; import Button from '@/components/ui/Button'; import IconButton from '@/components/ui/IconButton'; interface OfflinePinSetupProps { onClose?: () => void; onSuccess?: () => void; showOnFirstLogin?: boolean; } export default function OfflinePinSetup({onClose, onSuccess, showOnFirstLogin}: OfflinePinSetupProps) { const t = useTranslations(); const {session} = useContext(SessionContext); const [pin, setPin] = useState(''); const [confirmPin, setConfirmPin] = useState(''); const [showPin, setShowPin] = useState(false); const [error, setError] = useState(''); const [isLoading, setIsLoading] = useState(false); if (!session?.isConnected || !session?.user) { return null; } const validatePin = (): boolean => { if (pin.length < 4) { setError(t('offline.pin.errors.tooShort')); return false; } if (pin.length > 8) { setError(t('offline.pin.errors.tooLong')); return false; } if (!/^\d+$/.test(pin)) { setError(t('offline.pin.errors.digitsOnly')); return false; } if (pin !== confirmPin) { setError(t('offline.pin.errors.mismatch')); return false; } return true; }; const handleSetPin = async () => { if (!validatePin()) return; setIsLoading(true); setError(''); try { const result = await tauri.offlinePinSet(pin); if (result.success) { await tauri.offlineModeSet(true, 30); onSuccess?.(); } else { setError(result.error || t('offline.pin.errors.setupFailed')); } } catch (error) { setError(t('offline.pin.errors.setupFailed')); } finally { setIsLoading(false); } }; return (

{showOnFirstLogin ? t('offline.pin.setup.titleFirstLogin') : t('offline.pin.setup.title')}

{onClose && ( )}

{t('offline.pin.setup.subtitle')}

{t('offline.pin.setup.description')}

setPin(e.target.value.replace(/\D/g, '').slice(0, 8))} placeholder="••••" maxLength={8} className="input-base text-center text-lg tracking-widest" disabled={isLoading} />
setConfirmPin(e.target.value.replace(/\D/g, '').slice(0, 8))} placeholder="••••" maxLength={8} className="input-base text-center text-lg tracking-widest" disabled={isLoading} />
{error && (

{error}

)}

{t('offline.pin.setup.footer')}

{onClose && ( )}
); }