import { useEffect, useState } from 'react'; import { Button, Drawer, Form, Input, Modal, Radio, Select, Space, Table, Tag, Typography, message, } from 'antd'; import type { ColumnsType } from 'antd/es/table'; import { HQ_ADMIN_ROLES } from '@dukang/shared-types'; import { request, type HqProfile, type Paginated } from '../lib/api'; import { ACCOUNT_STATUS_LABELS, ADMIN_OPTIONS_PAGE_SIZE, fmtTime } from '../lib/constants'; import { useAdminList } from '../lib/useAdminList'; import { useAdminListColumns } from '../lib/useAdminListColumns'; import { AdminListHeader } from '../components/AdminListHeader'; import { AdminPrimaryLink } from '../components/AdminPrimaryLink'; type Row = { id: string; phone: string; loginName: string | null; hasPassword: boolean; name: string; adminRole: string; status: string; lastLoginAt: string | null; createdAt: string; cityIds?: string[]; }; type CityOption = { id: string; name: string }; const ROLE_OPTIONS = HQ_ADMIN_ROLES.map((r) => ({ value: r.value, label: r.label })); const ROLE_LABELS = Object.fromEntries(HQ_ADMIN_ROLES.map((r) => [r.value, r.label])); export default function HqAccountsPage() { const [profile, setProfile] = useState(null); const [form] = Form.useForm(); const [editForm] = Form.useForm(); const [createForm] = Form.useForm(); const [filters, setFilters] = useState>({}); const { data, loading, page, pageSize, setPage, setPageSize, reload } = useAdminList( '/admin/hq-accounts', () => { const qs = new URLSearchParams(); if (filters.phone) qs.set('phone', filters.phone); if (filters.adminRole) qs.set('adminRole', filters.adminRole); if (filters.status) qs.set('status', filters.status); return qs; }, [filters], ); const [detail, setDetail] = useState(null); const [drawerOpen, setDrawerOpen] = useState(false); const [createOpen, setCreateOpen] = useState(false); const [saving, setSaving] = useState(false); const [cities, setCities] = useState([]); const credentialType = Form.useWatch('credentialType', createForm) ?? 'phone'; const editRole = Form.useWatch('adminRole', editForm); const createRole = Form.useWatch('adminRole', createForm); const isSuperAdmin = profile?.adminRole === 'SUPER_ADMIN'; useEffect(() => { request('/admin/auth/me').then(setProfile).catch(() => {}); }, []); useEffect(() => { if (!isSuperAdmin) return; request>(`/admin/cities?pageSize=${ADMIN_OPTIONS_PAGE_SIZE}`) .then((res) => setCities(res.items)) .catch(() => {}); }, [isSuperAdmin]); const cityOptions = cities.map((c) => ({ value: c.id, label: c.name })); const baseColumns: ColumnsType = [ { title: '姓名', dataIndex: 'name', render: (v, row) => isSuperAdmin ? ( { setDetail(row); editForm.setFieldsValue({ name: row.name, phone: row.phone, loginName: row.loginName, adminRole: row.adminRole, status: row.status, cityIds: row.cityIds ?? [], }); setDrawerOpen(true); }} > {v} ) : ( v ), }, { title: '用户名', dataIndex: 'loginName', width: 120, render: (v) => v || '—' }, { title: '手机', dataIndex: 'phone', width: 130 }, { title: '登录方式', width: 110, render: (_, r) => ( {r.hasPassword ? 密码 : null} 短信 ), }, { title: '角色', dataIndex: 'adminRole', width: 130, render: (r) => ROLE_LABELS[r] || r }, { title: '城市', width: 160, render: (_, r) => { if (!r.cityIds?.length) return 全国; const names = r.cityIds .map((id) => cities.find((c) => c.id === id)?.name || id) .join('、'); return names; }, }, { title: '状态', dataIndex: 'status', width: 90, render: (s) => {ACCOUNT_STATUS_LABELS[s] || s} }, { title: '最后登录', dataIndex: 'lastLoginAt', width: 160, render: fmtTime }, { title: '操作', width: 80, render: (_, row) => ( ), }, ]; const { columns, settingsButton, settingsModal } = useAdminListColumns('hq-accounts', baseColumns, { page, pageSize }); return (
{settingsModal} { createForm.resetFields(); createForm.setFieldsValue({ credentialType: 'phone', adminRole: 'OPS', cityIds: [] }); setCreateOpen(true); }} > 新建账户 ) : null } />
{ setFilters(v); setPage(1); }}> {credentialType === 'phone' ? ( ) : ( <> )}
); }