import { useEffect, useState, type ReactNode } from "react"; import { App, Button, Form, Input, Select, Switch } from "antd"; import { ChevronDown, KeyRound, LockKeyhole, ShieldCheck, UserPlus } from "lucide-react"; import { getAdminLinuxDOSetting, getAdminRegistrationSetting, updateAdminLinuxDOSetting, updateAdminRegistrationSetting, type LinuxDOSetting, type RegistrationSetting, } from "@/services/api/wallet"; import { configuredSecretText, SettingsSectionCard } from "./admin-ui"; type LinuxDOFormValues = Omit; export default function AccessSettingsPanel() { const { message } = App.useApp(); const [linuxdo, setLinuxdo] = useState(null); const [registration, setRegistration] = useState(null); const [loading, setLoading] = useState(true); const [savingLinuxDO, setSavingLinuxDO] = useState(false); const [savingRegistration, setSavingRegistration] = useState(false); const [form] = Form.useForm(); useEffect(() => { void Promise.all([getAdminLinuxDOSetting(), getAdminRegistrationSetting()]) .then(([linuxdoData, registrationData]) => { setLinuxdo(linuxdoData.setting); setRegistration(registrationData.setting); form.setFieldsValue({ ...linuxdoData.setting, clientSecret: "" }); }) .catch((error) => message.error(error instanceof Error ? error.message : "读取登录配置失败")) .finally(() => setLoading(false)); }, [form, message]); const toggleRegistration = async (enabled: boolean) => { setSavingRegistration(true); try { const data = await updateAdminRegistrationSetting(enabled); setRegistration(data.setting); message.success(enabled ? "用户注册已开启" : "用户注册已关闭"); } catch (error) { message.error(error instanceof Error ? error.message : "更新注册设置失败"); } finally { setSavingRegistration(false); } }; const saveLinuxDO = async () => { const values = await form.validateFields(); if (values.enabled && !values.clientSecret?.trim() && !linuxdo?.hasClientSecret) { message.error("启用 Linux.do 登录前请填写 Client Secret"); return; } setSavingLinuxDO(true); try { const data = await updateAdminLinuxDOSetting({ ...values, clientSecret: values.clientSecret?.trim() || "" }); setLinuxdo(data.setting); form.setFieldsValue({ ...data.setting, clientSecret: "" }); message.success("Linux.do 登录配置已保存"); } catch (error) { message.error(error instanceof Error ? error.message : "保存 Linux.do 配置失败"); } finally { setSavingLinuxDO(false); } }; return (
} title="用户注册" description="控制新用户能否创建账号,不影响已有账号登录。" status={{ label: registration?.enabled ? "已开放" : "已关闭", color: registration?.enabled ? "success" : "default" }} >

开放新用户注册

关闭后,本地注册和未绑定账号的 Linux.do 首次登录都会被拒绝。

void toggleRegistration(checked)} aria-label="开放新用户注册" />
} title="Linux.do 单点登录" description="连接 Linux.do OAuth,让用户使用社区账号登录。" status={{ label: linuxdo?.enabled ? "运行中" : "未启用", color: linuxdo?.enabled ? "success" : "default" }} footer={<>Client Secret 加密保存,接口不会回显明文。} >
} title="登录状态与应用凭据" />
} title="OAuth 地址" />
); } function FormSectionTitle({ icon, title }: { icon: ReactNode; title: string }) { return
{icon}{title}
; }