import { useState, useEffect } from "react"; import { useProfileStore } from "../stores/useProfileStore"; import { useStore } from "../stores/useStore"; interface DevicePairingPanelProps { onRequestCode: (groupId: string) => void; onResolveCode: (code: string) => void; } export default function DevicePairingPanel({ onRequestCode, onResolveCode, }: DevicePairingPanelProps) { const { groupId, setGroupId } = useProfileStore(); const pairCode = useStore((s) => s.pairCode); const error = useStore((s) => s.error); const [showModal, setShowModal] = useState(false); const [mode, setMode] = useState<"show" | "enter">("show"); const [inputCode, setInputCode] = useState(""); const [pairError, setPairError] = useState(null); useEffect(() => { if (showModal && mode === "show") { let gid = groupId; if (!gid) { gid = crypto.randomUUID(); setGroupId(gid); } useStore.getState().setPairCode(null); onRequestCode(gid); } }, [showModal, mode]); useEffect(() => { if (error && error.includes("appairage")) { setPairError(error); useStore.getState().setError(null); } }, [error]); const handleClose = () => { setShowModal(false); useStore.getState().setPairCode(null); setPairError(null); setInputCode(""); }; const handleSubmitCode = () => { if (inputCode.length >= 6) { setPairError(null); onResolveCode(inputCode); } }; const currentGroupId = useProfileStore((s) => s.groupId); useEffect(() => { if (mode === "enter" && showModal && currentGroupId && currentGroupId !== groupId) { handleClose(); } }, [currentGroupId]); return ( <> {showModal && (
e.stopPropagation()} >
Pair device

Link your devices

{/* Tab switcher */}
{mode === "show" ? ( <>

Enter this code on your other device.

{pairCode ? (

{pairCode}

) : (
)}

Code expires in 5 minutes. Pairing is permanent.

) : ( <>

Enter the code shown on the other device.

{ setInputCode(e.target.value.toUpperCase().replace(/[^A-Z0-9]/g, "")); setPairError(null); }} placeholder="ABC123" maxLength={6} autoFocus className="w-full px-4 py-3 bg-paper border border-paper-edge rounded-sm text-ink text-2xl text-center font-mono tracking-[0.3em] placeholder:text-ink-faint focus:outline-none focus:border-ink transition-colors duration-fast ease-crisp" onKeyDown={(e) => { if (e.key === "Enter") handleSubmitCode(); }} /> {pairError && (

{pairError}

)} )}
)} ); }