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}
) : null}{resolveUserErrorMessage(listQuery.error, "加载委派列表失败")}
) : null} {listQuery.data ? (我发起的委派
我接收的委派