46 lines
2.4 KiB
JavaScript
46 lines
2.4 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.useNextScreenId = useNextScreenId;
|
|
const react_1 = require("react");
|
|
const LinkPreviewContext_1 = require("./LinkPreviewContext");
|
|
const utils_1 = require("./utils");
|
|
const router_store_1 = require("../../global-state/router-store");
|
|
const hooks_1 = require("../../hooks");
|
|
function useNextScreenId() {
|
|
const router = (0, hooks_1.useRouter)();
|
|
const { setOpenPreviewKey } = (0, LinkPreviewContext_1.useLinkPreviewContext)();
|
|
const [internalNextScreenId, internalSetNextScreenId] = (0, react_1.useState)();
|
|
const currentHref = (0, react_1.useRef)(undefined);
|
|
const [tabPath, setTabPath] = (0, react_1.useState)([]);
|
|
(0, react_1.useEffect)(() => {
|
|
// When screen is prefetched, then the root state is updated with the preloaded route.
|
|
return router_store_1.store.navigationRef.addListener('state', ({ data: { state } }) => {
|
|
// If we have the current href, it means that we prefetched the route
|
|
if (currentHref.current && state) {
|
|
const preloadedRoute = (0, utils_1.getPreloadedRouteFromRootStateByHref)(currentHref.current, state);
|
|
const routeKey = preloadedRoute?.key;
|
|
const tabPathFromRootState = (0, utils_1.getTabPathFromRootStateByHref)(currentHref.current, state);
|
|
// Without this timeout react-native does not have enough time to mount the new screen
|
|
// and thus it will not be found on the native side
|
|
if (routeKey || tabPathFromRootState.length) {
|
|
setTimeout(() => {
|
|
internalSetNextScreenId(routeKey);
|
|
setOpenPreviewKey(routeKey);
|
|
setTabPath(tabPathFromRootState);
|
|
});
|
|
}
|
|
// We got the preloaded state, so we can reset the currentHref
|
|
// to prevent unnecessary processing
|
|
currentHref.current = undefined;
|
|
}
|
|
});
|
|
}, []);
|
|
const prefetch = (0, react_1.useCallback)((href) => {
|
|
// Resetting the nextScreenId to undefined
|
|
internalSetNextScreenId(undefined);
|
|
router.prefetch(href);
|
|
currentHref.current = href;
|
|
}, [router.prefetch]);
|
|
return [{ nextScreenId: internalNextScreenId, tabPath }, prefetch];
|
|
}
|
|
//# sourceMappingURL=useNextScreenId.js.map
|