78 lines
3.4 KiB
JavaScript
78 lines
3.4 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.getTabPathFromRootStateByHref = getTabPathFromRootStateByHref;
|
|
exports.getPreloadedRouteFromRootStateByHref = getPreloadedRouteFromRootStateByHref;
|
|
exports.deepEqual = deepEqual;
|
|
const router_store_1 = require("../../global-state/router-store");
|
|
const routing_1 = require("../../global-state/routing");
|
|
const href_1 = require("../href");
|
|
const navigationParams_1 = require("../../navigationParams");
|
|
function getTabPathFromRootStateByHref(href, rootState) {
|
|
const hrefState = router_store_1.store.getStateForHref((0, href_1.resolveHref)(href));
|
|
const state = rootState;
|
|
if (!hrefState || !state) {
|
|
return [];
|
|
}
|
|
// Replicating the logic from `linkTo`
|
|
const { navigationRoutes } = (0, routing_1.findDivergentState)(hrefState, state, true);
|
|
if (!navigationRoutes.length) {
|
|
return [];
|
|
}
|
|
const tabPath = [];
|
|
navigationRoutes.forEach((route, i, arr) => {
|
|
if (route.state?.type === 'tab') {
|
|
const tabState = route.state;
|
|
const oldTabKey = tabState.routes[tabState.index].key;
|
|
// The next route will be either stack inside a tab or a new tab key
|
|
if (!arr[i + 1]) {
|
|
throw new Error(`New tab route is missing for ${route.key}. This is likely an internal Expo Router bug.`);
|
|
}
|
|
const newTabKey = arr[i + 1].key;
|
|
tabPath.push({ oldTabKey, newTabKey });
|
|
}
|
|
});
|
|
return tabPath;
|
|
}
|
|
function getPreloadedRouteFromRootStateByHref(href, rootState) {
|
|
const hrefState = router_store_1.store.getStateForHref((0, href_1.resolveHref)(href));
|
|
const state = rootState;
|
|
if (!hrefState || !state) {
|
|
return undefined;
|
|
}
|
|
// Replicating the logic from `linkTo`
|
|
const { navigationState, actionStateRoute } = (0, routing_1.findDivergentState)(hrefState, state, true);
|
|
if (!navigationState || !actionStateRoute) {
|
|
return undefined;
|
|
}
|
|
if (navigationState.type === 'stack') {
|
|
const stackState = navigationState;
|
|
const payload = (0, routing_1.getPayloadFromStateRoute)(actionStateRoute);
|
|
const preloadedRoute = stackState.preloadedRoutes.find((route) => route.name === actionStateRoute.name &&
|
|
deepEqual((0, navigationParams_1.removeInternalExpoRouterParams)(route.params), (0, navigationParams_1.removeInternalExpoRouterParams)(payload.params)));
|
|
const activeRoute = stackState.routes[stackState.index];
|
|
// When the active route is the same as the preloaded route,
|
|
// then we should not navigate. It aligns with base link behavior.
|
|
if (activeRoute.name === preloadedRoute?.name &&
|
|
deepEqual(
|
|
// using ?? {}, because from our perspective undefined === {}, as both mean no params
|
|
(0, navigationParams_1.removeInternalExpoRouterParams)(activeRoute.params ?? {}), (0, navigationParams_1.removeInternalExpoRouterParams)(payload.params ?? {}))) {
|
|
return undefined;
|
|
}
|
|
return preloadedRoute;
|
|
}
|
|
return undefined;
|
|
}
|
|
function deepEqual(a, b) {
|
|
if (a === b) {
|
|
return true;
|
|
}
|
|
if (a == null || b == null) {
|
|
return false;
|
|
}
|
|
if (typeof a !== 'object' || typeof b !== 'object') {
|
|
return false;
|
|
}
|
|
const keys = Object.keys(a);
|
|
return keys.length === Object.keys(b).length && keys.every((key) => deepEqual(a[key], b[key]));
|
|
}
|
|
//# sourceMappingURL=utils.js.map
|