"use client"; import { FormEvent, useState } from "react"; import { Globe2, Save, ShieldCheck } from "lucide-react"; import { useRouter } from "next/navigation"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import type { ApiResult } from "@/modules/core/server/api"; import type { SystemSettings } from "@/modules/core/types"; type GlobalSettingsClientProps = { settings: SystemSettings; }; export function GlobalSettingsClient({ settings }: GlobalSettingsClientProps): React.ReactElement { const router = useRouter(); 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: formData.get("registrationEnabled") === "on", oidcEnabled: formData.get("oidcEnabled") === "on", 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: formData.get("oidcAutoProvision") === "on", }), }); const result = (await response.json()) as ApiResult<{ settings: SystemSettings }>; setIsPending(false); if (!result.success) { setMessage(result.reason); return; } setMessage(result.reason); router.refresh(); } return (
控制全站公开注册能力和 OIDC 登录入口总开关。
保存标准 OIDC issuer、client、scope 和头像 claim。
{message ? (

{message}

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