From 165374b986d2e18a6b671ef757cf2d9e57bdbe87 Mon Sep 17 00:00:00 2001 From: zhongyingmin Date: Mon, 22 Jun 2026 14:32:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=8E=E5=9C=BA?= =?UTF-8?q?=E6=99=AF=E8=BF=94=E5=9B=9E=E9=A6=96=E9=A1=B5=E6=97=B6=E8=AF=AF?= =?UTF-8?q?=E5=BC=B9=E7=BB=AD=E5=AD=A6=E6=8F=90=E7=A4=BA=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题:用户从对话/体悟/内化场景点击「离开」返回故居首页时,会立即弹出「继续学习」提示,干扰正常流程。 修复: - 新增 previousPath 模块级变量记录上一个路由 - 检测进入首页时上一个路由是否为本故居的 place/reflection/internalization/draw - 如果是刚从场景离开的,不弹窗,让用户自主选择下一步 影响文件: - src/hooks/useResidenceContinue.ts Co-Authored-By: Claude Opus 4.8 (1M context) --- src/hooks/useResidenceContinue.ts | 39 +++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/src/hooks/useResidenceContinue.ts b/src/hooks/useResidenceContinue.ts index 7fab6f3..cfda116 100644 --- a/src/hooks/useResidenceContinue.ts +++ b/src/hooks/useResidenceContinue.ts @@ -1,5 +1,5 @@ import { useCallback, useEffect, useRef, useState } from 'react' -import { useNavigate, useParams } from 'react-router-dom' +import { useNavigate, useParams, useLocation } from 'react-router-dom' import { usePuzzleStore } from '@/store/puzzleStore' import { getResidenceStageCompletion, @@ -15,6 +15,12 @@ import { useVideoContextSafe } from '@/contexts/VideoContext' */ const promptedResidences = new Set() +/** + * 记录上一次访问的路由,用于判断是否刚从场景离开。 + * 模块级变量,跨 hook 实例共享。 + */ +let previousPath = '' + export interface UseResidenceContinueParams { /** 故居标识(同时也是路由里的 starName),如 'maozedong' */ residence: string @@ -44,6 +50,7 @@ export interface UseResidenceContinueResult { * 3. 本会话内该故居尚未自动弹过 * 4. 故居已解锁 && 已开始 && 未全部完成 * 5. 能解析出有效的续学目标 + * 6. 不是刚从本故居场景页面离开的(避免干扰正常流程) * * 弹一次后即标记,之后再回到 home 不再自动弹(由首页的三个阶段按钮继续)。 */ @@ -54,6 +61,7 @@ export function useResidenceContinue({ reflectionRoute, }: UseResidenceContinueParams): UseResidenceContinueResult { const navigate = useNavigate() + const location = useLocation() const { moduleName } = useParams<{ moduleName: string }>() const video = useVideoContextSafe() const contentVisible = video ? video.isContentVisible : true @@ -71,6 +79,24 @@ export function useResidenceContinue({ // 没开始过的新故居不打扰,让学生自己点「一」正常开始 if (!isResidenceStarted(residence, puzzles)) return + // 检查上一个路由:如果是从本故居的 place/reflection/internalization 来的,不弹 + // 例如从 /revolutionary/maozedong/place1 回到 /revolutionary/maozedong/home + const currentPath = location.pathname + const isFromResidenceScene = + previousPath && + (previousPath.includes(`/${residence}/place`) || + previousPath.includes(`/${residence}/reflection`) || + previousPath.includes(`/${residence}/internalization`) || + previousPath.includes(`/${residence}/draw`)) + + // 更新 previousPath 供下次判断 + previousPath = currentPath + + if (isFromResidenceScene) { + // 刚从场景离开,不弹窗 + return + } + const completion = getResidenceStageCompletion(residence, puzzles) if (completion.residenceComplete) return @@ -84,7 +110,16 @@ export function useResidenceContinue({ targetRef.current = target promptedResidences.add(residence) setVisible(true) - }, [isLoaded, storeReady, contentVisible, residence, puzzles, lastVisitedPlace, reflectionRoute]) + }, [ + isLoaded, + storeReady, + contentVisible, + residence, + puzzles, + lastVisitedPlace, + reflectionRoute, + location.pathname, + ]) const onContinue = useCallback(() => { setVisible(false)