import { useMemo, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { toast } from "sonner"; import { mapApiErrorMessage } from "../api/errorMessages"; import { isApiError } from "../api/types"; 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 { Input } from "../components/ui/input"; 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 = isApiError(err) ? `${err.code}: ${mapApiErrorMessage(err.code, err.details, err.message)}` : err instanceof Error ? err.message : "创建委派失败"; 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 = isApiError(err) ? `${err.code}: ${mapApiErrorMessage(err.code, err.details, err.message)}` : err instanceof Error ? err.message : "撤销委派失败"; setError(msg); toast.error(msg); }, }); return (
{error}
) : null}{isApiError(listQuery.error) ? `${listQuery.error.code}: ${mapApiErrorMessage( listQuery.error.code, listQuery.error.details, listQuery.error.message, )}` : "加载委派列表失败"}
) : null} {listQuery.data ? (我发起的委派
我接收的委派