import { useState, useCallback, useEffect, useRef } from 'react' import { usePOSStore } from '@/stores/pos.store' import { api } from '@/lib/api-client' import { Button } from '@/components/ui/button' import { Delete, Lock } from 'lucide-react' interface PinUser { id: string email: string firstName: string lastName: string role: string } export function POSLockScreen() { const unlock = usePOSStore((s) => s.unlock) const [code, setCode] = useState('') const [error, setError] = useState('') const [loading, setLoading] = useState(false) const containerRef = useRef(null) // Auto-focus on mount useEffect(() => { containerRef.current?.focus() }, []) const handleDigit = useCallback((digit: string) => { setError('') setCode((p) => { if (p.length >= 10) return p return p + digit }) }, []) const handleBackspace = useCallback(() => { setError('') setCode((p) => p.slice(0, -1)) }, []) const handleClear = useCallback(() => { setError('') setCode('') }, []) const handleSubmit = useCallback(async (submitCode: string) => { if (submitCode.length < 8) { setError('Enter your employee # (4) + PIN (4)') return } setLoading(true) setError('') try { const res = await api.post<{ user: PinUser; token: string }>('/v1/auth/pin-login', { code: submitCode }) unlock(res.user, res.token) setCode('') } catch { setError('Invalid code') setCode('') } finally { setLoading(false) } }, [unlock]) // Auto-submit when 8 digits entered useEffect(() => { if (code.length === 8) { handleSubmit(code) } }, [code, handleSubmit]) const handleKeyDown = useCallback((e: React.KeyboardEvent) => { if (e.key >= '0' && e.key <= '9') handleDigit(e.key) else if (e.key === 'Backspace') handleBackspace() else if (e.key === 'Enter' && code.length >= 8) handleSubmit(code) else if (e.key === 'Escape') handleClear() }, [handleDigit, handleBackspace, handleSubmit, handleClear, code]) return (
{/* Header */}

POS Locked

Employee # + PIN

{/* Code dots — 4 employee + 4 PIN with separator */}
{Array.from({ length: 4 }).map((_, i) => (
))}
-
{Array.from({ length: 4 }).map((_, i) => (
))}
{/* Error */} {error && (

{error}

)} {/* Numpad */}
{['1', '2', '3', '4', '5', '6', '7', '8', '9'].map((d) => ( ))}
{loading && (

Verifying...

)}
) }