diff --git a/native/navigation/action-types.js b/native/navigation/action-types.js index 8112f403b..c38584dfe 100644 --- a/native/navigation/action-types.js +++ b/native/navigation/action-types.js @@ -1,16 +1,17 @@ // @flow // RootRouter export const logInActionType = 'LOG_IN'; export const logOutActionType = 'LOG_OUT'; export const clearRootModalsActionType = 'CLEAR_ROOT_MODALS'; export const setNavStateActionType = 'SET_NAV_STATE'; // OverlayRouter export const clearOverlayModalsActionType = 'CLEAR_OVERLAY_MODALS'; +export const setRouteParamsActionType = 'SET_ROUTE_PARAMS'; // ChatRouter export const clearScreensActionType = 'CLEAR_SCREENS'; export const replaceWithThreadActionType = 'REPLACE_WITH_THREAD'; export const clearThreadsActionType = 'CLEAR_THREADS'; export const pushNewThreadActionType = 'PUSH_NEW_THREAD'; diff --git a/native/navigation/overlay-router.js b/native/navigation/overlay-router.js index fe9dfccba..bd3c357d0 100644 --- a/native/navigation/overlay-router.js +++ b/native/navigation/overlay-router.js @@ -1,72 +1,106 @@ // @flow import type { StackAction, Route, Router, StackRouterOptions, StackNavigationState, RouterConfigOptions, + ScreenParams, } from '@react-navigation/native'; import { StackRouter, CommonActions } from '@react-navigation/native'; -import { clearOverlayModalsActionType } from './action-types'; +import { + clearOverlayModalsActionType, + setRouteParamsActionType, +} from './action-types'; import { removeScreensFromStack } from './navigation-utils'; type ClearOverlayModalsAction = { +type: 'CLEAR_OVERLAY_MODALS', +payload: { +keys: $ReadOnlyArray, }, }; +type SetRouteParamsAction = { + +type: 'SET_ROUTE_PARAMS', + +payload: { + +routeKey: string, + +params: ScreenParams, + }, +}; export type OverlayRouterNavigationAction = | StackAction - | ClearOverlayModalsAction; + | ClearOverlayModalsAction + | SetRouteParamsAction; export type OverlayRouterExtraNavigationHelpers = { +clearOverlayModals: (keys: $ReadOnlyArray) => void, +goBackOnce: () => void, + +setRouteParams: (routeKey: string, params: ScreenParams) => void, }; function OverlayRouter( routerOptions: StackRouterOptions, ): Router { const { getStateForAction: baseGetStateForAction, actionCreators: baseActionCreators, ...rest } = StackRouter(routerOptions); return { ...rest, getStateForAction: ( lastState: StackNavigationState, action: OverlayRouterNavigationAction, options: RouterConfigOptions, ) => { if (action.type === clearOverlayModalsActionType) { const { keys } = action.payload; if (!lastState) { return lastState; } return removeScreensFromStack(lastState, (route: Route<>) => keys.includes(route.key) ? 'remove' : 'keep', ); + } else if (action.type === setRouteParamsActionType) { + const newRoutes = lastState.routes.map(route => { + if (route.key !== action.payload.routeKey || route.state) { + return route; + } + return { + ...route, + params: { + ...route.params, + ...action.payload.params, + }, + }; + }); + return { + ...lastState, + routes: newRoutes, + }; } else { return baseGetStateForAction(lastState, action, options); } }, actionCreators: { ...baseActionCreators, clearOverlayModals: (keys: $ReadOnlyArray) => ({ type: clearOverlayModalsActionType, payload: { keys }, }), goBackOnce: () => state => ({ ...CommonActions.goBack(), target: state.key, }), + setRouteParams: (routeKey: string, params: ScreenParams) => ({ + type: setRouteParamsActionType, + payload: { routeKey, params }, + }), }, }; } export default OverlayRouter;