From 5e51933d5ff5a6499efdc10f91a0c53c8794d7bc Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Wed, 29 Jul 2026 22:40:49 +0800 Subject: [PATCH] =?UTF-8?q?refactor(assets):=20=E6=8B=86=E5=88=86=20batchO?= =?UTF-8?q?perations=20=E5=AD=90=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/useBatchClassify.ts | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 apps/web/src/pages/assets/hooks/asset-operations/batch/useBatchClassify.ts diff --git a/apps/web/src/pages/assets/hooks/asset-operations/batch/useBatchClassify.ts b/apps/web/src/pages/assets/hooks/asset-operations/batch/useBatchClassify.ts new file mode 100644 index 000000000..8f4ebd008 --- /dev/null +++ b/apps/web/src/pages/assets/hooks/asset-operations/batch/useBatchClassify.ts @@ -0,0 +1,58 @@ +import { useState, useCallback } from "react" +import { message } from "antd" +import { batchClassifyAssets, type BatchOperationResult } from "@/api/assets" + +interface UseBatchClassifyOptions { + selectedIds: Set + queryClient: ReturnType + showResult: (result: BatchOperationResult, title: string, clear?: boolean) => void +} + +export const useBatchClassify = ({ + selectedIds, + queryClient, + showResult, +}: UseBatchClassifyOptions) => { + const [classifyModalOpen, setClassifyModalOpen] = useState(false) + const [batchCategory, setBatchCategory] = useState("") + const [batchLoading, setBatchLoading] = useState(false) + + const handleBatchClassify = useCallback(async () => { + if (!batchCategory) { + message.warning("请选择分类") + return + } + const ids = Array.from(selectedIds) + setBatchLoading(true) + try { + const result = await batchClassifyAssets({ + asset_ids: ids, + category: batchCategory, + }) + queryClient.invalidateQueries({ queryKey: ["assets"] }) + showResult(result, "批量改分类") + setClassifyModalOpen(false) + setBatchCategory("") + if (result.failure_count === 0) { + message.success(`成功将 ${result.success_count} 个素材改为「${batchCategory}」`) + } else { + message.warning( + `改分类完成:成功 ${result.success_count} 个,失败 ${result.failure_count} 个`, + ) + } + } catch { + message.error("批量改分类失败,请重试") + } finally { + setBatchLoading(false) + } + }, [batchCategory, selectedIds, queryClient, showResult]) + + return { + classifyModalOpen, + setClassifyModalOpen, + batchCategory, + setBatchCategory, + batchLoading, + handleBatchClassify, + } +} \ No newline at end of file