From f48c7b540ae901cb986437f94209cb7534350b21 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 3 Sep 2026 18:00:41 +0800 Subject: [PATCH] =?UTF-8?q?fix(voice-materials):=20=E7=B4=A0=E6=9D=90?= =?UTF-8?q?=E6=97=B6=E9=95=BF=E6=98=BE=E7=A4=BA=E4=BF=AE=E5=A4=8D=20+=20?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=90=8E=E7=8A=B6=E6=80=81=E8=BD=AE=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug A: mapAssetToMaterial duration 优先使用 Asset 顶层字段 - duration: asset.duration || (meta.duration as number) || 0 - 修复配音素材时长显示为 --:-- 的问题 Bug B: useVoiceMaterialData 添加条件轮询 - 存在上传中/处理中素材时 refetchInterval: 3000 - 全部就绪后自动停止轮询 --- .../useVoiceMaterials/useVoiceMaterialData.ts | 16 +++++++++++++++- apps/web/src/pages/voice-materials/types.ts | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/apps/web/src/pages/voice-materials/hooks/useVoiceMaterials/useVoiceMaterialData.ts b/apps/web/src/pages/voice-materials/hooks/useVoiceMaterials/useVoiceMaterialData.ts index 27951d090..bde83ea04 100644 --- a/apps/web/src/pages/voice-materials/hooks/useVoiceMaterials/useVoiceMaterialData.ts +++ b/apps/web/src/pages/voice-materials/hooks/useVoiceMaterials/useVoiceMaterialData.ts @@ -1,6 +1,11 @@ import { useMemo, useEffect } from "react" import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query" -import { getAssetsByKind, getAssetLibraries, createAssetLibrary } from "@/api/assets" +import { + getAssetsByKind, + getAssetLibraries, + createAssetLibrary, + type AssetItem, +} from "@/api/assets" import { type VoiceMaterial, mapAssetToMaterial } from "../../types" interface UseVoiceMaterialDataOptions { @@ -44,6 +49,15 @@ export function useVoiceMaterialData({ keyword, gender, tagIds }: UseVoiceMateri queryKey: ["assets", "voice", { keyword, gender, tag_ids: tagIds }], queryFn: () => getAssetsByKind("voice", { keyword, gender, tag_ids: tagIds }), staleTime: 30_000, + // 列表中存在上传中/处理中素材时每 3s 轮询;全部就绪后自动停止 + refetchInterval: (query) => { + const items = (query.state.data as AssetItem[] | undefined) ?? [] + const processing = items.some((a) => { + const st = a.status ?? "" + return st === "uploading" || st === "ingesting" || st === "processing" || st === "pending" + }) + return processing ? 3000 : false + }, }) const materials: VoiceMaterial[] = useMemo(() => assets.map(mapAssetToMaterial), [assets]) diff --git a/apps/web/src/pages/voice-materials/types.ts b/apps/web/src/pages/voice-materials/types.ts index 36a339377..da34b738b 100644 --- a/apps/web/src/pages/voice-materials/types.ts +++ b/apps/web/src/pages/voice-materials/types.ts @@ -41,7 +41,7 @@ export const mapAssetToMaterial = (asset: AssetItem): VoiceMaterial => { tagIds: Array.isArray(asset.tag_ids) ? asset.tag_ids : [], fileName: asset.storage_key?.split("/").pop() || asset.name, fileSize: asset.file_size || 0, - duration: (meta.duration as number) || 0, + duration: asset.duration || (meta.duration as number) || 0, mimeType: asset.mime_type || "audio/mpeg", createdAt: asset.created_at || new Date().toISOString(), fileUrl: asset.file_url, -- 2.54.0