@tanstack/react-router 1.131.27 → 1.131.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/link.cjs +41 -55
- package/dist/cjs/link.cjs.map +1 -1
- package/dist/cjs/useActiveLocation.cjs +39 -0
- package/dist/cjs/useActiveLocation.cjs.map +1 -0
- package/dist/cjs/useActiveLocation.d.cts +7 -0
- package/dist/cjs/useNavigate.cjs +6 -9
- package/dist/cjs/useNavigate.cjs.map +1 -1
- package/dist/esm/link.js +41 -55
- package/dist/esm/link.js.map +1 -1
- package/dist/esm/useActiveLocation.d.ts +7 -0
- package/dist/esm/useActiveLocation.js +39 -0
- package/dist/esm/useActiveLocation.js.map +1 -0
- package/dist/esm/useNavigate.js +6 -9
- package/dist/esm/useNavigate.js.map +1 -1
- package/dist/llms/rules/guide.d.ts +1 -1
- package/dist/llms/rules/guide.js +14 -7
- package/package.json +2 -2
- package/src/link.tsx +46 -56
- package/src/useActiveLocation.ts +57 -0
- package/src/useNavigate.tsx +6 -14
package/dist/cjs/link.cjs
CHANGED
|
@@ -4,10 +4,10 @@ const jsxRuntime = require("react/jsx-runtime");
|
|
|
4
4
|
const React = require("react");
|
|
5
5
|
const reactDom = require("react-dom");
|
|
6
6
|
const routerCore = require("@tanstack/router-core");
|
|
7
|
+
const useActiveLocation = require("./useActiveLocation.cjs");
|
|
7
8
|
const useRouterState = require("./useRouterState.cjs");
|
|
8
9
|
const useRouter = require("./useRouter.cjs");
|
|
9
10
|
const utils = require("./utils.cjs");
|
|
10
|
-
const useMatch = require("./useMatch.cjs");
|
|
11
11
|
function _interopNamespaceDefault(e) {
|
|
12
12
|
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
|
13
13
|
if (e) {
|
|
@@ -79,18 +79,23 @@ function useLinkProps(options, forwardedRef) {
|
|
|
79
79
|
select: (s) => s.location.search,
|
|
80
80
|
structuralSharing: true
|
|
81
81
|
});
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
82
|
+
const routerLocation = useRouterState.useRouterState({
|
|
83
|
+
select: (s) => s.location,
|
|
84
|
+
structuralSharing: true
|
|
85
85
|
});
|
|
86
|
-
const
|
|
87
|
-
|
|
86
|
+
const { getFromPath } = useActiveLocation.useActiveLocation();
|
|
87
|
+
const from = getFromPath(options.from);
|
|
88
|
+
const _options = React__namespace.useMemo(
|
|
89
|
+
() => {
|
|
90
|
+
return { ...options, from };
|
|
91
|
+
},
|
|
88
92
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
89
93
|
[
|
|
90
94
|
router,
|
|
95
|
+
routerLocation,
|
|
91
96
|
currentSearch,
|
|
92
|
-
options._fromLocation,
|
|
93
97
|
from,
|
|
98
|
+
options._fromLocation,
|
|
94
99
|
options.hash,
|
|
95
100
|
options.to,
|
|
96
101
|
options.search,
|
|
@@ -100,6 +105,10 @@ function useLinkProps(options, forwardedRef) {
|
|
|
100
105
|
options.unsafeRelative
|
|
101
106
|
]
|
|
102
107
|
);
|
|
108
|
+
const next = React__namespace.useMemo(
|
|
109
|
+
() => router.buildLocation({ ..._options }),
|
|
110
|
+
[router, _options]
|
|
111
|
+
);
|
|
103
112
|
const isExternal = type === "external";
|
|
104
113
|
const preload = options.reloadDocument || isExternal ? false : userPreload ?? router.options.defaultPreload;
|
|
105
114
|
const preloadDelay = userPreloadDelay ?? router.options.defaultPreloadDelay ?? 0;
|
|
@@ -144,34 +153,12 @@ function useLinkProps(options, forwardedRef) {
|
|
|
144
153
|
return true;
|
|
145
154
|
}
|
|
146
155
|
});
|
|
147
|
-
const doPreload = React__namespace.useCallback(
|
|
148
|
-
() => {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
},
|
|
154
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
155
|
-
[
|
|
156
|
-
router,
|
|
157
|
-
options.to,
|
|
158
|
-
options._fromLocation,
|
|
159
|
-
from,
|
|
160
|
-
options.search,
|
|
161
|
-
options.hash,
|
|
162
|
-
options.params,
|
|
163
|
-
options.state,
|
|
164
|
-
options.mask,
|
|
165
|
-
options.unsafeRelative,
|
|
166
|
-
options.hashScrollIntoView,
|
|
167
|
-
options.href,
|
|
168
|
-
options.ignoreBlocker,
|
|
169
|
-
options.reloadDocument,
|
|
170
|
-
options.replace,
|
|
171
|
-
options.resetScroll,
|
|
172
|
-
options.viewTransition
|
|
173
|
-
]
|
|
174
|
-
);
|
|
156
|
+
const doPreload = React__namespace.useCallback(() => {
|
|
157
|
+
router.preloadRoute({ ..._options }).catch((err) => {
|
|
158
|
+
console.warn(err);
|
|
159
|
+
console.warn(routerCore.preloadWarning);
|
|
160
|
+
});
|
|
161
|
+
}, [router, _options]);
|
|
175
162
|
const preloadViewportIoCallback = React__namespace.useCallback(
|
|
176
163
|
(entry) => {
|
|
177
164
|
if (entry == null ? void 0 : entry.isIntersecting) {
|
|
@@ -195,24 +182,6 @@ function useLinkProps(options, forwardedRef) {
|
|
|
195
182
|
hasRenderFetched.current = true;
|
|
196
183
|
}
|
|
197
184
|
}, [disabled, doPreload, preload]);
|
|
198
|
-
if (isExternal) {
|
|
199
|
-
return {
|
|
200
|
-
...propsSafeToSpread,
|
|
201
|
-
ref: innerRef,
|
|
202
|
-
type,
|
|
203
|
-
href: to,
|
|
204
|
-
...children && { children },
|
|
205
|
-
...target && { target },
|
|
206
|
-
...disabled && { disabled },
|
|
207
|
-
...style && { style },
|
|
208
|
-
...className && { className },
|
|
209
|
-
...onClick && { onClick },
|
|
210
|
-
...onFocus && { onFocus },
|
|
211
|
-
...onMouseEnter && { onMouseEnter },
|
|
212
|
-
...onMouseLeave && { onMouseLeave },
|
|
213
|
-
...onTouchStart && { onTouchStart }
|
|
214
|
-
};
|
|
215
|
-
}
|
|
216
185
|
const handleClick = (e) => {
|
|
217
186
|
if (!disabled && !isCtrlEvent(e) && !e.defaultPrevented && (!target || target === "_self") && e.button === 0) {
|
|
218
187
|
e.preventDefault();
|
|
@@ -224,8 +193,7 @@ function useLinkProps(options, forwardedRef) {
|
|
|
224
193
|
setIsTransitioning(false);
|
|
225
194
|
});
|
|
226
195
|
router.navigate({
|
|
227
|
-
...
|
|
228
|
-
from,
|
|
196
|
+
..._options,
|
|
229
197
|
replace,
|
|
230
198
|
resetScroll,
|
|
231
199
|
hashScrollIntoView,
|
|
@@ -235,6 +203,24 @@ function useLinkProps(options, forwardedRef) {
|
|
|
235
203
|
});
|
|
236
204
|
}
|
|
237
205
|
};
|
|
206
|
+
if (isExternal) {
|
|
207
|
+
return {
|
|
208
|
+
...propsSafeToSpread,
|
|
209
|
+
ref: innerRef,
|
|
210
|
+
type,
|
|
211
|
+
href: to,
|
|
212
|
+
...children && { children },
|
|
213
|
+
...target && { target },
|
|
214
|
+
...disabled && { disabled },
|
|
215
|
+
...style && { style },
|
|
216
|
+
...className && { className },
|
|
217
|
+
...onClick && { onClick },
|
|
218
|
+
...onFocus && { onFocus },
|
|
219
|
+
...onMouseEnter && { onMouseEnter },
|
|
220
|
+
...onMouseLeave && { onMouseLeave },
|
|
221
|
+
...onTouchStart && { onTouchStart }
|
|
222
|
+
};
|
|
223
|
+
}
|
|
238
224
|
const handleFocus = (_) => {
|
|
239
225
|
if (disabled) return;
|
|
240
226
|
if (preload) {
|
package/dist/cjs/link.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.cjs","sources":["../../src/link.tsx"],"sourcesContent":["import * as React from 'react'\nimport { flushSync } from 'react-dom'\nimport {\n deepEqual,\n exactPathTest,\n functionalUpdate,\n preloadWarning,\n removeTrailingSlash,\n} from '@tanstack/router-core'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\n\nimport { useForwardedRef, useIntersectionObserver } from './utils'\n\nimport { useMatch } from './useMatch'\nimport type {\n AnyRouter,\n Constrain,\n LinkOptions,\n RegisteredRouter,\n RoutePaths,\n} from '@tanstack/router-core'\nimport type { ReactNode } from 'react'\nimport type {\n ValidateLinkOptions,\n ValidateLinkOptionsArray,\n} from './typePrimitives'\n\nexport function useLinkProps<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(\n options: UseLinkPropsOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n forwardedRef?: React.ForwardedRef<Element>,\n): React.ComponentPropsWithRef<'a'> {\n const router = useRouter()\n const [isTransitioning, setIsTransitioning] = React.useState(false)\n const hasRenderFetched = React.useRef(false)\n const innerRef = useForwardedRef(forwardedRef)\n\n const {\n // custom props\n activeProps,\n inactiveProps,\n activeOptions,\n to,\n preload: userPreload,\n preloadDelay: userPreloadDelay,\n hashScrollIntoView,\n replace,\n startTransition,\n resetScroll,\n viewTransition,\n // element props\n children,\n target,\n disabled,\n style,\n className,\n onClick,\n onFocus,\n onMouseEnter,\n onMouseLeave,\n onTouchStart,\n ignoreBlocker,\n // prevent these from being returned\n params: _params,\n search: _search,\n hash: _hash,\n state: _state,\n mask: _mask,\n reloadDocument: _reloadDocument,\n unsafeRelative: _unsafeRelative,\n from: _from,\n _fromLocation,\n ...propsSafeToSpread\n } = options\n\n // If this link simply reloads the current route,\n // make sure it has a new key so it will trigger a data refresh\n\n // If this `to` is a valid external URL, return\n // null for LinkUtils\n\n const type: 'internal' | 'external' = React.useMemo(() => {\n try {\n new URL(to as any)\n return 'external'\n } catch {}\n return 'internal'\n }, [to])\n\n // subscribe to search params to re-build location if it changes\n const currentSearch = useRouterState({\n select: (s) => s.location.search,\n structuralSharing: true as any,\n })\n\n const from = useMatch({\n strict: false,\n select: (match) => options.from ?? match.fullPath,\n })\n\n const next = React.useMemo(\n () => router.buildLocation({ ...options, from } as any),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n router,\n currentSearch,\n options._fromLocation,\n from,\n options.hash,\n options.to,\n options.search,\n options.params,\n options.state,\n options.mask,\n options.unsafeRelative,\n ],\n )\n\n const isExternal = type === 'external'\n\n const preload =\n options.reloadDocument || isExternal\n ? false\n : (userPreload ?? router.options.defaultPreload)\n const preloadDelay =\n userPreloadDelay ?? router.options.defaultPreloadDelay ?? 0\n\n const isActive = useRouterState({\n select: (s) => {\n if (isExternal) return false\n if (activeOptions?.exact) {\n const testExact = exactPathTest(\n s.location.pathname,\n next.pathname,\n router.basepath,\n )\n if (!testExact) {\n return false\n }\n } else {\n const currentPathSplit = removeTrailingSlash(\n s.location.pathname,\n router.basepath,\n )\n const nextPathSplit = removeTrailingSlash(\n next.pathname,\n router.basepath,\n )\n\n const pathIsFuzzyEqual =\n currentPathSplit.startsWith(nextPathSplit) &&\n (currentPathSplit.length === nextPathSplit.length ||\n currentPathSplit[nextPathSplit.length] === '/')\n\n if (!pathIsFuzzyEqual) {\n return false\n }\n }\n\n if (activeOptions?.includeSearch ?? true) {\n const searchTest = deepEqual(s.location.search, next.search, {\n partial: !activeOptions?.exact,\n ignoreUndefined: !activeOptions?.explicitUndefined,\n })\n if (!searchTest) {\n return false\n }\n }\n\n if (activeOptions?.includeHash) {\n return s.location.hash === next.hash\n }\n return true\n },\n })\n\n const doPreload = React.useCallback(\n () => {\n router.preloadRoute({ ...options, from } as any).catch((err) => {\n console.warn(err)\n console.warn(preloadWarning)\n })\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n router,\n options.to,\n options._fromLocation,\n from,\n options.search,\n options.hash,\n options.params,\n options.state,\n options.mask,\n options.unsafeRelative,\n options.hashScrollIntoView,\n options.href,\n options.ignoreBlocker,\n options.reloadDocument,\n options.replace,\n options.resetScroll,\n options.viewTransition,\n ],\n )\n\n const preloadViewportIoCallback = React.useCallback(\n (entry: IntersectionObserverEntry | undefined) => {\n if (entry?.isIntersecting) {\n doPreload()\n }\n },\n [doPreload],\n )\n\n useIntersectionObserver(\n innerRef,\n preloadViewportIoCallback,\n intersectionObserverOptions,\n { disabled: !!disabled || !(preload === 'viewport') },\n )\n\n React.useEffect(() => {\n if (hasRenderFetched.current) {\n return\n }\n if (!disabled && preload === 'render') {\n doPreload()\n hasRenderFetched.current = true\n }\n }, [disabled, doPreload, preload])\n\n if (isExternal) {\n return {\n ...propsSafeToSpread,\n ref: innerRef as React.ComponentPropsWithRef<'a'>['ref'],\n type,\n href: to,\n ...(children && { children }),\n ...(target && { target }),\n ...(disabled && { disabled }),\n ...(style && { style }),\n ...(className && { className }),\n ...(onClick && { onClick }),\n ...(onFocus && { onFocus }),\n ...(onMouseEnter && { onMouseEnter }),\n ...(onMouseLeave && { onMouseLeave }),\n ...(onTouchStart && { onTouchStart }),\n }\n }\n\n // The click handler\n const handleClick = (e: React.MouseEvent) => {\n if (\n !disabled &&\n !isCtrlEvent(e) &&\n !e.defaultPrevented &&\n (!target || target === '_self') &&\n e.button === 0\n ) {\n e.preventDefault()\n\n flushSync(() => {\n setIsTransitioning(true)\n })\n\n const unsub = router.subscribe('onResolved', () => {\n unsub()\n setIsTransitioning(false)\n })\n\n // All is well? Navigate!\n // N.B. we don't call `router.commitLocation(next) here because we want to run `validateSearch` before committing\n router.navigate({\n ...options,\n from,\n replace,\n resetScroll,\n hashScrollIntoView,\n startTransition,\n viewTransition,\n ignoreBlocker,\n })\n }\n }\n\n // The click handler\n const handleFocus = (_: React.MouseEvent) => {\n if (disabled) return\n if (preload) {\n doPreload()\n }\n }\n\n const handleTouchStart = handleFocus\n\n const handleEnter = (e: React.MouseEvent) => {\n if (disabled || !preload) return\n\n if (!preloadDelay) {\n doPreload()\n } else {\n const eventTarget = e.target\n if (timeoutMap.has(eventTarget)) {\n return\n }\n const id = setTimeout(() => {\n timeoutMap.delete(eventTarget)\n doPreload()\n }, preloadDelay)\n timeoutMap.set(eventTarget, id)\n }\n }\n\n const handleLeave = (e: React.MouseEvent) => {\n if (disabled || !preload || !preloadDelay) return\n const eventTarget = e.target\n const id = timeoutMap.get(eventTarget)\n if (id) {\n clearTimeout(id)\n timeoutMap.delete(eventTarget)\n }\n }\n\n // Get the active props\n const resolvedActiveProps: React.HTMLAttributes<HTMLAnchorElement> = isActive\n ? (functionalUpdate(activeProps as any, {}) ?? STATIC_ACTIVE_OBJECT)\n : STATIC_EMPTY_OBJECT\n\n // Get the inactive props\n const resolvedInactiveProps: React.HTMLAttributes<HTMLAnchorElement> =\n isActive\n ? STATIC_EMPTY_OBJECT\n : (functionalUpdate(inactiveProps, {}) ?? STATIC_EMPTY_OBJECT)\n\n const resolvedClassName = [\n className,\n resolvedActiveProps.className,\n resolvedInactiveProps.className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const resolvedStyle = (style ||\n resolvedActiveProps.style ||\n resolvedInactiveProps.style) && {\n ...style,\n ...resolvedActiveProps.style,\n ...resolvedInactiveProps.style,\n }\n\n return {\n ...propsSafeToSpread,\n ...resolvedActiveProps,\n ...resolvedInactiveProps,\n href: disabled\n ? undefined\n : next.maskedLocation\n ? router.history.createHref(next.maskedLocation.href)\n : router.history.createHref(next.href),\n ref: innerRef as React.ComponentPropsWithRef<'a'>['ref'],\n onClick: composeHandlers([onClick, handleClick]),\n onFocus: composeHandlers([onFocus, handleFocus]),\n onMouseEnter: composeHandlers([onMouseEnter, handleEnter]),\n onMouseLeave: composeHandlers([onMouseLeave, handleLeave]),\n onTouchStart: composeHandlers([onTouchStart, handleTouchStart]),\n disabled: !!disabled,\n target,\n ...(resolvedStyle && { style: resolvedStyle }),\n ...(resolvedClassName && { className: resolvedClassName }),\n ...(disabled && STATIC_DISABLED_PROPS),\n ...(isActive && STATIC_ACTIVE_PROPS),\n ...(isTransitioning && STATIC_TRANSITIONING_PROPS),\n }\n}\n\nconst STATIC_EMPTY_OBJECT = {}\nconst STATIC_ACTIVE_OBJECT = { className: 'active' }\nconst STATIC_DISABLED_PROPS = { role: 'link', 'aria-disabled': true }\nconst STATIC_ACTIVE_PROPS = { 'data-status': 'active', 'aria-current': 'page' }\nconst STATIC_TRANSITIONING_PROPS = { 'data-transitioning': 'transitioning' }\n\nconst timeoutMap = new WeakMap<EventTarget, ReturnType<typeof setTimeout>>()\n\nconst intersectionObserverOptions: IntersectionObserverInit = {\n rootMargin: '100px',\n}\n\nconst composeHandlers =\n (handlers: Array<undefined | React.EventHandler<any>>) =>\n (e: React.SyntheticEvent) => {\n handlers.filter(Boolean).forEach((handler) => {\n if (e.defaultPrevented) return\n handler!(e)\n })\n }\n\ntype UseLinkReactProps<TComp> = TComp extends keyof React.JSX.IntrinsicElements\n ? React.JSX.IntrinsicElements[TComp]\n : TComp extends React.ComponentType<any>\n ? React.ComponentPropsWithoutRef<TComp> &\n React.RefAttributes<React.ComponentRef<TComp>>\n : never\n\nexport type UseLinkPropsOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends RoutePaths<TRouter['routeTree']> | string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends RoutePaths<TRouter['routeTree']> | string = TFrom,\n TMaskTo extends string = '.',\n> = ActiveLinkOptions<'a', TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n UseLinkReactProps<'a'>\n\nexport type ActiveLinkOptions<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = LinkOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n ActiveLinkOptionProps<TComp>\n\ntype ActiveLinkProps<TComp> = Partial<\n LinkComponentReactProps<TComp> & {\n [key: `data-${string}`]: unknown\n }\n>\n\nexport interface ActiveLinkOptionProps<TComp = 'a'> {\n /**\n * A function that returns additional props for the `active` state of this link.\n * These props override other props passed to the link (`style`'s are merged, `className`'s are concatenated)\n */\n activeProps?: ActiveLinkProps<TComp> | (() => ActiveLinkProps<TComp>)\n /**\n * A function that returns additional props for the `inactive` state of this link.\n * These props override other props passed to the link (`style`'s are merged, `className`'s are concatenated)\n */\n inactiveProps?: ActiveLinkProps<TComp> | (() => ActiveLinkProps<TComp>)\n}\n\nexport type LinkProps<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = ActiveLinkOptions<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n LinkPropsChildren\n\nexport interface LinkPropsChildren {\n // If a function is passed as a child, it will be given the `isActive` boolean to aid in further styling on the element it returns\n children?:\n | React.ReactNode\n | ((state: {\n isActive: boolean\n isTransitioning: boolean\n }) => React.ReactNode)\n}\n\ntype LinkComponentReactProps<TComp> = Omit<\n UseLinkReactProps<TComp>,\n keyof CreateLinkProps\n>\n\nexport type LinkComponentProps<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = LinkComponentReactProps<TComp> &\n LinkProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>\n\nexport type CreateLinkProps = LinkProps<\n any,\n any,\n string,\n string,\n string,\n string\n>\n\nexport type LinkComponent<\n in out TComp,\n in out TDefaultFrom extends string = string,\n> = <\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = TDefaultFrom,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(\n props: LinkComponentProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n) => React.ReactElement\n\nexport interface LinkComponentRoute<\n in out TDefaultFrom extends string = string,\n> {\n defaultFrom: TDefaultFrom\n <\n TRouter extends AnyRouter = RegisteredRouter,\n const TTo extends string | undefined = undefined,\n const TMaskTo extends string = '',\n >(\n props: LinkComponentProps<\n 'a',\n TRouter,\n this['defaultFrom'],\n TTo,\n this['defaultFrom'],\n TMaskTo\n >,\n ): React.ReactElement\n}\n\nexport function createLink<const TComp>(\n Comp: Constrain<TComp, any, (props: CreateLinkProps) => ReactNode>,\n): LinkComponent<TComp> {\n return React.forwardRef(function CreatedLink(props, ref) {\n return <Link {...(props as any)} _asChild={Comp} ref={ref} />\n }) as any\n}\n\nexport const Link: LinkComponent<'a'> = React.forwardRef<Element, any>(\n (props, ref) => {\n const { _asChild, ...rest } = props\n const {\n type: _type,\n ref: innerRef,\n ...linkProps\n } = useLinkProps(rest as any, ref)\n\n const children =\n typeof rest.children === 'function'\n ? rest.children({\n isActive: (linkProps as any)['data-status'] === 'active',\n })\n : rest.children\n\n if (_asChild === undefined) {\n // the ReturnType of useLinkProps returns the correct type for a <a> element, not a general component that has a disabled prop\n // @ts-expect-error\n delete linkProps.disabled\n }\n\n return React.createElement(\n _asChild ? _asChild : 'a',\n {\n ...linkProps,\n ref: innerRef,\n },\n children,\n )\n },\n) as any\n\nfunction isCtrlEvent(e: React.MouseEvent) {\n return !!(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey)\n}\n\nexport type LinkOptionsFnOptions<\n TOptions,\n TComp,\n TRouter extends AnyRouter = RegisteredRouter,\n> =\n TOptions extends ReadonlyArray<any>\n ? ValidateLinkOptionsArray<TRouter, TOptions, string, TComp>\n : ValidateLinkOptions<TRouter, TOptions, string, TComp>\n\nexport type LinkOptionsFn<TComp> = <\n const TOptions,\n TRouter extends AnyRouter = RegisteredRouter,\n>(\n options: LinkOptionsFnOptions<TOptions, TComp, TRouter>,\n) => TOptions\n\nexport const linkOptions: LinkOptionsFn<'a'> = (options) => {\n return options as any\n}\n"],"names":["useRouter","React","useForwardedRef","useRouterState","useMatch","exactPathTest","removeTrailingSlash","deepEqual","preloadWarning","useIntersectionObserver","flushSync","functionalUpdate"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"link.cjs","sources":["../../src/link.tsx"],"sourcesContent":["import * as React from 'react'\nimport { flushSync } from 'react-dom'\nimport {\n deepEqual,\n exactPathTest,\n functionalUpdate,\n preloadWarning,\n removeTrailingSlash,\n} from '@tanstack/router-core'\nimport { useActiveLocation } from './useActiveLocation'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\n\nimport { useForwardedRef, useIntersectionObserver } from './utils'\n\nimport type {\n AnyRouter,\n Constrain,\n LinkOptions,\n RegisteredRouter,\n RoutePaths,\n} from '@tanstack/router-core'\nimport type { ReactNode } from 'react'\nimport type {\n ValidateLinkOptions,\n ValidateLinkOptionsArray,\n} from './typePrimitives'\n\nexport function useLinkProps<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(\n options: UseLinkPropsOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n forwardedRef?: React.ForwardedRef<Element>,\n): React.ComponentPropsWithRef<'a'> {\n const router = useRouter()\n const [isTransitioning, setIsTransitioning] = React.useState(false)\n const hasRenderFetched = React.useRef(false)\n const innerRef = useForwardedRef(forwardedRef)\n\n const {\n // custom props\n activeProps,\n inactiveProps,\n activeOptions,\n to,\n preload: userPreload,\n preloadDelay: userPreloadDelay,\n hashScrollIntoView,\n replace,\n startTransition,\n resetScroll,\n viewTransition,\n // element props\n children,\n target,\n disabled,\n style,\n className,\n onClick,\n onFocus,\n onMouseEnter,\n onMouseLeave,\n onTouchStart,\n ignoreBlocker,\n // prevent these from being returned\n params: _params,\n search: _search,\n hash: _hash,\n state: _state,\n mask: _mask,\n reloadDocument: _reloadDocument,\n unsafeRelative: _unsafeRelative,\n from: _from,\n _fromLocation,\n ...propsSafeToSpread\n } = options\n\n // If this link simply reloads the current route,\n // make sure it has a new key so it will trigger a data refresh\n\n // If this `to` is a valid external URL, return\n // null for LinkUtils\n\n const type: 'internal' | 'external' = React.useMemo(() => {\n try {\n new URL(to as any)\n return 'external'\n } catch {}\n return 'internal'\n }, [to])\n\n // subscribe to search params to re-build location if it changes\n const currentSearch = useRouterState({\n select: (s) => s.location.search,\n structuralSharing: true as any,\n })\n\n // subscribe to location here to re-build fromPath if it changes\n const routerLocation = useRouterState({\n select: (s) => s.location,\n structuralSharing: true as any,\n })\n\n const { getFromPath } = useActiveLocation()\n\n const from = getFromPath(options.from)\n\n const _options = React.useMemo(\n () => {\n return { ...options, from }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n router,\n routerLocation,\n currentSearch,\n from,\n options._fromLocation,\n options.hash,\n options.to,\n options.search,\n options.params,\n options.state,\n options.mask,\n options.unsafeRelative,\n ],\n )\n\n const next = React.useMemo(\n () => router.buildLocation({ ..._options } as any),\n [router, _options],\n )\n\n const isExternal = type === 'external'\n\n const preload =\n options.reloadDocument || isExternal\n ? false\n : (userPreload ?? router.options.defaultPreload)\n const preloadDelay =\n userPreloadDelay ?? router.options.defaultPreloadDelay ?? 0\n\n const isActive = useRouterState({\n select: (s) => {\n if (isExternal) return false\n if (activeOptions?.exact) {\n const testExact = exactPathTest(\n s.location.pathname,\n next.pathname,\n router.basepath,\n )\n if (!testExact) {\n return false\n }\n } else {\n const currentPathSplit = removeTrailingSlash(\n s.location.pathname,\n router.basepath,\n )\n const nextPathSplit = removeTrailingSlash(\n next.pathname,\n router.basepath,\n )\n\n const pathIsFuzzyEqual =\n currentPathSplit.startsWith(nextPathSplit) &&\n (currentPathSplit.length === nextPathSplit.length ||\n currentPathSplit[nextPathSplit.length] === '/')\n\n if (!pathIsFuzzyEqual) {\n return false\n }\n }\n\n if (activeOptions?.includeSearch ?? true) {\n const searchTest = deepEqual(s.location.search, next.search, {\n partial: !activeOptions?.exact,\n ignoreUndefined: !activeOptions?.explicitUndefined,\n })\n if (!searchTest) {\n return false\n }\n }\n\n if (activeOptions?.includeHash) {\n return s.location.hash === next.hash\n }\n return true\n },\n })\n\n const doPreload = React.useCallback(() => {\n router.preloadRoute({ ..._options } as any).catch((err) => {\n console.warn(err)\n console.warn(preloadWarning)\n })\n }, [router, _options])\n\n const preloadViewportIoCallback = React.useCallback(\n (entry: IntersectionObserverEntry | undefined) => {\n if (entry?.isIntersecting) {\n doPreload()\n }\n },\n [doPreload],\n )\n\n useIntersectionObserver(\n innerRef,\n preloadViewportIoCallback,\n intersectionObserverOptions,\n { disabled: !!disabled || !(preload === 'viewport') },\n )\n\n React.useEffect(() => {\n if (hasRenderFetched.current) {\n return\n }\n if (!disabled && preload === 'render') {\n doPreload()\n hasRenderFetched.current = true\n }\n }, [disabled, doPreload, preload])\n\n // The click handler\n const handleClick = (e: React.MouseEvent) => {\n if (\n !disabled &&\n !isCtrlEvent(e) &&\n !e.defaultPrevented &&\n (!target || target === '_self') &&\n e.button === 0\n ) {\n e.preventDefault()\n\n flushSync(() => {\n setIsTransitioning(true)\n })\n\n const unsub = router.subscribe('onResolved', () => {\n unsub()\n setIsTransitioning(false)\n })\n\n // All is well? Navigate!\n // N.B. we don't call `router.commitLocation(next) here because we want to run `validateSearch` before committing\n router.navigate({\n ..._options,\n replace,\n resetScroll,\n hashScrollIntoView,\n startTransition,\n viewTransition,\n ignoreBlocker,\n })\n }\n }\n\n if (isExternal) {\n return {\n ...propsSafeToSpread,\n ref: innerRef as React.ComponentPropsWithRef<'a'>['ref'],\n type,\n href: to,\n ...(children && { children }),\n ...(target && { target }),\n ...(disabled && { disabled }),\n ...(style && { style }),\n ...(className && { className }),\n ...(onClick && { onClick }),\n ...(onFocus && { onFocus }),\n ...(onMouseEnter && { onMouseEnter }),\n ...(onMouseLeave && { onMouseLeave }),\n ...(onTouchStart && { onTouchStart }),\n }\n }\n\n // The click handler\n const handleFocus = (_: React.MouseEvent) => {\n if (disabled) return\n if (preload) {\n doPreload()\n }\n }\n\n const handleTouchStart = handleFocus\n\n const handleEnter = (e: React.MouseEvent) => {\n if (disabled || !preload) return\n\n if (!preloadDelay) {\n doPreload()\n } else {\n const eventTarget = e.target\n if (timeoutMap.has(eventTarget)) {\n return\n }\n const id = setTimeout(() => {\n timeoutMap.delete(eventTarget)\n doPreload()\n }, preloadDelay)\n timeoutMap.set(eventTarget, id)\n }\n }\n\n const handleLeave = (e: React.MouseEvent) => {\n if (disabled || !preload || !preloadDelay) return\n const eventTarget = e.target\n const id = timeoutMap.get(eventTarget)\n if (id) {\n clearTimeout(id)\n timeoutMap.delete(eventTarget)\n }\n }\n\n // Get the active props\n const resolvedActiveProps: React.HTMLAttributes<HTMLAnchorElement> = isActive\n ? (functionalUpdate(activeProps as any, {}) ?? STATIC_ACTIVE_OBJECT)\n : STATIC_EMPTY_OBJECT\n\n // Get the inactive props\n const resolvedInactiveProps: React.HTMLAttributes<HTMLAnchorElement> =\n isActive\n ? STATIC_EMPTY_OBJECT\n : (functionalUpdate(inactiveProps, {}) ?? STATIC_EMPTY_OBJECT)\n\n const resolvedClassName = [\n className,\n resolvedActiveProps.className,\n resolvedInactiveProps.className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const resolvedStyle = (style ||\n resolvedActiveProps.style ||\n resolvedInactiveProps.style) && {\n ...style,\n ...resolvedActiveProps.style,\n ...resolvedInactiveProps.style,\n }\n\n return {\n ...propsSafeToSpread,\n ...resolvedActiveProps,\n ...resolvedInactiveProps,\n href: disabled\n ? undefined\n : next.maskedLocation\n ? router.history.createHref(next.maskedLocation.href)\n : router.history.createHref(next.href),\n ref: innerRef as React.ComponentPropsWithRef<'a'>['ref'],\n onClick: composeHandlers([onClick, handleClick]),\n onFocus: composeHandlers([onFocus, handleFocus]),\n onMouseEnter: composeHandlers([onMouseEnter, handleEnter]),\n onMouseLeave: composeHandlers([onMouseLeave, handleLeave]),\n onTouchStart: composeHandlers([onTouchStart, handleTouchStart]),\n disabled: !!disabled,\n target,\n ...(resolvedStyle && { style: resolvedStyle }),\n ...(resolvedClassName && { className: resolvedClassName }),\n ...(disabled && STATIC_DISABLED_PROPS),\n ...(isActive && STATIC_ACTIVE_PROPS),\n ...(isTransitioning && STATIC_TRANSITIONING_PROPS),\n }\n}\n\nconst STATIC_EMPTY_OBJECT = {}\nconst STATIC_ACTIVE_OBJECT = { className: 'active' }\nconst STATIC_DISABLED_PROPS = { role: 'link', 'aria-disabled': true }\nconst STATIC_ACTIVE_PROPS = { 'data-status': 'active', 'aria-current': 'page' }\nconst STATIC_TRANSITIONING_PROPS = { 'data-transitioning': 'transitioning' }\n\nconst timeoutMap = new WeakMap<EventTarget, ReturnType<typeof setTimeout>>()\n\nconst intersectionObserverOptions: IntersectionObserverInit = {\n rootMargin: '100px',\n}\n\nconst composeHandlers =\n (handlers: Array<undefined | React.EventHandler<any>>) =>\n (e: React.SyntheticEvent) => {\n handlers.filter(Boolean).forEach((handler) => {\n if (e.defaultPrevented) return\n handler!(e)\n })\n }\n\ntype UseLinkReactProps<TComp> = TComp extends keyof React.JSX.IntrinsicElements\n ? React.JSX.IntrinsicElements[TComp]\n : TComp extends React.ComponentType<any>\n ? React.ComponentPropsWithoutRef<TComp> &\n React.RefAttributes<React.ComponentRef<TComp>>\n : never\n\nexport type UseLinkPropsOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends RoutePaths<TRouter['routeTree']> | string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends RoutePaths<TRouter['routeTree']> | string = TFrom,\n TMaskTo extends string = '.',\n> = ActiveLinkOptions<'a', TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n UseLinkReactProps<'a'>\n\nexport type ActiveLinkOptions<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = LinkOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n ActiveLinkOptionProps<TComp>\n\ntype ActiveLinkProps<TComp> = Partial<\n LinkComponentReactProps<TComp> & {\n [key: `data-${string}`]: unknown\n }\n>\n\nexport interface ActiveLinkOptionProps<TComp = 'a'> {\n /**\n * A function that returns additional props for the `active` state of this link.\n * These props override other props passed to the link (`style`'s are merged, `className`'s are concatenated)\n */\n activeProps?: ActiveLinkProps<TComp> | (() => ActiveLinkProps<TComp>)\n /**\n * A function that returns additional props for the `inactive` state of this link.\n * These props override other props passed to the link (`style`'s are merged, `className`'s are concatenated)\n */\n inactiveProps?: ActiveLinkProps<TComp> | (() => ActiveLinkProps<TComp>)\n}\n\nexport type LinkProps<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = ActiveLinkOptions<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n LinkPropsChildren\n\nexport interface LinkPropsChildren {\n // If a function is passed as a child, it will be given the `isActive` boolean to aid in further styling on the element it returns\n children?:\n | React.ReactNode\n | ((state: {\n isActive: boolean\n isTransitioning: boolean\n }) => React.ReactNode)\n}\n\ntype LinkComponentReactProps<TComp> = Omit<\n UseLinkReactProps<TComp>,\n keyof CreateLinkProps\n>\n\nexport type LinkComponentProps<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = LinkComponentReactProps<TComp> &\n LinkProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>\n\nexport type CreateLinkProps = LinkProps<\n any,\n any,\n string,\n string,\n string,\n string\n>\n\nexport type LinkComponent<\n in out TComp,\n in out TDefaultFrom extends string = string,\n> = <\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = TDefaultFrom,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(\n props: LinkComponentProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n) => React.ReactElement\n\nexport interface LinkComponentRoute<\n in out TDefaultFrom extends string = string,\n> {\n defaultFrom: TDefaultFrom\n <\n TRouter extends AnyRouter = RegisteredRouter,\n const TTo extends string | undefined = undefined,\n const TMaskTo extends string = '',\n >(\n props: LinkComponentProps<\n 'a',\n TRouter,\n this['defaultFrom'],\n TTo,\n this['defaultFrom'],\n TMaskTo\n >,\n ): React.ReactElement\n}\n\nexport function createLink<const TComp>(\n Comp: Constrain<TComp, any, (props: CreateLinkProps) => ReactNode>,\n): LinkComponent<TComp> {\n return React.forwardRef(function CreatedLink(props, ref) {\n return <Link {...(props as any)} _asChild={Comp} ref={ref} />\n }) as any\n}\n\nexport const Link: LinkComponent<'a'> = React.forwardRef<Element, any>(\n (props, ref) => {\n const { _asChild, ...rest } = props\n const {\n type: _type,\n ref: innerRef,\n ...linkProps\n } = useLinkProps(rest as any, ref)\n\n const children =\n typeof rest.children === 'function'\n ? rest.children({\n isActive: (linkProps as any)['data-status'] === 'active',\n })\n : rest.children\n\n if (_asChild === undefined) {\n // the ReturnType of useLinkProps returns the correct type for a <a> element, not a general component that has a disabled prop\n // @ts-expect-error\n delete linkProps.disabled\n }\n\n return React.createElement(\n _asChild ? _asChild : 'a',\n {\n ...linkProps,\n ref: innerRef,\n },\n children,\n )\n },\n) as any\n\nfunction isCtrlEvent(e: React.MouseEvent) {\n return !!(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey)\n}\n\nexport type LinkOptionsFnOptions<\n TOptions,\n TComp,\n TRouter extends AnyRouter = RegisteredRouter,\n> =\n TOptions extends ReadonlyArray<any>\n ? ValidateLinkOptionsArray<TRouter, TOptions, string, TComp>\n : ValidateLinkOptions<TRouter, TOptions, string, TComp>\n\nexport type LinkOptionsFn<TComp> = <\n const TOptions,\n TRouter extends AnyRouter = RegisteredRouter,\n>(\n options: LinkOptionsFnOptions<TOptions, TComp, TRouter>,\n) => TOptions\n\nexport const linkOptions: LinkOptionsFn<'a'> = (options) => {\n return options as any\n}\n"],"names":["useRouter","React","useForwardedRef","useRouterState","useActiveLocation","exactPathTest","removeTrailingSlash","deepEqual","preloadWarning","useIntersectionObserver","flushSync","functionalUpdate"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BgB,SAAA,aAOd,SACA,cACkC;AAClC,QAAM,SAASA,UAAAA,UAAU;AACzB,QAAM,CAAC,iBAAiB,kBAAkB,IAAIC,iBAAM,SAAS,KAAK;AAC5D,QAAA,mBAAmBA,iBAAM,OAAO,KAAK;AACrC,QAAA,WAAWC,sBAAgB,YAAY;AAEvC,QAAA;AAAA;AAAA,IAEJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,MAAM;AAAA,IACN;AAAA,IACA,GAAG;AAAA,EAAA,IACD;AAQE,QAAA,OAAgCD,iBAAM,QAAQ,MAAM;AACpD,QAAA;AACF,UAAI,IAAI,EAAS;AACV,aAAA;AAAA,IAAA,QACD;AAAA,IAAA;AACD,WAAA;AAAA,EAAA,GACN,CAAC,EAAE,CAAC;AAGP,QAAM,gBAAgBE,eAAAA,eAAe;AAAA,IACnC,QAAQ,CAAC,MAAM,EAAE,SAAS;AAAA,IAC1B,mBAAmB;AAAA,EAAA,CACpB;AAGD,QAAM,iBAAiBA,eAAAA,eAAe;AAAA,IACpC,QAAQ,CAAC,MAAM,EAAE;AAAA,IACjB,mBAAmB;AAAA,EAAA,CACpB;AAEK,QAAA,EAAE,YAAY,IAAIC,oCAAkB;AAEpC,QAAA,OAAO,YAAY,QAAQ,IAAI;AAErC,QAAM,WAAWH,iBAAM;AAAA,IACrB,MAAM;AACG,aAAA,EAAE,GAAG,SAAS,KAAK;AAAA,IAC5B;AAAA;AAAA,IAEA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,IAAA;AAAA,EAEZ;AAEA,QAAM,OAAOA,iBAAM;AAAA,IACjB,MAAM,OAAO,cAAc,EAAE,GAAG,UAAiB;AAAA,IACjD,CAAC,QAAQ,QAAQ;AAAA,EACnB;AAEA,QAAM,aAAa,SAAS;AAE5B,QAAM,UACJ,QAAQ,kBAAkB,aACtB,QACC,eAAe,OAAO,QAAQ;AACrC,QAAM,eACJ,oBAAoB,OAAO,QAAQ,uBAAuB;AAE5D,QAAM,WAAWE,eAAAA,eAAe;AAAA,IAC9B,QAAQ,CAAC,MAAM;AACb,UAAI,WAAmB,QAAA;AACvB,UAAI,+CAAe,OAAO;AACxB,cAAM,YAAYE,WAAA;AAAA,UAChB,EAAE,SAAS;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,QACT;AACA,YAAI,CAAC,WAAW;AACP,iBAAA;AAAA,QAAA;AAAA,MACT,OACK;AACL,cAAM,mBAAmBC,WAAA;AAAA,UACvB,EAAE,SAAS;AAAA,UACX,OAAO;AAAA,QACT;AACA,cAAM,gBAAgBA,WAAA;AAAA,UACpB,KAAK;AAAA,UACL,OAAO;AAAA,QACT;AAEA,cAAM,mBACJ,iBAAiB,WAAW,aAAa,MACxC,iBAAiB,WAAW,cAAc,UACzC,iBAAiB,cAAc,MAAM,MAAM;AAE/C,YAAI,CAAC,kBAAkB;AACd,iBAAA;AAAA,QAAA;AAAA,MACT;AAGE,WAAA,+CAAe,kBAAiB,MAAM;AACxC,cAAM,aAAaC,WAAAA,UAAU,EAAE,SAAS,QAAQ,KAAK,QAAQ;AAAA,UAC3D,SAAS,EAAC,+CAAe;AAAA,UACzB,iBAAiB,EAAC,+CAAe;AAAA,QAAA,CAClC;AACD,YAAI,CAAC,YAAY;AACR,iBAAA;AAAA,QAAA;AAAA,MACT;AAGF,UAAI,+CAAe,aAAa;AACvB,eAAA,EAAE,SAAS,SAAS,KAAK;AAAA,MAAA;AAE3B,aAAA;AAAA,IAAA;AAAA,EACT,CACD;AAEK,QAAA,YAAYN,iBAAM,YAAY,MAAM;AACjC,WAAA,aAAa,EAAE,GAAG,SAAiB,CAAA,EAAE,MAAM,CAAC,QAAQ;AACzD,cAAQ,KAAK,GAAG;AAChB,cAAQ,KAAKO,yBAAc;AAAA,IAAA,CAC5B;AAAA,EAAA,GACA,CAAC,QAAQ,QAAQ,CAAC;AAErB,QAAM,4BAA4BP,iBAAM;AAAA,IACtC,CAAC,UAAiD;AAChD,UAAI,+BAAO,gBAAgB;AACf,kBAAA;AAAA,MAAA;AAAA,IAEd;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEAQ,QAAA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,UAAU,CAAC,CAAC,YAAY,EAAE,YAAY,YAAY;AAAA,EACtD;AAEAR,mBAAM,UAAU,MAAM;AACpB,QAAI,iBAAiB,SAAS;AAC5B;AAAA,IAAA;AAEE,QAAA,CAAC,YAAY,YAAY,UAAU;AAC3B,gBAAA;AACV,uBAAiB,UAAU;AAAA,IAAA;AAAA,EAE5B,GAAA,CAAC,UAAU,WAAW,OAAO,CAAC;AAG3B,QAAA,cAAc,CAAC,MAAwB;AAC3C,QACE,CAAC,YACD,CAAC,YAAY,CAAC,KACd,CAAC,EAAE,qBACF,CAAC,UAAU,WAAW,YACvB,EAAE,WAAW,GACb;AACA,QAAE,eAAe;AAEjBS,eAAAA,UAAU,MAAM;AACd,2BAAmB,IAAI;AAAA,MAAA,CACxB;AAED,YAAM,QAAQ,OAAO,UAAU,cAAc,MAAM;AAC3C,cAAA;AACN,2BAAmB,KAAK;AAAA,MAAA,CACzB;AAID,aAAO,SAAS;AAAA,QACd,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IAAA;AAAA,EAEL;AAEA,MAAI,YAAY;AACP,WAAA;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,GAAI,YAAY,EAAE,SAAS;AAAA,MAC3B,GAAI,UAAU,EAAE,OAAO;AAAA,MACvB,GAAI,YAAY,EAAE,SAAS;AAAA,MAC3B,GAAI,SAAS,EAAE,MAAM;AAAA,MACrB,GAAI,aAAa,EAAE,UAAU;AAAA,MAC7B,GAAI,WAAW,EAAE,QAAQ;AAAA,MACzB,GAAI,WAAW,EAAE,QAAQ;AAAA,MACzB,GAAI,gBAAgB,EAAE,aAAa;AAAA,MACnC,GAAI,gBAAgB,EAAE,aAAa;AAAA,MACnC,GAAI,gBAAgB,EAAE,aAAa;AAAA,IACrC;AAAA,EAAA;AAII,QAAA,cAAc,CAAC,MAAwB;AAC3C,QAAI,SAAU;AACd,QAAI,SAAS;AACD,gBAAA;AAAA,IAAA;AAAA,EAEd;AAEA,QAAM,mBAAmB;AAEnB,QAAA,cAAc,CAAC,MAAwB;AACvC,QAAA,YAAY,CAAC,QAAS;AAE1B,QAAI,CAAC,cAAc;AACP,gBAAA;AAAA,IAAA,OACL;AACL,YAAM,cAAc,EAAE;AAClB,UAAA,WAAW,IAAI,WAAW,GAAG;AAC/B;AAAA,MAAA;AAEI,YAAA,KAAK,WAAW,MAAM;AAC1B,mBAAW,OAAO,WAAW;AACnB,kBAAA;AAAA,SACT,YAAY;AACJ,iBAAA,IAAI,aAAa,EAAE;AAAA,IAAA;AAAA,EAElC;AAEM,QAAA,cAAc,CAAC,MAAwB;AAC3C,QAAI,YAAY,CAAC,WAAW,CAAC,aAAc;AAC3C,UAAM,cAAc,EAAE;AAChB,UAAA,KAAK,WAAW,IAAI,WAAW;AACrC,QAAI,IAAI;AACN,mBAAa,EAAE;AACf,iBAAW,OAAO,WAAW;AAAA,IAAA;AAAA,EAEjC;AAGA,QAAM,sBAA+D,WAChEC,WAAA,iBAAiB,aAAoB,CAAE,CAAA,KAAK,uBAC7C;AAGJ,QAAM,wBACJ,WACI,sBACCA,4BAAiB,eAAe,CAAE,CAAA,KAAK;AAE9C,QAAM,oBAAoB;AAAA,IACxB;AAAA,IACA,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,EAErB,EAAA,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAM,iBAAiB,SACrB,oBAAoB,SACpB,sBAAsB,UAAU;AAAA,IAChC,GAAG;AAAA,IACH,GAAG,oBAAoB;AAAA,IACvB,GAAG,sBAAsB;AAAA,EAC3B;AAEO,SAAA;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,MAAM,WACF,SACA,KAAK,iBACH,OAAO,QAAQ,WAAW,KAAK,eAAe,IAAI,IAClD,OAAO,QAAQ,WAAW,KAAK,IAAI;AAAA,IACzC,KAAK;AAAA,IACL,SAAS,gBAAgB,CAAC,SAAS,WAAW,CAAC;AAAA,IAC/C,SAAS,gBAAgB,CAAC,SAAS,WAAW,CAAC;AAAA,IAC/C,cAAc,gBAAgB,CAAC,cAAc,WAAW,CAAC;AAAA,IACzD,cAAc,gBAAgB,CAAC,cAAc,WAAW,CAAC;AAAA,IACzD,cAAc,gBAAgB,CAAC,cAAc,gBAAgB,CAAC;AAAA,IAC9D,UAAU,CAAC,CAAC;AAAA,IACZ;AAAA,IACA,GAAI,iBAAiB,EAAE,OAAO,cAAc;AAAA,IAC5C,GAAI,qBAAqB,EAAE,WAAW,kBAAkB;AAAA,IACxD,GAAI,YAAY;AAAA,IAChB,GAAI,YAAY;AAAA,IAChB,GAAI,mBAAmB;AAAA,EACzB;AACF;AAEA,MAAM,sBAAsB,CAAC;AAC7B,MAAM,uBAAuB,EAAE,WAAW,SAAS;AACnD,MAAM,wBAAwB,EAAE,MAAM,QAAQ,iBAAiB,KAAK;AACpE,MAAM,sBAAsB,EAAE,eAAe,UAAU,gBAAgB,OAAO;AAC9E,MAAM,6BAA6B,EAAE,sBAAsB,gBAAgB;AAE3E,MAAM,iCAAiB,QAAoD;AAE3E,MAAM,8BAAwD;AAAA,EAC5D,YAAY;AACd;AAEA,MAAM,kBACJ,CAAC,aACD,CAAC,MAA4B;AAC3B,WAAS,OAAO,OAAO,EAAE,QAAQ,CAAC,YAAY;AAC5C,QAAI,EAAE,iBAAkB;AACxB,YAAS,CAAC;AAAA,EAAA,CACX;AACH;AA4HK,SAAS,WACd,MACsB;AACtB,SAAOV,iBAAM,WAAW,SAAS,YAAY,OAAO,KAAK;AACvD,0CAAQ,MAAM,EAAA,GAAI,OAAe,UAAU,MAAM,KAAU;AAAA,EAAA,CAC5D;AACH;AAEO,MAAM,OAA2BA,iBAAM;AAAA,EAC5C,CAAC,OAAO,QAAQ;AACd,UAAM,EAAE,UAAU,GAAG,KAAA,IAAS;AACxB,UAAA;AAAA,MACJ,MAAM;AAAA,MACN,KAAK;AAAA,MACL,GAAG;AAAA,IAAA,IACD,aAAa,MAAa,GAAG;AAEjC,UAAM,WACJ,OAAO,KAAK,aAAa,aACrB,KAAK,SAAS;AAAA,MACZ,UAAW,UAAkB,aAAa,MAAM;AAAA,IAAA,CACjD,IACD,KAAK;AAEX,QAAI,aAAa,QAAW;AAG1B,aAAO,UAAU;AAAA,IAAA;AAGnB,WAAOA,iBAAM;AAAA,MACX,WAAW,WAAW;AAAA,MACtB;AAAA,QACE,GAAG;AAAA,QACH,KAAK;AAAA,MACP;AAAA,MACA;AAAA,IACF;AAAA,EAAA;AAEJ;AAEA,SAAS,YAAY,GAAqB;AACjC,SAAA,CAAC,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE;AACpD;AAkBa,MAAA,cAAkC,CAAC,YAAY;AACnD,SAAA;AACT;;;;;"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const routerCore = require("@tanstack/router-core");
|
|
4
|
+
const React = require("react");
|
|
5
|
+
const useRouter = require("./useRouter.cjs");
|
|
6
|
+
const useMatch = require("./useMatch.cjs");
|
|
7
|
+
const useRouterState = require("./useRouterState.cjs");
|
|
8
|
+
const useActiveLocation = (location) => {
|
|
9
|
+
const router = useRouter.useRouter();
|
|
10
|
+
const routerLocation = useRouterState.useRouterState({ select: (state) => state.location });
|
|
11
|
+
const [activeLocation, setActiveLocation] = React.useState(
|
|
12
|
+
routerLocation
|
|
13
|
+
);
|
|
14
|
+
const [customActiveLocation, setCustomActiveLocation] = React.useState(location);
|
|
15
|
+
React.useEffect(() => {
|
|
16
|
+
setActiveLocation(customActiveLocation ?? routerLocation);
|
|
17
|
+
}, [routerLocation, customActiveLocation]);
|
|
18
|
+
const matchIndex = useMatch.useMatch({
|
|
19
|
+
strict: false,
|
|
20
|
+
select: (match) => match.index
|
|
21
|
+
});
|
|
22
|
+
const getFromPath = React.useCallback(
|
|
23
|
+
(from) => {
|
|
24
|
+
const activeLocationMatches = router.matchRoutes(activeLocation, {
|
|
25
|
+
_buildLocation: false
|
|
26
|
+
});
|
|
27
|
+
const activeLocationMatch = routerCore.last(activeLocationMatches);
|
|
28
|
+
return from ?? (activeLocationMatch == null ? void 0 : activeLocationMatch.fullPath) ?? router.state.matches[matchIndex].fullPath;
|
|
29
|
+
},
|
|
30
|
+
[activeLocation, matchIndex, router]
|
|
31
|
+
);
|
|
32
|
+
return {
|
|
33
|
+
activeLocation,
|
|
34
|
+
getFromPath,
|
|
35
|
+
setActiveLocation: setCustomActiveLocation
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
exports.useActiveLocation = useActiveLocation;
|
|
39
|
+
//# sourceMappingURL=useActiveLocation.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useActiveLocation.cjs","sources":["../../src/useActiveLocation.ts"],"sourcesContent":["import { last } from '@tanstack/router-core'\nimport { useCallback, useEffect, useState } from 'react'\nimport { useRouter } from './useRouter'\nimport { useMatch } from './useMatch'\nimport { useRouterState } from './useRouterState'\nimport type { ParsedLocation } from '@tanstack/router-core'\n\nexport type UseActiveLocationResult = {\n activeLocation: ParsedLocation\n getFromPath: (from?: string) => string\n setActiveLocation: (location?: ParsedLocation) => void\n}\n\nexport const useActiveLocation = (\n location?: ParsedLocation,\n): UseActiveLocationResult => {\n const router = useRouter()\n const routerLocation = useRouterState({ select: (state) => state.location })\n const [activeLocation, setActiveLocation] = useState<ParsedLocation>(\n location ?? routerLocation,\n )\n const [customActiveLocation, setCustomActiveLocation] = useState<\n ParsedLocation | undefined\n >(location)\n\n useEffect(() => {\n setActiveLocation(customActiveLocation ?? routerLocation)\n }, [routerLocation, customActiveLocation])\n\n const matchIndex = useMatch({\n strict: false,\n select: (match) => match.index,\n })\n\n const getFromPath = useCallback(\n (from?: string) => {\n const activeLocationMatches = router.matchRoutes(activeLocation, {\n _buildLocation: false,\n })\n\n const activeLocationMatch = last(activeLocationMatches)\n\n return (\n from ??\n activeLocationMatch?.fullPath ??\n router.state.matches[matchIndex]!.fullPath\n )\n },\n [activeLocation, matchIndex, router],\n )\n\n return {\n activeLocation,\n getFromPath,\n setActiveLocation: setCustomActiveLocation,\n }\n}\n"],"names":["useRouter","useRouterState","useState","useEffect","useMatch","useCallback","last"],"mappings":";;;;;;;AAaa,MAAA,oBAAoB,CAC/B,aAC4B;AAC5B,QAAM,SAASA,UAAAA,UAAU;AACnB,QAAA,iBAAiBC,eAAAA,eAAe,EAAE,QAAQ,CAAC,UAAU,MAAM,UAAU;AACrE,QAAA,CAAC,gBAAgB,iBAAiB,IAAIC,MAAA;AAAA,IAC9B;AAAA,EACd;AACA,QAAM,CAAC,sBAAsB,uBAAuB,IAAIA,MAAAA,SAEtD,QAAQ;AAEVC,QAAAA,UAAU,MAAM;AACd,sBAAkB,wBAAwB,cAAc;AAAA,EAAA,GACvD,CAAC,gBAAgB,oBAAoB,CAAC;AAEzC,QAAM,aAAaC,SAAAA,SAAS;AAAA,IAC1B,QAAQ;AAAA,IACR,QAAQ,CAAC,UAAU,MAAM;AAAA,EAAA,CAC1B;AAED,QAAM,cAAcC,MAAA;AAAA,IAClB,CAAC,SAAkB;AACX,YAAA,wBAAwB,OAAO,YAAY,gBAAgB;AAAA,QAC/D,gBAAgB;AAAA,MAAA,CACjB;AAEK,YAAA,sBAAsBC,gBAAK,qBAAqB;AAEtD,aACE,SACA,2DAAqB,aACrB,OAAO,MAAM,QAAQ,UAAU,EAAG;AAAA,IAEtC;AAAA,IACA,CAAC,gBAAgB,YAAY,MAAM;AAAA,EACrC;AAEO,SAAA;AAAA,IACL;AAAA,IACA;AAAA,IACA,mBAAmB;AAAA,EACrB;AACF;;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ParsedLocation } from '@tanstack/router-core';
|
|
2
|
+
export type UseActiveLocationResult = {
|
|
3
|
+
activeLocation: ParsedLocation;
|
|
4
|
+
getFromPath: (from?: string) => string;
|
|
5
|
+
setActiveLocation: (location?: ParsedLocation) => void;
|
|
6
|
+
};
|
|
7
|
+
export declare const useActiveLocation: (location?: ParsedLocation) => UseActiveLocationResult;
|
package/dist/cjs/useNavigate.cjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const React = require("react");
|
|
4
4
|
const useRouter = require("./useRouter.cjs");
|
|
5
|
-
const
|
|
5
|
+
const useActiveLocation = require("./useActiveLocation.cjs");
|
|
6
6
|
function _interopNamespaceDefault(e) {
|
|
7
7
|
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
|
8
8
|
if (e) {
|
|
@@ -21,21 +21,18 @@ function _interopNamespaceDefault(e) {
|
|
|
21
21
|
}
|
|
22
22
|
const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
|
|
23
23
|
function useNavigate(_defaultOpts) {
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
strict: false,
|
|
27
|
-
select: (match) => match.index
|
|
28
|
-
});
|
|
24
|
+
const router = useRouter.useRouter();
|
|
25
|
+
const { getFromPath, activeLocation } = useActiveLocation.useActiveLocation();
|
|
29
26
|
return React__namespace.useCallback(
|
|
30
27
|
(options) => {
|
|
31
|
-
const from = options.from ?? (_defaultOpts == null ? void 0 : _defaultOpts.from)
|
|
32
|
-
return navigate({
|
|
28
|
+
const from = getFromPath(options.from ?? (_defaultOpts == null ? void 0 : _defaultOpts.from));
|
|
29
|
+
return router.navigate({
|
|
33
30
|
...options,
|
|
34
31
|
from
|
|
35
32
|
});
|
|
36
33
|
},
|
|
37
34
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
38
|
-
[_defaultOpts == null ? void 0 : _defaultOpts.from,
|
|
35
|
+
[_defaultOpts == null ? void 0 : _defaultOpts.from, router, getFromPath, activeLocation]
|
|
39
36
|
);
|
|
40
37
|
}
|
|
41
38
|
function Navigate(props) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNavigate.cjs","sources":["../../src/useNavigate.tsx"],"sourcesContent":["import * as React from 'react'\nimport { useRouter } from './useRouter'\nimport {
|
|
1
|
+
{"version":3,"file":"useNavigate.cjs","sources":["../../src/useNavigate.tsx"],"sourcesContent":["import * as React from 'react'\nimport { useRouter } from './useRouter'\nimport { useActiveLocation } from './useActiveLocation'\nimport type {\n AnyRouter,\n FromPathOption,\n NavigateOptions,\n RegisteredRouter,\n UseNavigateResult,\n} from '@tanstack/router-core'\n\nexport function useNavigate<\n TRouter extends AnyRouter = RegisteredRouter,\n TDefaultFrom extends string = string,\n>(_defaultOpts?: {\n from?: FromPathOption<TRouter, TDefaultFrom>\n}): UseNavigateResult<TDefaultFrom> {\n const router = useRouter()\n\n const { getFromPath, activeLocation } = useActiveLocation()\n\n return React.useCallback(\n (options: NavigateOptions) => {\n const from = getFromPath(options.from ?? _defaultOpts?.from)\n\n return router.navigate({\n ...options,\n from,\n })\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [_defaultOpts?.from, router, getFromPath, activeLocation],\n ) as UseNavigateResult<TDefaultFrom>\n}\n\nexport function Navigate<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(props: NavigateOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>): null {\n const router = useRouter()\n const navigate = useNavigate()\n\n const previousPropsRef = React.useRef<NavigateOptions<\n TRouter,\n TFrom,\n TTo,\n TMaskFrom,\n TMaskTo\n > | null>(null)\n React.useEffect(() => {\n if (previousPropsRef.current !== props) {\n navigate(props)\n previousPropsRef.current = props\n }\n }, [router, props, navigate])\n return null\n}\n"],"names":["useRouter","useActiveLocation","React"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAWO,SAAS,YAGd,cAEkC;AAClC,QAAM,SAASA,UAAAA,UAAU;AAEzB,QAAM,EAAE,aAAa,eAAe,IAAIC,oCAAkB;AAE1D,SAAOC,iBAAM;AAAA,IACX,CAAC,YAA6B;AAC5B,YAAM,OAAO,YAAY,QAAQ,SAAQ,6CAAc,KAAI;AAE3D,aAAO,OAAO,SAAS;AAAA,QACrB,GAAG;AAAA,QACH;AAAA,MAAA,CACD;AAAA,IACH;AAAA;AAAA,IAEA,CAAC,6CAAc,MAAM,QAAQ,aAAa,cAAc;AAAA,EAC1D;AACF;AAEO,SAAS,SAMd,OAAuE;AACvE,QAAM,SAASF,UAAAA,UAAU;AACzB,QAAM,WAAW,YAAY;AAEvB,QAAA,mBAAmBE,iBAAM,OAMrB,IAAI;AACdA,mBAAM,UAAU,MAAM;AAChB,QAAA,iBAAiB,YAAY,OAAO;AACtC,eAAS,KAAK;AACd,uBAAiB,UAAU;AAAA,IAAA;AAAA,EAE5B,GAAA,CAAC,QAAQ,OAAO,QAAQ,CAAC;AACrB,SAAA;AACT;;;"}
|
package/dist/esm/link.js
CHANGED
|
@@ -2,10 +2,10 @@ import { jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import { flushSync } from "react-dom";
|
|
4
4
|
import { preloadWarning, functionalUpdate, exactPathTest, removeTrailingSlash, deepEqual } from "@tanstack/router-core";
|
|
5
|
+
import { useActiveLocation } from "./useActiveLocation.js";
|
|
5
6
|
import { useRouterState } from "./useRouterState.js";
|
|
6
7
|
import { useRouter } from "./useRouter.js";
|
|
7
8
|
import { useForwardedRef, useIntersectionObserver } from "./utils.js";
|
|
8
|
-
import { useMatch } from "./useMatch.js";
|
|
9
9
|
function useLinkProps(options, forwardedRef) {
|
|
10
10
|
const router = useRouter();
|
|
11
11
|
const [isTransitioning, setIsTransitioning] = React.useState(false);
|
|
@@ -60,18 +60,23 @@ function useLinkProps(options, forwardedRef) {
|
|
|
60
60
|
select: (s) => s.location.search,
|
|
61
61
|
structuralSharing: true
|
|
62
62
|
});
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
const routerLocation = useRouterState({
|
|
64
|
+
select: (s) => s.location,
|
|
65
|
+
structuralSharing: true
|
|
66
66
|
});
|
|
67
|
-
const
|
|
68
|
-
|
|
67
|
+
const { getFromPath } = useActiveLocation();
|
|
68
|
+
const from = getFromPath(options.from);
|
|
69
|
+
const _options = React.useMemo(
|
|
70
|
+
() => {
|
|
71
|
+
return { ...options, from };
|
|
72
|
+
},
|
|
69
73
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
70
74
|
[
|
|
71
75
|
router,
|
|
76
|
+
routerLocation,
|
|
72
77
|
currentSearch,
|
|
73
|
-
options._fromLocation,
|
|
74
78
|
from,
|
|
79
|
+
options._fromLocation,
|
|
75
80
|
options.hash,
|
|
76
81
|
options.to,
|
|
77
82
|
options.search,
|
|
@@ -81,6 +86,10 @@ function useLinkProps(options, forwardedRef) {
|
|
|
81
86
|
options.unsafeRelative
|
|
82
87
|
]
|
|
83
88
|
);
|
|
89
|
+
const next = React.useMemo(
|
|
90
|
+
() => router.buildLocation({ ..._options }),
|
|
91
|
+
[router, _options]
|
|
92
|
+
);
|
|
84
93
|
const isExternal = type === "external";
|
|
85
94
|
const preload = options.reloadDocument || isExternal ? false : userPreload ?? router.options.defaultPreload;
|
|
86
95
|
const preloadDelay = userPreloadDelay ?? router.options.defaultPreloadDelay ?? 0;
|
|
@@ -125,34 +134,12 @@ function useLinkProps(options, forwardedRef) {
|
|
|
125
134
|
return true;
|
|
126
135
|
}
|
|
127
136
|
});
|
|
128
|
-
const doPreload = React.useCallback(
|
|
129
|
-
() => {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
},
|
|
135
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
136
|
-
[
|
|
137
|
-
router,
|
|
138
|
-
options.to,
|
|
139
|
-
options._fromLocation,
|
|
140
|
-
from,
|
|
141
|
-
options.search,
|
|
142
|
-
options.hash,
|
|
143
|
-
options.params,
|
|
144
|
-
options.state,
|
|
145
|
-
options.mask,
|
|
146
|
-
options.unsafeRelative,
|
|
147
|
-
options.hashScrollIntoView,
|
|
148
|
-
options.href,
|
|
149
|
-
options.ignoreBlocker,
|
|
150
|
-
options.reloadDocument,
|
|
151
|
-
options.replace,
|
|
152
|
-
options.resetScroll,
|
|
153
|
-
options.viewTransition
|
|
154
|
-
]
|
|
155
|
-
);
|
|
137
|
+
const doPreload = React.useCallback(() => {
|
|
138
|
+
router.preloadRoute({ ..._options }).catch((err) => {
|
|
139
|
+
console.warn(err);
|
|
140
|
+
console.warn(preloadWarning);
|
|
141
|
+
});
|
|
142
|
+
}, [router, _options]);
|
|
156
143
|
const preloadViewportIoCallback = React.useCallback(
|
|
157
144
|
(entry) => {
|
|
158
145
|
if (entry == null ? void 0 : entry.isIntersecting) {
|
|
@@ -176,24 +163,6 @@ function useLinkProps(options, forwardedRef) {
|
|
|
176
163
|
hasRenderFetched.current = true;
|
|
177
164
|
}
|
|
178
165
|
}, [disabled, doPreload, preload]);
|
|
179
|
-
if (isExternal) {
|
|
180
|
-
return {
|
|
181
|
-
...propsSafeToSpread,
|
|
182
|
-
ref: innerRef,
|
|
183
|
-
type,
|
|
184
|
-
href: to,
|
|
185
|
-
...children && { children },
|
|
186
|
-
...target && { target },
|
|
187
|
-
...disabled && { disabled },
|
|
188
|
-
...style && { style },
|
|
189
|
-
...className && { className },
|
|
190
|
-
...onClick && { onClick },
|
|
191
|
-
...onFocus && { onFocus },
|
|
192
|
-
...onMouseEnter && { onMouseEnter },
|
|
193
|
-
...onMouseLeave && { onMouseLeave },
|
|
194
|
-
...onTouchStart && { onTouchStart }
|
|
195
|
-
};
|
|
196
|
-
}
|
|
197
166
|
const handleClick = (e) => {
|
|
198
167
|
if (!disabled && !isCtrlEvent(e) && !e.defaultPrevented && (!target || target === "_self") && e.button === 0) {
|
|
199
168
|
e.preventDefault();
|
|
@@ -205,8 +174,7 @@ function useLinkProps(options, forwardedRef) {
|
|
|
205
174
|
setIsTransitioning(false);
|
|
206
175
|
});
|
|
207
176
|
router.navigate({
|
|
208
|
-
...
|
|
209
|
-
from,
|
|
177
|
+
..._options,
|
|
210
178
|
replace,
|
|
211
179
|
resetScroll,
|
|
212
180
|
hashScrollIntoView,
|
|
@@ -216,6 +184,24 @@ function useLinkProps(options, forwardedRef) {
|
|
|
216
184
|
});
|
|
217
185
|
}
|
|
218
186
|
};
|
|
187
|
+
if (isExternal) {
|
|
188
|
+
return {
|
|
189
|
+
...propsSafeToSpread,
|
|
190
|
+
ref: innerRef,
|
|
191
|
+
type,
|
|
192
|
+
href: to,
|
|
193
|
+
...children && { children },
|
|
194
|
+
...target && { target },
|
|
195
|
+
...disabled && { disabled },
|
|
196
|
+
...style && { style },
|
|
197
|
+
...className && { className },
|
|
198
|
+
...onClick && { onClick },
|
|
199
|
+
...onFocus && { onFocus },
|
|
200
|
+
...onMouseEnter && { onMouseEnter },
|
|
201
|
+
...onMouseLeave && { onMouseLeave },
|
|
202
|
+
...onTouchStart && { onTouchStart }
|
|
203
|
+
};
|
|
204
|
+
}
|
|
219
205
|
const handleFocus = (_) => {
|
|
220
206
|
if (disabled) return;
|
|
221
207
|
if (preload) {
|