'use client';
import { useState } from 'react';
import { useRouter } from 'next/navigation';
import { signIn } from 'next-auth/react';
import { ArrowLeft, Delete } from 'lucide-react';
interface Operator {
id: string;
email: string;
}
// ── State types ──────────────────────────────────────────────────────────────
type PickerState =
| { step: 'list' }
| { step: 'pin'; operator: Operator };
const PIN_MIN = 4;
const PIN_MAX = 6;
// ── Sub-components ───────────────────────────────────────────────────────────
function OperatorList({
operators,
onSelect,
}: {
operators: Operator[];
onSelect: (op: Operator) => void;
}) {
if (operators.length === 0) {
return (
Nenhum operador encontrado. Execute pnpm db:seed.
);
}
return (
{operators.map((op) => (
))}
);
}
function PinPad({
operator,
onBack,
}: {
operator: Operator;
onBack: () => void;
}) {
const router = useRouter();
const [digits, setDigits] = useState('');
const [busy, setBusy] = useState(false);
const [error, setError] = useState(null);
function press(d: string) {
if (digits.length >= PIN_MAX) return;
setDigits((prev) => prev + d);
setError(null);
}
function erase() {
setDigits((prev) => prev.slice(0, -1));
setError(null);
}
async function submit() {
if (digits.length < PIN_MIN || busy) return;
setBusy(true);
setError(null);
try {
const result = await signIn('credentials', {
email: operator.email,
pin: digits,
redirect: false,
});
if (result?.error) {
setDigits('');
setError('PIN incorreto ou conta bloqueada. Tente novamente.');
} else {
router.push('/');
router.refresh();
}
} catch {
setDigits('');
setError('Erro inesperado. Tente novamente.');
} finally {
setBusy(false);
}
}
const keys = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '', '0', 'del'];
return (
{/* Header */}
Operador selecionado
{operator.email}
{/* PIN dots */}
{Array.from({ length: PIN_MAX }).map((_, i) => (
))}
{/* Error */}
{error && (
{error}
)}
{/* Numpad */}
{keys.map((key, idx) => {
if (key === '') {
return
;
}
if (key === 'del') {
return (
);
}
return (
);
})}
{/* Submit */}
);
}
// ── Main component ───────────────────────────────────────────────────────────
export function OperatorPicker({ operators }: { operators: Operator[] }) {
const [state, setState] = useState({ step: 'list' });
if (state.step === 'pin') {
return (
setState({ step: 'list' })}
/>
);
}
return (
setState({ step: 'pin', operator: op })}
/>
);
}