Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add helper functions in getMatchingCentralPaneRouteForState #36397

Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Refactor hasRouteMatchingPolicyID and getAlreadyOpenedSettingsScreen
  • Loading branch information
WojtekBoman committed Feb 21, 2024
commit b21f8d7d0d0644dd24c400c588cd5be4a6aabc07
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import NAVIGATORS from '@src/NAVIGATORS';
import SCREENS from '@src/SCREENS';
import TAB_TO_CENTRAL_PANE_MAPPING from './TAB_TO_CENTRAL_PANE_MAPPING';

const WORKSPACES_SCREENS = TAB_TO_CENTRAL_PANE_MAPPING[SCREENS.WORKSPACE.INITIAL].concat(TAB_TO_CENTRAL_PANE_MAPPING[SCREENS.ALL_SETTINGS]);

/**
* @param state - react-navigation state
*/
Expand Down Expand Up @@ -31,18 +33,23 @@ const getTopMostReportIDFromRHP = (state: State): string => {
return '';
};

// Function that checks if the given route has a policyID equal to the id provided in the function params
// Check if the given route has a policyID equal to the id provided in the function params
function hasRouteMatchingPolicyID(route: NavigationPartialRoute<CentralPaneName>, policyID?: string) {
return (
route?.params &&
'params' in route?.params &&
route.params.params &&
'policyID' in (route.params.params as Record<string, string | undefined>) &&
(route.params.params as Record<string, string | undefined>).policyID === policyID
);
if (!route.params) {
return false;
}

const params = `params` in route?.params ? (route.params.params as Record<string, string | undefined>) : undefined;
hayata-suenaga marked this conversation as resolved.
Show resolved Hide resolved

// If params are not defined, then we need to check if the policyID exists
if (!params) {
return !policyID;
}

return 'policyID' in params && params.policyID === policyID;
}

// Function that restores already opened screen in the settings tab. Thanks to this function, we are able to open the already selected screen in the workspace settings when we return from another tab.
// Get already opened settings screen within the policy
function getAlreadyOpenedSettingsScreen(rootState?: State, policyID?: string): keyof CentralPaneNavigatorParamList | undefined {
if (!rootState) {
return undefined;
Expand All @@ -51,21 +58,18 @@ function getAlreadyOpenedSettingsScreen(rootState?: State, policyID?: string): k
// If one of the screen from WORKSPACES_SCREENS is now in the navigation state, we can decide which screen we should display.
// A screen from the navigation state can be pushed to the navigation state again only if it has a matching policyID with the currently selected workspace.
// Otherwise, when we switch the workspace, we want to display the initial screen in the settings tab.
const WORKSPACES_SCREENS = TAB_TO_CENTRAL_PANE_MAPPING[SCREENS.WORKSPACE.INITIAL].concat(TAB_TO_CENTRAL_PANE_MAPPING[SCREENS.ALL_SETTINGS]);

const alreadyOpenedSettingsTab = rootState.routes
.filter((item) => item.params && 'screen' in item.params && WORKSPACES_SCREENS.includes(item.params.screen as keyof CentralPaneNavigatorParamList))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's a lot of type assertion going on (here and in other places). I gave it a quick look and I couldn't come up with any quick fixes. Do you have any ideas how we could at least reduce the number of type assertions (something as SomeType)?

Copy link
Contributor Author

@WojtekBoman WojtekBoman Feb 21, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, I am trying to figure it out, but it's not easy because the screen is unknown and when we want to use this variable we need to have a type for it. I'll try to solve it somehow, but I don't know if we can avoid using type assertions here. Could you take a look at the latest update in this PR? It should resolve the comments above :)

.at(-1);

if (
alreadyOpenedSettingsTab?.params &&
'screen' in alreadyOpenedSettingsTab?.params &&
hasRouteMatchingPolicyID(alreadyOpenedSettingsTab as NavigationPartialRoute<CentralPaneName>, policyID)
) {
return alreadyOpenedSettingsTab?.params?.screen as keyof CentralPaneNavigatorParamList;
if (!hasRouteMatchingPolicyID(alreadyOpenedSettingsTab as NavigationPartialRoute<CentralPaneName>, policyID)) {
return undefined;
}

return undefined;
const settingsScreen =
alreadyOpenedSettingsTab?.params && 'screen' in alreadyOpenedSettingsTab?.params ? (alreadyOpenedSettingsTab?.params?.screen as keyof CentralPaneNavigatorParamList) : undefined;

return settingsScreen;
}

// Get matching central pane route for bottom tab navigator. e.g HOME -> REPORT
Expand Down
Loading