"use client"; import { useRef, useState } from "react"; import { useRouter } from "next/navigation"; import type { BetaAccessRequestRecord } from "@/db/repository"; type SubmitState = { loading: boolean; message: string; error: boolean }; export function AccessRequestForm({ pendingRequest, }: { pendingRequest: BetaAccessRequestRecord | null; }) { const router = useRouter(); const pendingKey = useRef(null); const [preferredOs, setPreferredOs] = useState("windows"); const [requestedSlots, setRequestedSlots] = useState(1); const [useCase, setUseCase] = useState(""); const [state, setState] = useState({ loading: false, message: "", error: false }); async function post(payload: Record) { pendingKey.current ??= crypto.randomUUID(); const response = await fetch("/api/beta-access", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ ...payload, idempotencyKey: pendingKey.current }), }); const body = (await response.json()) as { message?: string }; if (!response.ok) throw new Error(body.message || "操作失败"); pendingKey.current = null; } async function submit(event: React.FormEvent) { event.preventDefault(); setState({ loading: true, message: "", error: false }); try { await post({ action: "request", preferredOs, requestedSlots, useCase }); setState({ loading: false, message: "申请已提交,处理结果会显示在本页。", error: false }); router.refresh(); } catch (error) { setState({ loading: false, message: error instanceof Error ? error.message : "提交失败", error: true }); } } async function cancel() { if (!pendingRequest) return; setState({ loading: true, message: "", error: false }); try { await post({ action: "cancel", requestId: pendingRequest.id }); setState({ loading: false, message: "申请已撤回。", error: false }); router.refresh(); } catch (error) { setState({ loading: false, message: error instanceof Error ? error.message : "撤回失败", error: true }); } } if (pendingRequest) { return (

申请正在等待人工处理。测试资格没有承诺顺序,也不会因此建立付费关系。

{state.message &&

{state.message}

}
); } return (