"use client"; import Link from "next/link"; import { useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; import { postAdminAgentLine } from "@/api/admin-agent-lines"; import { getAdminIntegrationSites } from "@/api/admin-integration-sites"; import { AdminPageCard } from "@/components/admin/admin-page-card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Switch } from "@/components/ui/switch"; import { useAsyncEffect } from "@/hooks/use-async-effect"; import { percentUiToRatio } from "@/lib/admin-rate-percent"; import { adminSiteCodeLabel } from "@/lib/admin-select-display"; import { LotteryApiBizError } from "@/types/api/errors"; import type { AdminIntegrationSiteRow } from "@/types/api/admin-integration-site"; export function AgentLineProvisionWizard(): React.ReactElement { const { t } = useTranslation(["agents", "common"]); const [submitting, setSubmitting] = useState(false); const [sitesLoading, setSitesLoading] = useState(true); const [sites, setSites] = useState([]); const [form, setForm] = useState({ site_code: "", code: "", name: "", username: "", password: "", total_share_rate: "0", credit_limit: "0", rebate_limit: "0", default_player_rebate: "0", settlement_cycle: "weekly" as "daily" | "weekly" | "monthly", can_grant_extra_rebate: false, }); useAsyncEffect(() => { setSitesLoading(true); void getAdminIntegrationSites() .then((data) => setSites(data.items)) .catch(() => setSites([])) .finally(() => setSitesLoading(false)); }, []); const unboundSites = useMemo( () => sites.filter((row) => !row.has_line_root), [sites], ); async function onSubmit(e: React.FormEvent): Promise { e.preventDefault(); if (!form.site_code.trim()) { toast.error(t("agents:lineProvision.siteRequired", { defaultValue: "请选择接入站点" })); return; } setSubmitting(true); try { await postAdminAgentLine({ site_code: form.site_code.trim().toLowerCase(), code: form.code.trim().toLowerCase(), name: form.name.trim(), username: form.username.trim(), password: form.password, total_share_rate: Number.parseFloat(form.total_share_rate) || 0, credit_limit: Number.parseInt(form.credit_limit, 10) || 0, rebate_limit: percentUiToRatio(form.rebate_limit), default_player_rebate: percentUiToRatio(form.default_player_rebate), settlement_cycle: form.settlement_cycle, can_grant_extra_rebate: form.can_grant_extra_rebate, }); toast.success(t("agents:lineProvision.success", { defaultValue: "一级代理已创建" })); setForm((f) => ({ ...f, site_code: "", code: "", name: "", username: "", password: "", })); const data = await getAdminIntegrationSites(); setSites(data.items); } catch (err) { const msg = err instanceof LotteryApiBizError ? err.message : t("common:error.generic"); toast.error(msg); } finally { setSubmitting(false); } } return (

{t("agents:subnav.provisionHint", { defaultValue: "请先在「平台管理 → 接入配置」创建接入站点;对接密钥在站点创建时一次性展示。", })}

{t("agents:lineProvision.description", { defaultValue: "将一级代理绑定到已有接入站点,并配置后台登录账号与占成、授信、回水、结算周期。代理编码创建后不可修改。", })}{" "} {t("agents:lineProvision.openIntegrationSites", { defaultValue: "前往接入站点", })}

setForm((f) => ({ ...f, code: e.target.value }))} required pattern="[a-z0-9][a-z0-9_-]*" />
setForm((f) => ({ ...f, name: e.target.value }))} required />
setForm((f) => ({ ...f, username: e.target.value }))} required />
setForm((f) => ({ ...f, password: e.target.value }))} required minLength={8} />

{t("agents:profile.section", { defaultValue: "占成与授信" })}

setForm((f) => ({ ...f, total_share_rate: e.target.value }))} />
setForm((f) => ({ ...f, credit_limit: e.target.value }))} />
setForm((f) => ({ ...f, rebate_limit: e.target.value }))} />
setForm((f) => ({ ...f, default_player_rebate: e.target.value }))} />
setForm((f) => ({ ...f, can_grant_extra_rebate: checked })) } />
); }