Files
Fluxup_PAP/node_modules/expo-router/build/link/preview/utils.js
2026-03-10 16:18:05 +00:00

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