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

141 lines
6.9 KiB
JavaScript

"use strict";
'use client';
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.LinkWithPreview = LinkWithPreview;
const react_1 = __importStar(require("react"));
const react_native_1 = require("react-native");
const hooks_1 = require("../hooks");
const BaseExpoRouterLink_1 = require("./BaseExpoRouterLink");
const InternalLinkPreviewContext_1 = require("./InternalLinkPreviewContext");
const NativeMenuContext_1 = require("./NativeMenuContext");
const elements_1 = require("./elements");
const href_1 = require("./href");
const LinkPreviewContext_1 = require("./preview/LinkPreviewContext");
const native_1 = require("./preview/native");
const useNextScreenId_1 = require("./preview/useNextScreenId");
const children_1 = require("../utils/children");
const url_1 = require("../utils/url");
const isPad = react_native_1.Platform.OS === 'ios' && react_native_1.Platform.isPad;
function LinkWithPreview({ children, ...rest }) {
const router = (0, hooks_1.useRouter)();
const { setOpenPreviewKey } = (0, LinkPreviewContext_1.useLinkPreviewContext)();
const [isCurrentPreviewOpen, setIsCurrenPreviewOpen] = (0, react_1.useState)(false);
const hrefWithoutQuery = (0, href_1.resolveHref)(rest.hrefForPreviewNavigation).split('?')[0];
const prevHrefWithoutQuery = (0, react_1.useRef)(hrefWithoutQuery);
(0, react_1.useEffect)(() => {
if (isCurrentPreviewOpen) {
if (prevHrefWithoutQuery.current !== hrefWithoutQuery) {
throw new Error('Link does not support changing the href prop after the preview has been opened. Please ensure that the href prop is stable and does not change between renders.');
}
}
else {
prevHrefWithoutQuery.current = hrefWithoutQuery;
}
}, [hrefWithoutQuery]);
const [{ nextScreenId, tabPath }, prefetch] = (0, useNextScreenId_1.useNextScreenId)();
(0, react_1.useEffect)(() => {
if (rest.replace) {
if (process.env.NODE_ENV !== 'production') {
throw new Error('Using replace links with preview is not supported');
}
else {
console.warn('Using replace links with preview is not supported');
}
}
}, [rest.href, rest.replace]);
const triggerElement = react_1.default.useMemo(() => (0, children_1.getFirstChildOfType)(children, elements_1.LinkTrigger), [children]);
const menuElement = react_1.default.useMemo(() => (0, children_1.getFirstChildOfType)(children, elements_1.LinkMenu), [children]);
const previewElement = react_1.default.useMemo(() => (0, children_1.getFirstChildOfType)(children, elements_1.LinkPreview), [children]);
if ((previewElement || menuElement) && !triggerElement) {
if (process.env.NODE_ENV !== 'production') {
throw new Error('When you use Link.Preview, you must use Link.Trigger to specify the trigger element.');
}
else {
console.warn('When you use Link.Preview, you must use Link.Trigger to specify the trigger element.');
}
}
const trigger = react_1.default.useMemo(() => triggerElement ?? <elements_1.LinkTrigger>{children}</elements_1.LinkTrigger>, [triggerElement, children]);
const preview = react_1.default.useMemo(() => ((0, url_1.shouldLinkExternally)(String(rest.href)) || !previewElement ? null : previewElement), [previewElement, rest.href]);
const isPreviewTapped = (0, react_1.useRef)(false);
const blockPressRef = (0, react_1.useRef)(false);
const tabPathValue = (0, react_1.useMemo)(() => ({
path: tabPath,
}), [tabPath]);
const hasPreview = !!previewElement;
if (rest.replace) {
return <BaseExpoRouterLink_1.BaseExpoRouterLink children={children} {...rest}/>;
}
return (<native_1.NativeLinkPreview nextScreenId={isPad ? undefined : nextScreenId} tabPath={isPad ? undefined : tabPathValue} onWillPreviewOpen={() => {
if (hasPreview) {
blockPressRef.current = true;
isPreviewTapped.current = false;
prefetch(rest.href);
setIsCurrenPreviewOpen(true);
}
}} onPreviewWillClose={() => {
if (hasPreview) {
setIsCurrenPreviewOpen(false);
// When preview was not tapped, then we need to enable the screen stack animation
// Otherwise this will happen in StackNavigator, when new screen is opened
if (!isPreviewTapped.current || isPad) {
setOpenPreviewKey(undefined);
}
}
}} onPreviewDidClose={() => {
blockPressRef.current = false;
if (hasPreview && isPreviewTapped.current && isPad) {
router.navigate(rest.href, { __internal__PreviewKey: nextScreenId });
}
}} onPreviewTapped={() => {
isPreviewTapped.current = true;
if (!isPad) {
router.navigate(rest.href, { __internal__PreviewKey: nextScreenId });
}
}} style={{ display: 'contents' }} disableForceFlatten>
<NativeMenuContext_1.NativeMenuContext value>
<InternalLinkPreviewContext_1.InternalLinkPreviewContext value={{
isVisible: isCurrentPreviewOpen,
href: rest.hrefForPreviewNavigation,
blockPressRef,
}}>
<BaseExpoRouterLink_1.BaseExpoRouterLink {...rest} children={trigger} ref={rest.ref}/>
{preview}
{menuElement}
</InternalLinkPreviewContext_1.InternalLinkPreviewContext>
</NativeMenuContext_1.NativeMenuContext>
</native_1.NativeLinkPreview>);
}
//# sourceMappingURL=LinkWithPreview.js.map