import { useState } from 'react' import { createFileRoute } from '@tanstack/react-router' import { useQueryClient } from '@tanstack/react-query' import { KeyRound, CheckCircle2 } from 'lucide-react' import { useGetPairingStatus, useSubmitPairingPin, getGetPairingStatusQueryKey, } from '@/api/gen/pairing/pairing' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { QueryState } from '@/components/query-state' import { m } from '@/paraglide/messages' import { useLocale } from '@/lib/i18n' export const Route = createFileRoute('/pairing')({ component: PairingPage }) function PairingPage() { useLocale() const qc = useQueryClient() const [pin, setPin] = useState('') // Poll: the host flips pin_pending when a Moonlight client begins pairing. const pairing = useGetPairingStatus({ query: { refetchInterval: 2_000 } }) const submit = useSubmitPairingPin() const pending = pairing.data?.pin_pending ?? false const onSubmit = (e: React.FormEvent) => { e.preventDefault() submit.mutate( { data: { pin } }, { onSuccess: () => { setPin('') qc.invalidateQueries({ queryKey: getGetPairingStatusQueryKey() }) }, }, ) } return (

{m.pairing_title()}

{m.pairing_title()} {!pending ? (

{m.pairing_idle()}

) : (

{m.pairing_waiting()}

setPin(e.target.value.replace(/\D/g, ''))} placeholder="0000" className="font-mono text-lg tracking-widest" />
{submit.isSuccess && (

{m.pairing_success()}

)} {submit.isError && (

{m.pairing_failed()}

)}
)}
) }