Skip to content

Commit 1061484

Browse files
authored
Merge pull request #62344 from software-mansion-labs/borys3kk-navigation-accounts-tab-not-saved
Save the last visited path for the Accounts pages
2 parents e120239 + 6da93ec commit 1061484

File tree

10 files changed

+140
-73
lines changed

10 files changed

+140
-73
lines changed

src/CONST.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6422,7 +6422,10 @@ const CONST = {
64226422
ACTIVE_WORKSPACE_ID: 'ACTIVE_WORKSPACE_ID',
64236423
RETRY_LAZY_REFRESHED: 'RETRY_LAZY_REFRESHED',
64246424
LAST_REFRESH_TIMESTAMP: 'LAST_REFRESH_TIMESTAMP',
6425-
LAST_VISITED_WORKSPACES_TAB_PATH: 'LAST_VISITED_WORKSPACES_TAB_PATH',
6425+
LAST_VISITED_TAB_PATH: {
6426+
WORKSPACES: 'LAST_VISITED_WORKSPACES_TAB_PATH',
6427+
SETTINGS: 'LAST_VISITED_SETTINGS_TAB_PATH',
6428+
},
64266429
},
64276430

64286431
RESERVATION_TYPE: {

src/components/Navigation/NavigationTabBar/index.tsx

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,12 @@ import clearSelectedText from '@libs/clearSelectedText/clearSelectedText';
2323
import getPlatform from '@libs/getPlatform';
2424
import interceptAnonymousUser from '@libs/interceptAnonymousUser';
2525
import {getPreservedNavigatorState} from '@libs/Navigation/AppNavigator/createSplitNavigator/usePreserveNavigatorState';
26-
import {getLastVisitedWorkspacesTabPath, getLastVisitedWorkspaceTabScreen, getWorkspacesTabStateFromSessionStorage} from '@libs/Navigation/helpers/getLastVisitedWorkspaceTabScreen';
26+
import {
27+
getLastVisitedTabPath,
28+
getLastVisitedWorkspaceTabScreen,
29+
getSettingsTabStateFromSessionStorage,
30+
getWorkspacesTabStateFromSessionStorage,
31+
} from '@libs/Navigation/helpers/lastVisitedTabPathUtils';
2732
import {buildCannedSearchQuery, buildSearchQueryJSON, buildSearchQueryString} from '@libs/SearchQueryUtils';
2833
import type {BrickRoad} from '@libs/WorkspacesSettingsUtils';
2934
import {getChatTabBrickRoad} from '@libs/WorkspacesSettingsUtils';
@@ -121,9 +126,17 @@ function NavigationTabBar({selectedTab, isTooltipAllowed = false, isTopLevelBar
121126
return;
122127
}
123128
interceptAnonymousUser(() => {
129+
const settingsTabState = getSettingsTabStateFromSessionStorage();
130+
if (settingsTabState && !shouldUseNarrowLayout) {
131+
const lastVisitedSettingsRoute = getLastVisitedTabPath(settingsTabState);
132+
if (lastVisitedSettingsRoute) {
133+
Navigation.navigate(lastVisitedSettingsRoute);
134+
return;
135+
}
136+
}
124137
Navigation.navigate(ROUTES.SETTINGS);
125138
});
126-
}, [selectedTab]);
139+
}, [selectedTab, shouldUseNarrowLayout]);
127140

128141
/**
129142
* The settings tab is related to SettingsSplitNavigator and WorkspaceSplitNavigator.
@@ -185,7 +198,7 @@ function NavigationTabBar({selectedTab, isTooltipAllowed = false, isTopLevelBar
185198
// If the path stored in the session storage leads to a settings screen, we just navigate to it on a wide layout.
186199
// On a small screen, we want to go to the page containing the bottom tab bar (ROUTES.SETTINGS or ROUTES.SETTINGS_WORKSPACES) when changing tabs
187200
if (workspacesTabState && !shouldUseNarrowLayout) {
188-
const lastVisitedSettingsRoute = getLastVisitedWorkspacesTabPath(workspacesTabState);
201+
const lastVisitedSettingsRoute = getLastVisitedTabPath(workspacesTabState);
189202
if (lastVisitedSettingsRoute) {
190203
Navigation.navigate(lastVisitedSettingsRoute);
191204
return;

src/libs/Navigation/NavigationRoot.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ import AppNavigator from './AppNavigator';
2727
import {cleanPreservedNavigatorStates} from './AppNavigator/createSplitNavigator/usePreserveNavigatorState';
2828
import customGetPathFromState from './helpers/customGetPathFromState';
2929
import getAdaptedStateFromPath from './helpers/getAdaptedStateFromPath';
30-
import {saveWorkspacesTabPathToSessionStorage} from './helpers/getLastVisitedWorkspaceTabScreen';
3130
import {isWorkspacesTabScreenName} from './helpers/isNavigatorName';
31+
import {saveSettingsTabPathToSessionStorage, saveWorkspacesTabPathToSessionStorage} from './helpers/lastVisitedTabPathUtils';
3232
import {linkingConfig} from './linkingConfig';
3333
import Navigation, {navigationRef} from './Navigation';
3434

@@ -75,6 +75,8 @@ function parseAndLogRoute(state: NavigationState) {
7575
Navigation.setIsNavigationReady();
7676
if (isWorkspacesTabScreenName(state.routes.at(-1)?.name)) {
7777
saveWorkspacesTabPathToSessionStorage(currentPath);
78+
} else if (state.routes.at(-1)?.name === NAVIGATORS.SETTINGS_SPLIT_NAVIGATOR) {
79+
saveSettingsTabPathToSessionStorage(currentPath);
7880
}
7981

8082
// Fullstory Page navigation tracking

src/libs/Navigation/helpers/getLastVisitedWorkspaceTabScreen/index.native.ts

Lines changed: 0 additions & 22 deletions
This file was deleted.

src/libs/Navigation/helpers/getLastVisitedWorkspaceTabScreen/index.ts

Lines changed: 0 additions & 41 deletions
This file was deleted.

src/libs/Navigation/helpers/isNavigatorName.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {SIDEBAR_TO_SPLIT, SPLIT_TO_SIDEBAR} from '@libs/Navigation/linkingConfig/RELATIONS';
2-
import type {FullScreenName, OnboardingFlowName, SplitNavigatorName, SplitNavigatorSidebarScreen, WorkspacesTabScreenName} from '@libs/Navigation/types';
2+
import type {FullScreenName, OnboardingFlowName, SplitNavigatorName, SplitNavigatorSidebarScreen, WorkspacesTabNavigatorName} from '@libs/Navigation/types';
33
import NAVIGATORS from '@src/NAVIGATORS';
44
import SCREENS from '@src/SCREENS';
55

@@ -50,7 +50,7 @@ function isSidebarScreenName(screen: string | undefined) {
5050
}
5151

5252
function isWorkspacesTabScreenName(screen: string | undefined) {
53-
return checkIfScreenHasMatchingNameToSetValues<WorkspacesTabScreenName>(screen, WORKSPACES_TAB_SET);
53+
return checkIfScreenHasMatchingNameToSetValues<WorkspacesTabNavigatorName>(screen, WORKSPACES_TAB_SET);
5454
}
5555

5656
export {isFullScreenName, isOnboardingFlowName, isSidebarScreenName, isSplitNavigatorName, isWorkspacesTabScreenName};
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import type {NavigationState, PartialState} from '@react-navigation/native';
2+
import type {Route} from '@src/ROUTES';
3+
4+
function clearSessionStorage() {}
5+
6+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
7+
function saveWorkspacesTabPathToSessionStorage(url: string) {}
8+
9+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
10+
function saveSettingsTabPathToSessionStorage(url: string) {}
11+
12+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
13+
function getLastVisitedTabPath(state: NavigationState | PartialState<NavigationState>): Route | undefined {
14+
return undefined;
15+
}
16+
17+
function getWorkspacesTabStateFromSessionStorage() {
18+
return undefined;
19+
}
20+
function getSettingsTabStateFromSessionStorage() {
21+
return undefined;
22+
}
23+
24+
function getLastVisitedWorkspaceTabScreen() {
25+
return undefined;
26+
}
27+
28+
export {
29+
clearSessionStorage,
30+
getLastVisitedWorkspaceTabScreen,
31+
getLastVisitedTabPath,
32+
saveSettingsTabPathToSessionStorage,
33+
getSettingsTabStateFromSessionStorage,
34+
saveWorkspacesTabPathToSessionStorage,
35+
getWorkspacesTabStateFromSessionStorage,
36+
};
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import type {NavigationState, PartialState} from '@react-navigation/native';
2+
import {findFocusedRoute} from '@react-navigation/native';
3+
import type {ValueOf} from 'type-fest';
4+
import getStateFromPath from '@libs/Navigation/helpers/getStateFromPath';
5+
import CONST from '@src/CONST';
6+
import type {Route} from '@src/ROUTES';
7+
8+
type LastVisitedTabPathKey = ValueOf<typeof CONST.SESSION_STORAGE_KEYS.LAST_VISITED_TAB_PATH>;
9+
10+
/**
11+
* Clears all session storage data.
12+
*/
13+
function clearSessionStorage() {
14+
sessionStorage.clear();
15+
}
16+
17+
/**
18+
* Generic function to save a path to session storage by key
19+
*/
20+
function saveTabPathToSessionStorage(key: LastVisitedTabPathKey, url: string) {
21+
sessionStorage.setItem(key, url);
22+
}
23+
24+
/**
25+
* Converts stored path to navigation state
26+
*/
27+
function getTabStateFromSessionStorage(key: LastVisitedTabPathKey) {
28+
const path = sessionStorage.getItem(key) as Route | undefined;
29+
if (!path) {
30+
return undefined;
31+
}
32+
return getStateFromPath(path);
33+
}
34+
35+
/**
36+
* Generic function to extract the path from currently focused route
37+
*/
38+
function getLastVisitedTabPath(state: NavigationState | PartialState<NavigationState>) {
39+
const focusedRoute = findFocusedRoute(state);
40+
if (!focusedRoute) {
41+
return undefined;
42+
}
43+
return focusedRoute.path as Route;
44+
}
45+
46+
function saveWorkspacesTabPathToSessionStorage(url: string) {
47+
saveTabPathToSessionStorage(CONST.SESSION_STORAGE_KEYS.LAST_VISITED_TAB_PATH.WORKSPACES, url);
48+
}
49+
50+
function getWorkspacesTabStateFromSessionStorage() {
51+
return getTabStateFromSessionStorage(CONST.SESSION_STORAGE_KEYS.LAST_VISITED_TAB_PATH.WORKSPACES);
52+
}
53+
54+
function saveSettingsTabPathToSessionStorage(url: string) {
55+
saveTabPathToSessionStorage(CONST.SESSION_STORAGE_KEYS.LAST_VISITED_TAB_PATH.SETTINGS, url);
56+
}
57+
58+
function getSettingsTabStateFromSessionStorage() {
59+
return getTabStateFromSessionStorage(CONST.SESSION_STORAGE_KEYS.LAST_VISITED_TAB_PATH.SETTINGS);
60+
}
61+
62+
function getLastVisitedWorkspaceTabScreen() {
63+
const workspacesTabState = getWorkspacesTabStateFromSessionStorage();
64+
return workspacesTabState?.routes?.at(-1)?.state?.routes?.at(-1)?.name;
65+
}
66+
67+
export {
68+
clearSessionStorage,
69+
getLastVisitedWorkspaceTabScreen,
70+
getLastVisitedTabPath,
71+
saveSettingsTabPathToSessionStorage,
72+
getSettingsTabStateFromSessionStorage,
73+
saveWorkspacesTabPathToSessionStorage,
74+
getWorkspacesTabStateFromSessionStorage,
75+
};

src/libs/Navigation/types.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2051,7 +2051,8 @@ type SearchFullscreenNavigatorName = typeof NAVIGATORS.SEARCH_FULLSCREEN_NAVIGAT
20512051

20522052
type FullScreenName = SplitNavigatorName | SearchFullscreenNavigatorName;
20532053

2054-
type WorkspacesTabScreenName = typeof NAVIGATORS.WORKSPACE_HUB_SPLIT_NAVIGATOR | typeof NAVIGATORS.WORKSPACE_SPLIT_NAVIGATOR;
2054+
// There are two split navigators which can be displayed when the Workspaces tab is selected
2055+
type WorkspacesTabNavigatorName = typeof NAVIGATORS.WORKSPACE_HUB_SPLIT_NAVIGATOR | typeof NAVIGATORS.WORKSPACE_SPLIT_NAVIGATOR;
20552056

20562057
type WorkspaceScreenName = keyof WorkspaceSplitNavigatorParamList;
20572058

@@ -2136,5 +2137,5 @@ export type {
21362137
TestDriveModalNavigatorParamList,
21372138
WorkspaceScreenName,
21382139
TestDriveDemoNavigatorParamList,
2139-
WorkspacesTabScreenName,
2140+
WorkspacesTabNavigatorName,
21402141
};

src/libs/actions/SignInRedirect.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Onyx from 'react-native-onyx';
22
import {getMicroSecondOnyxErrorWithMessage} from '@libs/ErrorUtils';
3-
import {clearSessionStorage} from '@libs/Navigation/helpers/getLastVisitedWorkspaceTabScreen';
3+
import {clearSessionStorage} from '@libs/Navigation/helpers/lastVisitedTabPathUtils';
44
import type {OnyxKey} from '@src/ONYXKEYS';
55
import ONYXKEYS from '@src/ONYXKEYS';
66
import {clearAllPolicies} from './Policy/Policy';

0 commit comments

Comments
 (0)