From 305f054d4ca869edc20b8a0a1914c3067fbb8137 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Fri, 7 Aug 2026 18:48:13 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E9=80=89=E6=8B=A9=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E5=BA=93=E5=90=8E=E8=87=AA=E5=8A=A8=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=20AI=20=E6=99=BA=E8=83=BD=E5=8C=B9=E9=85=8D=20(#1256)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - useStep2Materials 添加 useEffect,auto 模式下选择视频库自动调用 handleSmartMatch - 使用 autoTriggeredRef 防止同一视频库重复触发 - 条件:auto 模式 + 视频库已选 + 素材加载完成 + 素材数>0 - 用户不再需要手动点击「让AI帮你选」按钮 - 已有匹配结果后按钮自动变为「重新选择」 --- .../pages/generate/hooks/useStep2Materials.ts | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/apps/web/src/pages/generate/hooks/useStep2Materials.ts b/apps/web/src/pages/generate/hooks/useStep2Materials.ts index 085825162..24fcd22fa 100755 --- a/apps/web/src/pages/generate/hooks/useStep2Materials.ts +++ b/apps/web/src/pages/generate/hooks/useStep2Materials.ts @@ -2,7 +2,7 @@ * Step 2 素材选择 Hook * 组合素材库加载 + 智能匹配两个子 Hook */ -import { useCallback } from "react" +import { useCallback, useEffect, useRef } from "react" import { formatDuration } from "../utils/formatDuration" import { useMaterialLibrary } from "./step2-materials/useMaterialLibrary" import { useSmartMatch } from "./step2-materials/useSmartMatch" @@ -34,6 +34,22 @@ export function useStep2Materials({ onSmartSelectedIdsChange, }) + /* ── 自动触发智能匹配:选择视频库后自动调用 ── */ + const autoTriggeredRef = useRef("") + useEffect(() => { + // 仅在 auto 模式 + 素材加载完成后自动触发 + if (materialMode !== "auto") return + if (!selectedLibraryId) return + if (materialsLoading) return + if (materials.items.length === 0) return + // 防止同一视频库重复触发 + if (autoTriggeredRef.current === selectedLibraryId) return + + autoTriggeredRef.current = selectedLibraryId + smartMatch.handleSmartMatch() + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [selectedLibraryId, materialMode, materialsLoading, materials.items.length]) + /* ── 手动选择素材 ── */ const handleToggleMaterial = useCallback( (materialId: string) => { -- 2.54.0 From 516aeab8de79e6dd35d099b89d82b9f6407f09ac Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Fri, 7 Aug 2026 18:53:42 +0800 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20AI=20Code=20Rev?= =?UTF-8?q?iew=20=E6=8F=90=E5=87=BA=E7=9A=843=E4=B8=AA=E9=98=BB=E5=A1=9E?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 模式切换失效:使用复合 triggerKey (libraryId_mode) 替代单一 libraryId 模式切换时 key 变化会重新触发自动匹配 2. 闭包陷阱:将 handleSmartMatch 从 smartMatch 解构并加入依赖项 handleSmartMatch 由 useCallback 包装,引用稳定 3. 依赖粒度:materials.items 替代 materials.items.length 素材内容变化也能正确触发重新匹配 --- .../src/pages/generate/hooks/useStep2Materials.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/apps/web/src/pages/generate/hooks/useStep2Materials.ts b/apps/web/src/pages/generate/hooks/useStep2Materials.ts index 24fcd22fa..06f41797b 100755 --- a/apps/web/src/pages/generate/hooks/useStep2Materials.ts +++ b/apps/web/src/pages/generate/hooks/useStep2Materials.ts @@ -36,19 +36,20 @@ export function useStep2Materials({ /* ── 自动触发智能匹配:选择视频库后自动调用 ── */ const autoTriggeredRef = useRef("") + const { handleSmartMatch } = smartMatch useEffect(() => { // 仅在 auto 模式 + 素材加载完成后自动触发 if (materialMode !== "auto") return if (!selectedLibraryId) return if (materialsLoading) return if (materials.items.length === 0) return - // 防止同一视频库重复触发 - if (autoTriggeredRef.current === selectedLibraryId) return + // 防止同一视频库+同一模式重复触发(模式切换时 key 变化会重新触发) + const triggerKey = `${selectedLibraryId}_${materialMode}` + if (autoTriggeredRef.current === triggerKey) return - autoTriggeredRef.current = selectedLibraryId - smartMatch.handleSmartMatch() - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [selectedLibraryId, materialMode, materialsLoading, materials.items.length]) + autoTriggeredRef.current = triggerKey + handleSmartMatch() + }, [selectedLibraryId, materialMode, materialsLoading, materials.items, handleSmartMatch]) /* ── 手动选择素材 ── */ const handleToggleMaterial = useCallback( -- 2.54.0 From 34b19d2aaa0a245d0fc36d265cfabe74eed51ea5 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Fri, 7 Aug 2026 19:00:27 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E6=97=B6=E8=87=AA=E5=8A=A8=E5=8C=B9=E9=85=8D?= =?UTF-8?q?=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 离开 auto 模式时重置 autoTriggeredRef,确保每次进入 auto 模式 (包括从 manual 切回 auto)都能重新触发智能匹配 --- .../src/pages/generate/hooks/useStep2Materials.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/apps/web/src/pages/generate/hooks/useStep2Materials.ts b/apps/web/src/pages/generate/hooks/useStep2Materials.ts index 06f41797b..0d5a8c406 100755 --- a/apps/web/src/pages/generate/hooks/useStep2Materials.ts +++ b/apps/web/src/pages/generate/hooks/useStep2Materials.ts @@ -38,16 +38,18 @@ export function useStep2Materials({ const autoTriggeredRef = useRef("") const { handleSmartMatch } = smartMatch useEffect(() => { - // 仅在 auto 模式 + 素材加载完成后自动触发 - if (materialMode !== "auto") return + // 离开 auto 模式时重置,确保下次进入 auto 模式能重新触发 + if (materialMode !== "auto") { + autoTriggeredRef.current = "" + return + } if (!selectedLibraryId) return if (materialsLoading) return if (materials.items.length === 0) return - // 防止同一视频库+同一模式重复触发(模式切换时 key 变化会重新触发) - const triggerKey = `${selectedLibraryId}_${materialMode}` - if (autoTriggeredRef.current === triggerKey) return + // 防止同一视频库重复触发 + if (autoTriggeredRef.current === selectedLibraryId) return - autoTriggeredRef.current = triggerKey + autoTriggeredRef.current = selectedLibraryId handleSmartMatch() }, [selectedLibraryId, materialMode, materialsLoading, materials.items, handleSmartMatch]) -- 2.54.0