diff --git a/src/nav/Navigator.tsx b/src/nav/Navigator.tsx index 5ef66ba..1b9405d 100644 --- a/src/nav/Navigator.tsx +++ b/src/nav/Navigator.tsx @@ -30,6 +30,8 @@ interface Nav { /** صفحه‌ی فعلی را عوض می‌کند بدونِ اضافه کردن به تاریخچه. */ replace: (route: Route) => void; back: () => void; + /** از صفحه‌ی فعلی بیرون می‌رود حتی اگر برگه‌ای باز باشد (برگه هم بسته می‌شود)؛ `back` فقط خودِ برگه را می‌بندد. */ + leave: () => void; switchTab: (tab: TabName) => void; } @@ -122,6 +124,13 @@ export function NavigatorProvider({ initial, children }: { initial: Route; child else 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) => { // زدنِ همان تبی که باز و ریشه است صفحه را از نو نمی‌سازد (قبلاً دوباره بار می‌شد)؛ مثلِ اپ‌های بومی به // بالای همان صفحه برمی‌گردد. @@ -141,9 +150,10 @@ export function NavigatorProvider({ initial, children }: { initial: Route; child push, replace, back, + leave, switchTab, }; - }, [stack, direction, reselect, push, replace, back, switchTab]); + }, [stack, direction, reselect, push, replace, back, leave, switchTab]); return ( diff --git a/src/screens/QuizScreen.tsx b/src/screens/QuizScreen.tsx index a7ff0d2..467cb89 100644 --- a/src/screens/QuizScreen.tsx +++ b/src/screens/QuizScreen.tsx @@ -405,7 +405,7 @@ export function QuizScreen({ lessonId, nodeId }: { lessonId?: number; nodeId?: s

setConfirmExit(false)}>ادامه می‌دم - { setConfirmExit(false); nav.back(); }}>خروج + nav.leave()}>خروج