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,