"use client"; import { useRouter } from "next/navigation"; import { useState, useTransition } from "react"; type ApiResponse = { ok: boolean; error?: { message?: string; }; }; export function GatewayBindForm({ labels, }: { labels: { title: string; body: string; userIdLabel: string; userIdHint: string; tokenLabel: string; tokenHint: string; submit: string; submitting: string; invalidUserId: string; invalidToken: string; success: string; }; }) { const router = useRouter(); const [gatewayUserId, setGatewayUserId] = useState(""); const [gatewayAccessToken, setGatewayAccessToken] = useState(""); const [error, setError] = useState(null); const [success, setSuccess] = useState(null); const [isPending, startTransition] = useTransition(); function handleSubmit(event: React.FormEvent) { event.preventDefault(); const userId = Number(gatewayUserId.trim()); const accessToken = gatewayAccessToken.trim(); if (!Number.isInteger(userId) || userId <= 0) { setError(labels.invalidUserId); setSuccess(null); return; } if (!accessToken) { setError(labels.invalidToken); setSuccess(null); return; } startTransition(async () => { setError(null); setSuccess(null); try { const response = await fetch("/api/auth/gateway-bind", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ gateway_user_id: userId, gateway_access_token: accessToken, }), }); const payload = (await response.json()) as ApiResponse; if (!response.ok || !payload.ok) { setError(payload.error?.message ?? labels.invalidToken); return; } setSuccess(labels.success); router.refresh(); } catch (requestError) { setError(requestError instanceof Error ? requestError.message : labels.invalidToken); } }); } return (

{labels.title}

{labels.body}

setGatewayUserId(event.target.value)} placeholder="123" type="text" value={gatewayUserId} />

{labels.userIdHint}

setGatewayAccessToken(event.target.value)} placeholder="access_token" spellCheck={false} type="password" value={gatewayAccessToken} />

{labels.tokenHint}

{error ?
{error}
: null} {success ?
{success}
: null}
); }