Skip to content

Commit

Permalink
Remove SCREENS.WORKSPACES_CENTRAL_PANE
Browse files Browse the repository at this point in the history
  • Loading branch information
WojtekBoman committed Apr 12, 2024
1 parent 8f90c25 commit e3644d1
Show file tree
Hide file tree
Showing 6 changed files with 172 additions and 86 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import useThemeStyles from '@hooks/useThemeStyles';
import useWindowDimensions from '@hooks/useWindowDimensions';
import createCustomFullScreenNavigator from '@libs/Navigation/AppNavigator/createCustomFullScreenNavigator';
import getRootNavigatorScreenOptions from '@libs/Navigation/AppNavigator/getRootNavigatorScreenOptions';
import * as ModalStackNavigators from '@libs/Navigation/AppNavigator/ModalStackNavigators';
import SCREENS from '@src/SCREENS';

const loadWorkspaceInitialPage = () => require('../../../../pages/workspace/WorkspaceInitialPage').default as React.ComponentType;
Expand All @@ -17,19 +16,85 @@ function FullScreenNavigator() {
const StyleUtils = useStyleUtils();
const {isSmallScreenWidth} = useWindowDimensions();
const screenOptions = getRootNavigatorScreenOptions(isSmallScreenWidth, styles, StyleUtils);

return (
<View style={styles.rootNavigatorContainerStyles(isSmallScreenWidth)}>
<RootStack.Navigator>
<RootStack.Navigator screenOptions={{cardStyle: styles.navigationScreenCardStyle, headerShown: false}}>
<RootStack.Screen
name={SCREENS.WORKSPACE.INITIAL}
options={screenOptions.homeScreen}
getComponent={loadWorkspaceInitialPage}
/>
<RootStack.Screen
name={SCREENS.WORKSPACES_CENTRAL_PANE}
options={screenOptions.centralPaneNavigator}
component={ModalStackNavigators.WorkspaceSettingsModalStackNavigator}
key={SCREENS.WORKSPACE.PROFILE}
name={SCREENS.WORKSPACE.PROFILE}
getComponent={() => require('@pages/workspace/WorkspaceProfilePage').default as React.ComponentType}
/>
<RootStack.Screen
key={SCREENS.WORKSPACE.CARD}
name={SCREENS.WORKSPACE.CARD}
getComponent={() => require('@pages/workspace/card/WorkspaceCardPage').default as React.ComponentType}
/>
<RootStack.Screen
key={SCREENS.WORKSPACE.WORKFLOWS}
name={SCREENS.WORKSPACE.WORKFLOWS}
getComponent={() => require('@pages/workspace/workflows/WorkspaceWorkflowsPage').default as React.ComponentType}
/>
<RootStack.Screen
key={SCREENS.WORKSPACE.REIMBURSE}
name={SCREENS.WORKSPACE.REIMBURSE}
getComponent={() => require('@pages/workspace/reimburse/WorkspaceReimbursePage').default as React.ComponentType}
/>
<RootStack.Screen
key={SCREENS.WORKSPACE.BILLS}
name={SCREENS.WORKSPACE.BILLS}
getComponent={() => require('@pages/workspace/bills/WorkspaceBillsPage').default as React.ComponentType}
/>
<RootStack.Screen
key={SCREENS.WORKSPACE.INVOICES}
name={SCREENS.WORKSPACE.INVOICES}
getComponent={() => require('@pages/workspace/invoices/WorkspaceInvoicesPage').default as React.ComponentType}
/>
<RootStack.Screen
key={SCREENS.WORKSPACE.TRAVEL}
name={SCREENS.WORKSPACE.TRAVEL}
getComponent={() => require('@pages/workspace/travel/WorkspaceTravelPage').default as React.ComponentType}
/>
<RootStack.Screen
key={SCREENS.WORKSPACE.MEMBERS}
name={SCREENS.WORKSPACE.MEMBERS}
getComponent={() => require('@pages/workspace/WorkspaceMembersPage').default as React.ComponentType}
/>

<RootStack.Screen
key={SCREENS.WORKSPACE.ACCOUNTING}
name={SCREENS.WORKSPACE.ACCOUNTING}
getComponent={() => require('@pages/workspace/accounting/WorkspaceAccountingPage').default as React.ComponentType}
/>

<RootStack.Screen
key={SCREENS.WORKSPACE.CATEGORIES}
name={SCREENS.WORKSPACE.CATEGORIES}
getComponent={() => require('@pages/workspace/categories/WorkspaceCategoriesPage').default as React.ComponentType}
/>
<RootStack.Screen
key={SCREENS.WORKSPACE.MORE_FEATURES}
name={SCREENS.WORKSPACE.MORE_FEATURES}
getComponent={() => require('@pages/workspace/WorkspaceMoreFeaturesPage').default as React.ComponentType}
/>
<RootStack.Screen
key={SCREENS.WORKSPACE.TAGS}
name={SCREENS.WORKSPACE.TAGS}
getComponent={() => require('@pages/workspace/tags/WorkspaceTagsPage').default as React.ComponentType}
/>
<RootStack.Screen
key={SCREENS.WORKSPACE.TAXES}
name={SCREENS.WORKSPACE.TAXES}
getComponent={() => require('@pages/workspace/taxes/WorkspaceTaxesPage').default as React.ComponentType}
/>
<RootStack.Screen
key={SCREENS.WORKSPACE.DISTANCE_RATES}
name={SCREENS.WORKSPACE.DISTANCE_RATES}
getComponent={() => require('@pages/workspace/distanceRates/PolicyDistanceRatesPage').default as React.ComponentType}
/>
</RootStack.Navigator>
</View>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,6 @@ const isAtLeastOneInState = (state: StackState, screenName: string): boolean =>
function adaptStateIfNecessary(state: StackState) {
const isNarrowLayout = getIsNarrowLayout();
const workspaceCentralPane = state.routes.at(-1);
const topmostWorkspaceCentralPaneRoute = workspaceCentralPane?.state?.routes[0];

// When a screen from the FullScreenNavigator is opened from the deeplink then params should be passed to SCREENS.WORKSPACE.INITIAL from the variable defined below.
const workspacesCentralPaneParams =
workspaceCentralPane?.params && 'params' in workspaceCentralPane.params ? (workspaceCentralPane.params.params as Record<string, string | undefined>) : undefined;

// There should always be WORKSPACE.INITIAL screen in the state to make sure go back works properly if we deeplinkg to a subpage of settings.
if (!isAtLeastOneInState(state, SCREENS.WORKSPACE.INITIAL)) {
Expand All @@ -28,7 +23,7 @@ function adaptStateIfNecessary(state: StackState) {
// Unshift the root screen to fill left pane.
state.routes.unshift({
name: SCREENS.WORKSPACE.INITIAL,
params: topmostWorkspaceCentralPaneRoute?.params ?? workspacesCentralPaneParams,
params: workspaceCentralPane?.params,
});
}
}
Expand All @@ -37,22 +32,15 @@ function adaptStateIfNecessary(state: StackState) {
// - WORKSPACE.INITIAL to cover left pane.
// - WORKSPACES_CENTRAL_PANE to cover central pane.
if (!isNarrowLayout) {
if (!isAtLeastOneInState(state, SCREENS.WORKSPACES_CENTRAL_PANE)) {
if (state.routes.length === 1 && state.routes[0].name === SCREENS.WORKSPACE.INITIAL) {
// @ts-expect-error Updating read only property
// noinspection JSConstantReassignment
state.stale = true; // eslint-disable-line
// Push the default settings central pane screen.
if (state.stale === true) {
state.routes.push({
name: SCREENS.WORKSPACES_CENTRAL_PANE,
state: {
routes: [
{
name: SCREENS.WORKSPACE.PROFILE,
params: state.routes[0]?.params,
},
],
},
name: SCREENS.WORKSPACE.PROFILE,
params: state.routes[0]?.params,
});
}
}
Expand Down
17 changes: 1 addition & 16 deletions src/libs/Navigation/getTopmostWorkspacesCentralPaneName.ts
Original file line number Diff line number Diff line change
@@ -1,27 +1,12 @@
import type {NavigationState, PartialState} from '@react-navigation/native';
import SCREENS from '@src/SCREENS';

// Get the name of topmost report in the navigation stack.
function getTopmostWorkspacesCentralPaneName(state: NavigationState | PartialState<NavigationState>): string | undefined {
if (!state) {
return;
}

const topmostCentralPane = state.routes.filter((route) => typeof route !== 'number' && 'name' in route && route.name === SCREENS.WORKSPACES_CENTRAL_PANE).at(-1);

if (!topmostCentralPane) {
return;
}

if (!!topmostCentralPane.params && 'screen' in topmostCentralPane.params && typeof topmostCentralPane.params.screen === 'string') {
return topmostCentralPane.params.screen;
}

if (!topmostCentralPane.state) {
return;
}

return topmostCentralPane.state?.routes.at(-1)?.name;
return state.routes.at(-1)?.name
}

export default getTopmostWorkspacesCentralPaneName;
82 changes: 39 additions & 43 deletions src/libs/Navigation/linkingConfig/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -635,49 +635,45 @@ const config: LinkingOptions<RootStackParamList>['config'] = {
[SCREENS.WORKSPACE.INITIAL]: {
path: ROUTES.WORKSPACE_INITIAL.route,
},
[SCREENS.WORKSPACES_CENTRAL_PANE]: {
screens: {
[SCREENS.WORKSPACE.PROFILE]: ROUTES.WORKSPACE_PROFILE.route,
[SCREENS.WORKSPACE.CARD]: {
path: ROUTES.WORKSPACE_CARD.route,
},
[SCREENS.WORKSPACE.WORKFLOWS]: {
path: ROUTES.WORKSPACE_WORKFLOWS.route,
},
[SCREENS.WORKSPACE.REIMBURSE]: {
path: ROUTES.WORKSPACE_REIMBURSE.route,
},
[SCREENS.WORKSPACE.BILLS]: {
path: ROUTES.WORKSPACE_BILLS.route,
},
[SCREENS.WORKSPACE.INVOICES]: {
path: ROUTES.WORKSPACE_INVOICES.route,
},
[SCREENS.WORKSPACE.TRAVEL]: {
path: ROUTES.WORKSPACE_TRAVEL.route,
},
[SCREENS.WORKSPACE.MEMBERS]: {
path: ROUTES.WORKSPACE_MEMBERS.route,
},
[SCREENS.WORKSPACE.ACCOUNTING]: {
path: ROUTES.WORKSPACE_ACCOUNTING.route,
},
[SCREENS.WORKSPACE.CATEGORIES]: {
path: ROUTES.WORKSPACE_CATEGORIES.route,
},
[SCREENS.WORKSPACE.MORE_FEATURES]: {
path: ROUTES.WORKSPACE_MORE_FEATURES.route,
},
[SCREENS.WORKSPACE.TAGS]: {
path: ROUTES.WORKSPACE_TAGS.route,
},
[SCREENS.WORKSPACE.TAXES]: {
path: ROUTES.WORKSPACE_TAXES.route,
},
[SCREENS.WORKSPACE.DISTANCE_RATES]: {
path: ROUTES.WORKSPACE_DISTANCE_RATES.route,
},
},
[SCREENS.WORKSPACE.PROFILE]: ROUTES.WORKSPACE_PROFILE.route,
[SCREENS.WORKSPACE.CARD]: {
path: ROUTES.WORKSPACE_CARD.route,
},
[SCREENS.WORKSPACE.WORKFLOWS]: {
path: ROUTES.WORKSPACE_WORKFLOWS.route,
},
[SCREENS.WORKSPACE.REIMBURSE]: {
path: ROUTES.WORKSPACE_REIMBURSE.route,
},
[SCREENS.WORKSPACE.BILLS]: {
path: ROUTES.WORKSPACE_BILLS.route,
},
[SCREENS.WORKSPACE.INVOICES]: {
path: ROUTES.WORKSPACE_INVOICES.route,
},
[SCREENS.WORKSPACE.TRAVEL]: {
path: ROUTES.WORKSPACE_TRAVEL.route,
},
[SCREENS.WORKSPACE.MEMBERS]: {
path: ROUTES.WORKSPACE_MEMBERS.route,
},
[SCREENS.WORKSPACE.ACCOUNTING]: {
path: ROUTES.WORKSPACE_ACCOUNTING.route,
},
[SCREENS.WORKSPACE.CATEGORIES]: {
path: ROUTES.WORKSPACE_CATEGORIES.route,
},
[SCREENS.WORKSPACE.MORE_FEATURES]: {
path: ROUTES.WORKSPACE_MORE_FEATURES.route,
},
[SCREENS.WORKSPACE.TAGS]: {
path: ROUTES.WORKSPACE_TAGS.route,
},
[SCREENS.WORKSPACE.TAXES]: {
path: ROUTES.WORKSPACE_TAXES.route,
},
[SCREENS.WORKSPACE.DISTANCE_RATES]: {
path: ROUTES.WORKSPACE_DISTANCE_RATES.route,
},
},
},
Expand Down
6 changes: 2 additions & 4 deletions src/libs/Navigation/linkingConfig/getAdaptedStateFromPath.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,11 +86,9 @@ function createFullScreenNavigator(route?: NavigationPartialRoute<FullScreenName
policyID,
},
});

if (route) {
routes.push({
name: SCREENS.WORKSPACES_CENTRAL_PANE,
state: getRoutesWithIndex([route]),
});
routes.push(route);
}
return {
name: NAVIGATORS.FULL_SCREEN_NAVIGATOR,
Expand Down
56 changes: 55 additions & 1 deletion src/libs/Navigation/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -663,7 +663,61 @@ type FullScreenNavigatorParamList = {
[SCREENS.WORKSPACE.INITIAL]: {
policyID: string;
};
[SCREENS.WORKSPACES_CENTRAL_PANE]: NavigatorScreenParams<WorkspacesCentralPaneNavigatorParamList>;
[SCREENS.WORKSPACE.PROFILE]: {
policyID: string;
};
[SCREENS.WORKSPACE.CARD]: {
policyID: string;
};
[SCREENS.WORKSPACE.WORKFLOWS]: {
policyID: string;
};
[SCREENS.WORKSPACE.WORKFLOWS_APPROVER]: {
policyID: string;
};
[SCREENS.WORKSPACE.WORKFLOWS_AUTO_REPORTING_FREQUENCY]: {
policyID: string;
};
[SCREENS.WORKSPACE.WORKFLOWS_AUTO_REPORTING_MONTHLY_OFFSET]: {
policyID: string;
};
[SCREENS.WORKSPACE.REIMBURSE]: {
policyID: string;
};
[SCREENS.WORKSPACE.BILLS]: {
policyID: string;
};
[SCREENS.WORKSPACE.INVOICES]: {
policyID: string;
};
[SCREENS.WORKSPACE.TRAVEL]: {
policyID: string;
};
[SCREENS.WORKSPACE.MEMBERS]: {
policyID: string;
};
[SCREENS.WORKSPACE.ACCOUNTING]: {
policyID: string;
};
[SCREENS.WORKSPACE.CATEGORIES]: {
policyID: string;
};
[SCREENS.WORKSPACE.MORE_FEATURES]: {
policyID: string;
};
[SCREENS.WORKSPACE.TAGS]: {
policyID: string;
tagName: string;
};
[SCREENS.WORKSPACE.TAXES]: {
policyID: string;
};
[SCREENS.WORKSPACE.DISTANCE_RATES]: {
policyID: string;
};
[SCREENS.WORKSPACE.ACCOUNTING]: {
policyID: string;
};
};

type OnboardingModalNavigatorParamList = {
Expand Down

0 comments on commit e3644d1

Please sign in to comment.