Quiz: 'خروج' leaves the quiz even though the confirm sheet holds a back step (nav.leave)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-16 02:18:10 +03:30
parent 2e7e5823cc
commit 24a6f7c570
2 changed files with 12 additions and 2 deletions

View File

@@ -30,6 +30,8 @@ interface Nav {
/** صفحه‌ی فعلی را عوض می‌کند بدونِ اضافه کردن به تاریخچه. */ /** صفحه‌ی فعلی را عوض می‌کند بدونِ اضافه کردن به تاریخچه. */
replace: (route: Route) => void; replace: (route: Route) => void;
back: () => void; back: () => void;
/** از صفحه‌ی فعلی بیرون می‌رود حتی اگر برگه‌ای باز باشد (برگه هم بسته می‌شود)؛ `back` فقط خودِ برگه را می‌بندد. */
leave: () => void;
switchTab: (tab: TabName) => void; switchTab: (tab: TabName) => void;
} }
@@ -122,6 +124,13 @@ export function NavigatorProvider({ initial, children }: { initial: Route; child
else stepBack(); else stepBack();
}, [stepBack]); }, [stepBack]);
const leave = useCallback(() => {
setSteps([]);
const s = stackRef.current;
if (s.length > 1) setState({ stack: s.slice(0, -1), direction: 'back' });
else if (s[0].name !== 'home') setState({ stack: [{ name: 'home' }], direction: 'back' });
}, []);
const switchTab = useCallback((tab: TabName) => { const switchTab = useCallback((tab: TabName) => {
// زدنِ همان تبی که باز و ریشه است صفحه را از نو نمی‌سازد (قبلاً دوباره بار می‌شد)؛ مثلِ اپ‌های بومی به // زدنِ همان تبی که باز و ریشه است صفحه را از نو نمی‌سازد (قبلاً دوباره بار می‌شد)؛ مثلِ اپ‌های بومی به
// بالای همان صفحه برمی‌گردد. // بالای همان صفحه برمی‌گردد.
@@ -141,9 +150,10 @@ export function NavigatorProvider({ initial, children }: { initial: Route; child
push, push,
replace, replace,
back, back,
leave,
switchTab, switchTab,
}; };
}, [stack, direction, reselect, push, replace, back, switchTab]); }, [stack, direction, reselect, push, replace, back, leave, switchTab]);
return ( return (
<NavContext.Provider value={value}> <NavContext.Provider value={value}>

View File

@@ -405,7 +405,7 @@ export function QuizScreen({ lessonId, nodeId }: { lessonId?: number; nodeId?: s
</p> </p>
<div className="flex flex-col gap-2.5"> <div className="flex flex-col gap-2.5">
<PrimaryButton color={color} onClick={() => setConfirmExit(false)}>ادامه می‌دم</PrimaryButton> <PrimaryButton color={color} onClick={() => setConfirmExit(false)}>ادامه می‌دم</PrimaryButton>
<SecondaryButton onClick={() => { setConfirmExit(false); nav.back(); }}>خروج</SecondaryButton> <SecondaryButton onClick={() => nav.leave()}>خروج</SecondaryButton>
</div> </div>
</Sheet> </Sheet>