"use client"; import { FormEvent, useState } from "react"; import { Building2, Globe2, KeyRound, Save, ShieldCheck, UserPlus } from "lucide-react"; import { useRouter } from "next/navigation"; import { Badge } from "@/components/ui/badge"; import { Button, LinkButton } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Checkbox } from "@/components/ui/checkbox"; import { Input } from "@/components/ui/input"; import type { ApiResult } from "@/modules/core/server/api"; import type { SystemSettings } from "@/modules/core/types"; type GlobalSettingsClientProps = { organizationSettingsHref: string; settings: SystemSettings; }; type SettingsTab = "registration" | "invitation" | "oidc"; const tabs: Array<{ label: string; value: SettingsTab }> = [ { label: "注册入口", value: "registration" }, { label: "邀请注册", value: "invitation" }, { label: "OIDC 默认配置", value: "oidc" }, ]; export function GlobalSettingsClient({ organizationSettingsHref, settings, }: GlobalSettingsClientProps): React.ReactElement { const router = useRouter(); const [activeTab, setActiveTab] = useState("registration"); const [registrationEnabled, setRegistrationEnabled] = useState(settings.registrationEnabled); const [oidcEnabled, setOidcEnabled] = useState(settings.oidcEnabled); const [oidcAutoProvision, setOidcAutoProvision] = useState(settings.oidcAutoProvision); const [message, setMessage] = useState(""); const [isPending, setIsPending] = useState(false); async function handleSubmit(event: FormEvent): Promise { event.preventDefault(); setMessage(""); setIsPending(true); const formData = new FormData(event.currentTarget); const response = await fetch("/api/settings/global", { method: "PATCH", headers: { "content-type": "application/json" }, body: JSON.stringify({ registrationEnabled, oidcEnabled, oidcIssuerUrl: String(formData.get("oidcIssuerUrl") ?? ""), oidcClientId: String(formData.get("oidcClientId") ?? ""), oidcClientSecret: String(formData.get("oidcClientSecret") ?? ""), oidcScopes: String(formData.get("oidcScopes") ?? ""), oidcRedirectUri: String(formData.get("oidcRedirectUri") ?? ""), oidcAvatarClaim: String(formData.get("oidcAvatarClaim") ?? ""), oidcAutoProvision, }), }); const result = (await response.json()) as ApiResult<{ settings: SystemSettings }>; setIsPending(false); if (!result.success) { setMessage(result.reason); return; } setMessage(result.reason); router.refresh(); } return (
{tabs.map((tab) => ( ))}
{message ? (

{message}

) : null}
{oidcEnabled ? "OIDC 已启用" : "OIDC 未启用"}
); }