import type { ColumnsType } from "antd/es/table"; import { Eye, Pencil, Power } from "lucide-react"; import { formatCredits } from "@/constant/credits"; import { IdentityProviderBadge } from "@/components/layout/identity-provider-badge"; import { AdminRowActions, AdminStatusBadge } from "../components/admin-ui"; import type { AdminUser } from "@/services/api/auth"; export type UserColumnKey = "user" | "email" | "credits" | "role" | "status" | "createdAt" | "actions"; export const userColumnOptions: Array<{ key: UserColumnKey; label: string; locked?: boolean }> = [ { key: "user", label: "用户", locked: true }, { key: "email", label: "邮箱" }, { key: "credits", label: "当前积分" }, { key: "role", label: "角色" }, { key: "status", label: "状态" }, { key: "createdAt", label: "注册时间" }, { key: "actions", label: "操作", locked: true }, ]; export function createUserColumns({ actorId, visibleColumns, onView, onEdit, onToggleStatus, }: { actorId?: string; visibleColumns: Set; onView: (user: AdminUser) => void; onEdit: (user: AdminUser) => void; onToggleStatus: (user: AdminUser) => Promise; }): ColumnsType { const columns: Array[number] & { key: UserColumnKey }> = [ { key: "user", title: "用户", dataIndex: "username", render: (_, user) => (
@{user.username}
), }, { key: "email", title: "邮箱", dataIndex: "email", align: "center", render: (email) => email || 未填写 }, { key: "credits", title: "当前积分", dataIndex: "availableMicrocredits", width: 130, align: "center", render: (value, user) => {formatCredits(value)}, }, { key: "role", title: "角色", dataIndex: "role", width: 110, align: "center", render: (role) => }, { key: "status", title: "状态", dataIndex: "status", width: 110, align: "center", render: (status) => }, { key: "createdAt", title: "注册时间", dataIndex: "createdAt", width: 180, align: "center", render: formatTime }, { key: "actions", title: "操作", width: 280, align: "center", render: (_, user) => ( , onClick: () => onView(user) }} visibleActionCount={2} actions={[ { key: "edit", label: "编辑用户", icon: , onClick: () => onEdit(user) }, { key: "toggle-status", label: user.status === "active" ? "停用用户" : "重新启用", icon: , danger: user.status === "active", disabled: user.id === actorId, confirm: { title: user.status === "active" ? "停用这个用户?" : "重新启用这个用户?", description: user.status === "active" ? "停用后会清除该用户登录态,但保留身份、任务和积分流水。" : "启用后,该用户可以重新登录并继续使用原有数据。", okText: user.status === "active" ? "确认停用" : "确认启用", }, onClick: () => onToggleStatus(user), }, ]} /> ), }, ]; return columns.filter((column) => visibleColumns.has(column.key)); } function formatTime(value?: string) { return value ? new Date(value).toLocaleString("zh-CN", { hour12: false }) : "--"; }