import { App, Button, Drawer, Form, Input, Select } from "antd"; import { useEffect, useState } from "react"; import { createAdminUser, updateAdminUser, type AdminUser, type LocalUser } from "@/services/api/auth"; type UserFormValues = Pick; export function AdminUserEditDrawer({ user, actorId, onClose, onSaved, }: { user: AdminUser | null; actorId?: string; onClose: () => void; onSaved: (user: LocalUser) => void; }) { const { message, modal } = App.useApp(); const [saving, setSaving] = useState(false); const [form] = Form.useForm(); const editingSelf = user?.id === actorId; useEffect(() => { if (!user) return; form.resetFields(); form.setFieldsValue({ displayName: user.displayName, email: user.email || "", role: user.role, status: user.status, }); }, [form, user]); const close = () => { if (saving) return; if (!form.isFieldsTouched()) { onClose(); return; } modal.confirm({ title: "放弃用户修改?", content: "尚未保存的账号、角色或状态修改将丢失。", okText: "放弃修改", cancelText: "继续编辑", okButtonProps: { danger: true }, onOk: onClose, }); }; const save = async () => { if (!user) return; const values = await form.validateFields(); setSaving(true); try { const result = await updateAdminUser(user.id, { displayName: values.displayName.trim(), email: values.email?.trim() || "", role: values.role, status: values.status, }); onSaved(result.user); form.resetFields(); onClose(); message.success("用户信息已保存"); } catch (error) { message.error(error instanceof Error ? error.message : "保存用户失败"); } finally { setSaving(false); } }; return ( void save()}>保存} >
); } type CreateUserFormValues = { username: string; displayName: string; email?: string; password: string; role: LocalUser["role"]; status: LocalUser["status"]; }; export function AdminUserCreateDrawer({ open, onClose, onCreated, }: { open: boolean; onClose: () => void; onCreated: (user: AdminUser) => void; }) { const { message, modal } = App.useApp(); const [saving, setSaving] = useState(false); const [form] = Form.useForm(); useEffect(() => { if (!open) return; form.resetFields(); form.setFieldsValue({ role: "user", status: "active" }); }, [form, open]); const close = () => { if (saving) return; if (!form.isFieldsTouched()) { onClose(); return; } modal.confirm({ title: "\u653e\u5f03\u6dfb\u52a0\u7528\u6237\uff1f", content: "\u5c1a\u672a\u4fdd\u5b58\u7684\u7528\u6237\u4fe1\u606f\u5c06\u4e22\u5931\u3002", okText: "\u653e\u5f03\u5e76\u5173\u95ed", cancelText: "\u7ee7\u7eed\u7f16\u8f91", okButtonProps: { danger: true }, onOk: onClose, }); }; const save = async () => { const values = await form.validateFields(); setSaving(true); try { const result = await createAdminUser({ username: values.username.trim(), displayName: values.displayName.trim(), email: values.email?.trim() || "", password: values.password, role: values.role, status: values.status, }); onCreated(result.user); form.resetFields(); onClose(); message.success("\u7528\u6237\u5df2\u521b\u5efa"); } catch (error) { message.error(error instanceof Error ? error.message : "\u521b\u5efa\u7528\u6237\u5931\u8d25"); } finally { setSaving(false); } }; return ( void save()}>{"\u4fdd\u5b58"}} >
); }