Parcourir la source

fix: use ref pattern for auto-trigger in Steps 0/1/2 to prevent stale closure

nonvioce il y a 6 mois
Parent
commit
03f26d7935

+ 5 - 1
src/app/features/novel-writer/components/pipeline/Step0ControlCard.tsx

@@ -66,12 +66,13 @@ export default function Step0ControlCard({
   const [selectedPlanIndex, setSelectedPlanIndex] = useState<number | null>(null);
   const [expandedPlanIndex, setExpandedPlanIndex] = useState<number | null>(null);
   const autoModeStartedRef = useRef(false);
+  const handleGenerateRef = useRef<() => void>(() => {});
 
   // Auto-mode: auto-trigger generation on mount
   useEffect(() => {
     if (autoMode && apiSettings && !autoModeStartedRef.current) {
       autoModeStartedRef.current = true;
-      const timer = setTimeout(() => handleGenerate(), 200);
+      const timer = setTimeout(() => handleGenerateRef.current(), 300);
       return () => clearTimeout(timer);
     }
   }, [autoMode, apiSettings]);
@@ -251,6 +252,9 @@ ${projectContext || '(项目文档不可用)'}
     });
   };
 
+  // Keep ref in sync for auto-mode trigger
+  handleGenerateRef.current = handleGenerate;
+
   return (
     <div className="flex-1 overflow-y-auto">
       <div className="space-y-4 max-w-2xl mx-auto">

+ 2 - 1
src/app/features/novel-writer/components/pipeline/Step2EmbedHooks.tsx

@@ -43,12 +43,13 @@ export default function Step2EmbedHooks({
   const [manualHooks, setManualHooks] = useState<string[]>(savedManualHooks);
   const [tokenUsage, setTokenUsage] = useState<string | null>(null);
   const autoModeStartedRef = useRef(false);
+  const generateHooksRef = useRef<() => Promise<void>>(async () => {});
 
   // Auto-mode: auto-trigger generation on mount
   useEffect(() => {
     if (autoMode && apiSettings && !autoModeStartedRef.current) {
       autoModeStartedRef.current = true;
-      const timer = setTimeout(() => generateHookOptions(), 200);
+      const timer = setTimeout(() => generateHooksRef.current(), 300);
       return () => clearTimeout(timer);
     }
   }, [autoMode, apiSettings]);

+ 1 - 0
src/app/features/novel-writer/components/pipeline/Step4ContentEditor.tsx

@@ -676,6 +676,7 @@ ${antiText}
   // Auto-mode: auto-trigger generation on mount
   const autoContentStartedRef = useRef(false);
   const autoDeAIStartedRef = useRef(false);
+  const generateContentRef = useRef<() => Promise<void>>(async () => {});
   useEffect(() => {
     if (autoMode && apiSettings && !autoContentStartedRef.current && !isGenerating) {
       autoContentStartedRef.current = true;