UNPKG

one

Version:

One is a React framework for web, iOS, and Android apps.

55 lines (52 loc) • 1.93 kB
import { nanoid } from "nanoid/non-secure"; import { setLastAction } from "../lastAction.mjs"; import { matchDynamicName } from "../matchers.mjs"; function getNavigateAction(actionState, navigationState, type = "NAVIGATE") { let actionStateRoute; while (actionState && navigationState) { const stateRoute = navigationState.routes[navigationState.index]; actionStateRoute = actionState.routes[actionState.index ?? actionState.routes.length - 1]; const childState = actionStateRoute.state; const nextNavigationState = stateRoute.state; const dynamicMatch = matchDynamicName(actionStateRoute.name); const didActionAndCurrentStateDiverge = actionStateRoute.name !== stateRoute.name || !childState || !nextNavigationState || dynamicMatch && actionStateRoute.params?.[dynamicMatch.name] !== stateRoute.params?.[dynamicMatch.name]; if (didActionAndCurrentStateDiverge) { break; } actionState = childState; navigationState = nextNavigationState; } const rootPayload = { params: {} }; let payload = rootPayload; let params = payload.params; while (actionStateRoute) { Object.assign(params, { ...actionStateRoute.params }); payload.screen = actionStateRoute.name; payload.params = { ...actionStateRoute.params }; actionStateRoute = actionStateRoute.state?.routes[actionStateRoute.state.index ?? actionStateRoute.state.routes.length - 1]; payload.params ??= {}; payload = payload.params; params = payload; } if (type === "PUSH") { setLastAction(); type = "NAVIGATE"; if (navigationState.type === "stack") { rootPayload.key = `${rootPayload.name}-${nanoid()}`; } } if (type === "REPLACE" && navigationState.type === "tab") { type = "JUMP_TO"; } return { type, target: navigationState.key, payload: { key: rootPayload.key, name: rootPayload.screen, params: rootPayload.params } }; } export { getNavigateAction }; //# sourceMappingURL=getNavigateAction.mjs.map