"use client"; import { useState } from "react"; import { useTranslations } from "next-intl"; import { Button } from "@/shared/components"; interface VercelRelayModalProps { isOpen: boolean; onClose: () => void; onDeployed: (poolProxyId: string, relayUrl: string) => void; } export default function VercelRelayModal({ isOpen, onClose, onDeployed }: VercelRelayModalProps) { const t = useTranslations("settings"); const [token, setToken] = useState(""); const [projectName, setProjectName] = useState( process.env.NEXT_PUBLIC_VERCEL_RELAY_DEFAULT_PROJECT || "omniroute-relay" ); const [deploying, setDeploying] = useState(false); const [error, setError] = useState(null); const handleDeploy = async () => { if (!token.trim()) { setError(t("vercelRelayTokenRequired")); return; } setDeploying(true); setError(null); try { const res = await fetch("/api/settings/proxy/vercel-deploy", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ token: token.trim(), projectName: projectName.trim() }), }); const data = await res.json(); if (!res.ok || !data.success) { setError(data.error?.message || t("vercelRelayDeployFailed")); } else { setToken(""); onDeployed(data.poolProxyId as string, data.relayUrl as string); onClose(); } } catch (err) { setError(err instanceof Error ? err.message : t("unknownError")); } finally { setDeploying(false); } }; if (!isOpen) return null; return (

{t("vercelRelayModalTitle")}

{t("vercelRelayWarning")}
setToken(e.target.value)} className="w-full text-sm bg-surface-alt border border-border rounded px-3 py-2 focus:outline-none focus:border-primary" placeholder="vercel_pat_..." autoComplete="off" />

{t("vercelRelayTokenHint")}

setProjectName(e.target.value)} className="w-full text-sm bg-surface-alt border border-border rounded px-3 py-2 focus:outline-none focus:border-primary" placeholder="omniroute-relay" />
{error && (
{error}
)}

{t("vercelRelayFreeTierNote")}

); }