import type { BatchOperationFailure } from "@/api/types"; import toast from "react-hot-toast"; import { Button } from "@/shadcn-bridge/heroui/button"; import { Chip } from "@/shadcn-bridge/heroui/chip"; import { Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, } from "@/shadcn-bridge/heroui/modal"; import { Alert } from "@/shadcn-bridge/heroui/alert"; interface BatchActionResultModalProps { failures: BatchOperationFailure[]; isOpen: boolean; onOpenChange: (open: boolean) => void; summary: string; title: string; } const getFailureTitle = ( failure: BatchOperationFailure, index: number, ): string => { const name = typeof failure.name === "string" ? failure.name.trim() : ""; if (name) { return name; } if (typeof failure.id === "number" && Number.isFinite(failure.id)) { return `ID ${failure.id}`; } return `失败项 ${index + 1}`; }; const getFailureReason = (failure: BatchOperationFailure): string => { const reason = typeof failure.reason === "string" ? failure.reason.trim() : ""; return reason || "未知错误"; }; const buildFailureCopyText = ( title: string, summary: string, failures: BatchOperationFailure[], ): string => { return [ title, summary, "", ...failures.map( (failure, index) => `${index + 1}. ${getFailureTitle(failure, index)}\n${getFailureReason(failure)}`, ), ].join("\n"); }; export function BatchActionResultModal({ failures, isOpen, onOpenChange, summary, title, }: BatchActionResultModalProps) { const handleCopy = async () => { if ( typeof navigator === "undefined" || !navigator.clipboard || typeof navigator.clipboard.writeText !== "function" ) { toast.error("当前环境不支持复制"); return; } try { await navigator.clipboard.writeText( buildFailureCopyText(title, summary, failures), ); toast.success(`已复制 ${failures.length} 项失败原因`); } catch { toast.error("复制失败,请稍后重试"); } }; return ( {(onClose) => ( <> {title}
{failures.map((failure, index) => (

{getFailureTitle(failure, index)}

点击展开查看失败原因

失败
{getFailureReason(failure)}
))}
)}
); }