diff --git a/apps/web/src/pages/generate/hooks/step2-materials/useMaterialLibrary.ts b/apps/web/src/pages/generate/hooks/step2-materials/useMaterialLibrary.ts index 8e6e0d891..cc9cd25b3 100755 --- a/apps/web/src/pages/generate/hooks/step2-materials/useMaterialLibrary.ts +++ b/apps/web/src/pages/generate/hooks/step2-materials/useMaterialLibrary.ts @@ -14,11 +14,16 @@ export function useMaterialLibrary() { * 避免配音库(voice)/图片库(image) 混进「选择视频库」下拉。 * queryKey 带 kind,与素材管理页/配音页的 ["asset-libraries"] 全量缓存隔离。 */ - const { data: libraries = [] } = useQuery({ + const { data: allLibraries = [] } = useQuery({ queryKey: ["asset-libraries", "video"], queryFn: () => getAssetLibraries("video"), staleTime: 60_000, }) + // 前端兜底过滤:仅保留 kind=video 的素材库(后端按 kind 查询参数过滤) + const libraries = useMemo( + () => allLibraries.filter((lib) => lib.kind === "video"), + [allLibraries], + ) const [selectedLibraryId, setSelectedLibraryId] = useState("") // 自动选中第一个视频库 diff --git a/apps/web/src/pages/voice-materials/hooks/useVoiceMaterials/actions/useVoiceUpload.ts b/apps/web/src/pages/voice-materials/hooks/useVoiceMaterials/actions/useVoiceUpload.ts index a22e5bdd8..0e4ed77ed 100755 --- a/apps/web/src/pages/voice-materials/hooks/useVoiceMaterials/actions/useVoiceUpload.ts +++ b/apps/web/src/pages/voice-materials/hooks/useVoiceMaterials/actions/useVoiceUpload.ts @@ -41,7 +41,7 @@ export function useVoiceUpload({ voiceLibrary, createLibMutation }: UseVoiceUplo } const libs = await queryClient.fetchQuery({ queryKey: ["asset-libraries"], - queryFn: getAssetLibraries, + queryFn: () => getAssetLibraries(), }) lib = libs.find((l: AssetLibraryItem) => l.kind === "voice") if (!lib) throw new Error("无法创建配音库") 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 bde83ea04..5358b410f 100644 --- a/apps/web/src/pages/voice-materials/hooks/useVoiceMaterials/useVoiceMaterialData.ts +++ b/apps/web/src/pages/voice-materials/hooks/useVoiceMaterials/useVoiceMaterialData.ts @@ -24,7 +24,7 @@ export function useVoiceMaterialData({ keyword, gender, tagIds }: UseVoiceMateri // ── 获取 voice 类型素材库 ───────────────────────────────── const { data: libraries = [] } = useQuery({ queryKey: ["asset-libraries"], - queryFn: getAssetLibraries, + queryFn: () => getAssetLibraries(), staleTime: 60_000, }) diff --git a/apps/web/src/pages/voices/hooks/useVoiceUpload.ts b/apps/web/src/pages/voices/hooks/useVoiceUpload.ts index eb25d6fa5..47921745e 100644 --- a/apps/web/src/pages/voices/hooks/useVoiceUpload.ts +++ b/apps/web/src/pages/voices/hooks/useVoiceUpload.ts @@ -26,7 +26,7 @@ export function useVoiceUpload({ showToast }: UseVoiceUploadProps) { /* 获取或创建默认配音库 */ const libs = await queryClient.fetchQuery({ queryKey: ["asset-libraries"], - queryFn: getAssetLibraries, + queryFn: () => getAssetLibraries(), }) const lib = libs.find((l) => l.kind === "voice") if (!lib) throw new Error("配音库不存在,请先在配音库页面创建") diff --git a/apps/web/src/test/pages/generate/templateFallback.test.ts b/apps/web/src/test/pages/generate/templateFallback.test.ts index 8c9cc72fc..524fb9f70 100644 --- a/apps/web/src/test/pages/generate/templateFallback.test.ts +++ b/apps/web/src/test/pages/generate/templateFallback.test.ts @@ -24,7 +24,14 @@ function makeTemplate(partial: Partial & { id: string }): Editi font_size: 28, position: "top", }, - subtitle_config: { enabled: true, position: "bottom", font: "", color: "", size: 20, animation: "" }, + subtitle_config: { + enabled: true, + position: "bottom", + font: "", + color: "", + size: 20, + animation: "", + }, bgm_config: { enabled: false, music_id: "" }, segments: [{ segment_order: 0, material_type: null }], is_active: true, diff --git a/apps/web/src/test/pages/generate/useMaterialLibrary.test.tsx b/apps/web/src/test/pages/generate/useMaterialLibrary.test.tsx index 192b4b904..c1cba4746 100644 --- a/apps/web/src/test/pages/generate/useMaterialLibrary.test.tsx +++ b/apps/web/src/test/pages/generate/useMaterialLibrary.test.tsx @@ -30,9 +30,7 @@ function createWrapper() { defaultOptions: { queries: { retry: false, gcTime: 0 } }, }) return ({ children }: { children: ReactNode }) => - ( - {children} - ) as ReactNode + ({children}) as ReactNode } beforeEach(() => { diff --git a/apps/web/src/test/pages/generate/useTemplateSelection.test.tsx b/apps/web/src/test/pages/generate/useTemplateSelection.test.tsx index c891fe854..44967c8bb 100644 --- a/apps/web/src/test/pages/generate/useTemplateSelection.test.tsx +++ b/apps/web/src/test/pages/generate/useTemplateSelection.test.tsx @@ -11,14 +11,16 @@ import { renderHook, waitFor, act } from "@testing-library/react" import { QueryClient, QueryClientProvider } from "@tanstack/react-query" import type { ReactNode } from "react" -// antd message mock(拦截 toast) -const messageMock = { - warning: vi.fn(), - error: vi.fn(), - success: vi.fn(), - info: vi.fn(), - loading: vi.fn(() => vi.fn()), -} +// antd message mock(拦截 toast)——vi.hoisted 保证 mock 工厂可引用 +const { messageMock } = vi.hoisted(() => ({ + messageMock: { + warning: vi.fn(), + error: vi.fn(), + success: vi.fn(), + info: vi.fn(), + loading: vi.fn(() => vi.fn()), + }, +})) vi.mock("antd", () => ({ message: messageMock })) vi.mock("@/api/editing-planner", () => ({ @@ -68,9 +70,7 @@ function createWrapper() { defaultOptions: { queries: { retry: false, gcTime: 0 } }, }) return ({ children }: { children: ReactNode }) => - ( - {children} - ) as ReactNode + ({children}) as ReactNode } beforeEach(() => { @@ -125,10 +125,7 @@ describe("useTemplateSelection (#1777)", () => { }) it("handleInvalidTemplate:当前模板失效时自动切到第一个有效模板并 toast", async () => { - mockGetTemplates.mockResolvedValueOnce([ - tpl("bad", { segments: [] }), - tpl("good"), - ]) + mockGetTemplates.mockResolvedValueOnce([tpl("bad", { segments: [] }), tpl("good")]) const { result } = renderHook(() => useTemplateSelection(), { wrapper: createWrapper() }) // 自动选中有效模板 good(bad 无片段不会被自动选中) await waitFor(() => expect(result.current.selectedTemplate).toBe("good")) @@ -156,9 +153,7 @@ describe("useTemplateSelection (#1777)", () => { result.current.handleInvalidTemplate() }) await waitFor(() => expect(result.current.selectedTemplate).toBe("")) - expect(messageMock.warning).toHaveBeenCalledWith( - expect.stringContaining("没有可用模板"), - ) + expect(messageMock.warning).toHaveBeenCalledWith(expect.stringContaining("没有可用模板")) }) it("失效模板 ID 不写入任何持久化存储", async () => {