import { resolveErrorMessage as resolveUserErrorMessage } from "../lib/resolveErrorMessage"; import { useMemo, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { toast } from "sonner"; import { createDelegation, fetchMyDelegations, revokeDelegation } from "../api/delegations"; import { fetchWorkflowApprovers } from "../api/workflow"; import { PageHeader } from "../components/common/PageHeader"; import { TableSkeleton } from "../components/common/TableSkeleton"; import { StatusBadge } from "../components/common/StatusBadge"; import { Button } from "../components/ui/button"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "../components/ui/table"; export function DelegationsPage() { const queryClient = useQueryClient(); const [status, setStatus] = useState<"active" | "scheduled" | "expired" | "revoked" | "all">("active"); const [delegateEmployeeId, setDelegateEmployeeId] = useState(""); const [scope, setScope] = useState<"all" | "reimbursement_submit">("all"); const [validTo, setValidTo] = useState(""); const [error, setError] = useState(""); const listQuery = useQuery({ queryKey: ["delegations", "mine", status], queryFn: () => fetchMyDelegations(status), }); const approversQuery = useQuery({ queryKey: ["workflow", "approvers", "delegations"], queryFn: () => fetchWorkflowApprovers({ page: 1, pageSize: 100 }), }); const delegateOptions = useMemo(() => { const items = approversQuery.data?.items ?? []; return items.map((item) => ({ id: item.id, label: `${item.name} (${item.employeeNo})`, })); }, [approversQuery.data?.items]); const createMutation = useMutation({ mutationFn: () => createDelegation({ delegateEmployeeId, scope, validTo: validTo ? new Date(validTo).toISOString() : undefined, }), onSuccess: async () => { await queryClient.invalidateQueries({ queryKey: ["delegations"] }); setError(""); toast.success("委派已创建"); }, onError: (err) => { const msg = resolveUserErrorMessage(err, "创建委派失败"); setError(msg); toast.error(msg); }, }); const revokeMutation = useMutation({ mutationFn: (delegationId: string) => revokeDelegation(delegationId), onSuccess: async () => { await queryClient.invalidateQueries({ queryKey: ["delegations"] }); setError(""); toast.success("已撤销"); }, onError: (err) => { const msg = resolveUserErrorMessage(err, "撤销委派失败"); setError(msg); toast.error(msg); }, }); return (
{error ? (

{error}

) : null}

创建委派

我的委派

{listQuery.isLoading ? : null} {listQuery.isError ? (

{resolveUserErrorMessage(listQuery.error, "加载委派列表失败")}

) : null} {listQuery.data ? (

我发起的委派

IDdelegatescopestatus操作 {listQuery.data.initiated.length ? ( listQuery.data.initiated.map((item) => ( {item.id} {item.delegateEmployeeId} {item.scope} )) ) : ( 暂无数据 )}

我接收的委派

IDprincipalscopestatus {listQuery.data.received.length ? ( listQuery.data.received.map((item) => ( {item.id} {item.principalEmployeeId} {item.scope} )) ) : ( 暂无数据 )}
) : null}
); }