diff --git a/native/navigation/action-types.js b/native/navigation/action-types.js --- a/native/navigation/action-types.js +++ b/native/navigation/action-types.js @@ -8,6 +8,7 @@ // OverlayRouter export const clearOverlayModalsActionType = 'CLEAR_OVERLAY_MODALS'; +export const setRouteParamsActionType = 'SET_ROUTE_PARAMS'; // ChatRouter export const clearScreensActionType = 'CLEAR_SCREENS'; diff --git a/native/navigation/overlay-router.js b/native/navigation/overlay-router.js --- a/native/navigation/overlay-router.js +++ b/native/navigation/overlay-router.js @@ -7,10 +7,14 @@ 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 = { @@ -19,13 +23,22 @@ +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( @@ -51,6 +64,23 @@ 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); } @@ -65,6 +95,10 @@ ...CommonActions.goBack(), target: state.key, }), + setRouteParams: (routeKey: string, params: ScreenParams) => ({ + type: setRouteParamsActionType, + payload: { routeKey, params }, + }), }, }; }