@umijs/renderer-react 4.3.36 → 4.4.0

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/link.d.ts CHANGED
@@ -1,5 +1,6 @@
1
- import React, { PropsWithChildren } from 'react';
1
+ import React from 'react';
2
2
  import { LinkProps } from 'react-router-dom';
3
- export declare function LinkWithPrefetch(props: PropsWithChildren<{
4
- prefetch?: boolean;
5
- } & LinkProps & React.RefAttributes<HTMLAnchorElement>>): React.JSX.Element | null;
3
+ export declare const LinkWithPrefetch: React.ForwardRefExoticComponent<Omit<React.PropsWithChildren<{
4
+ prefetch?: boolean | "viewport" | "render" | "intent" | "none" | undefined;
5
+ prefetchTimeout?: number | undefined;
6
+ } & LinkProps & React.RefAttributes<HTMLAnchorElement>>, "ref"> & React.RefAttributes<unknown>>;
package/dist/link.js CHANGED
@@ -1,22 +1,89 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
3
3
  var _excluded = ["prefetch"];
4
- import React from 'react';
4
+ import React, { useLayoutEffect } from 'react';
5
5
  import { Link } from 'react-router-dom';
6
6
  import { useAppData } from "./appContext";
7
- export function LinkWithPrefetch(props) {
7
+ import { useIntersectionObserver } from "./useIntersectionObserver";
8
+ function useForwardedRef(ref) {
9
+ var innerRef = React.useRef(null);
10
+ React.useEffect(function () {
11
+ if (!ref) return;
12
+ if (typeof ref === 'function') {
13
+ ref(innerRef.current);
14
+ } else {
15
+ ref.current = innerRef.current;
16
+ }
17
+ });
18
+ return innerRef;
19
+ }
20
+ export var LinkWithPrefetch = /*#__PURE__*/React.forwardRef(function (props, forwardedRef) {
8
21
  var _props$to;
9
- var prefetch = props.prefetch,
22
+ var prefetchProp = props.prefetch,
10
23
  linkProps = _objectWithoutProperties(props, _excluded);
24
+ var _ref = typeof window !== 'undefined' &&
25
+ // @ts-ignore
26
+ window.__umi_route_prefetch__ || {
27
+ defaultPrefetch: 'none',
28
+ defaultPrefetchTimeout: 50
29
+ },
30
+ defaultPrefetch = _ref.defaultPrefetch,
31
+ defaultPrefetchTimeout = _ref.defaultPrefetchTimeout;
32
+ var prefetch = (prefetchProp === true ? 'intent' : prefetchProp === false ? 'none' : prefetchProp) || defaultPrefetch;
33
+ if (!['intent', 'render', 'viewport', 'none'].includes(prefetch)) {
34
+ throw new Error("Invalid prefetch value ".concat(prefetch, " found in Link component"));
35
+ }
11
36
  var appData = useAppData();
12
37
  var to = typeof props.to === 'string' ? props.to : (_props$to = props.to) === null || _props$to === void 0 ? void 0 : _props$to.pathname;
38
+ var hasRenderFetched = React.useRef(false);
39
+ var ref = useForwardedRef(forwardedRef);
40
+ // prefetch intent
41
+ var handleMouseEnter = function handleMouseEnter(e) {
42
+ if (prefetch !== 'intent') return;
43
+ var eventTarget = e.target || {};
44
+ if (eventTarget.preloadTimeout) return;
45
+ eventTarget.preloadTimeout = setTimeout(function () {
46
+ var _appData$preloadRoute;
47
+ eventTarget.preloadTimeout = null;
48
+ (_appData$preloadRoute = appData.preloadRoute) === null || _appData$preloadRoute === void 0 || _appData$preloadRoute.call(appData, to);
49
+ }, props.prefetchTimeout || defaultPrefetchTimeout);
50
+ };
51
+ var handleMouseLeave = function handleMouseLeave(e) {
52
+ if (prefetch !== 'intent') return;
53
+ var eventTarget = e.target || {};
54
+ if (eventTarget.preloadTimeout) {
55
+ clearTimeout(eventTarget.preloadTimeout);
56
+ eventTarget.preloadTimeout = null;
57
+ }
58
+ };
59
+
60
+ // prefetch render
61
+ useLayoutEffect(function () {
62
+ if (prefetch === 'render' && !hasRenderFetched.current) {
63
+ var _appData$preloadRoute2;
64
+ (_appData$preloadRoute2 = appData.preloadRoute) === null || _appData$preloadRoute2 === void 0 || _appData$preloadRoute2.call(appData, to);
65
+ hasRenderFetched.current = true;
66
+ }
67
+ }, [prefetch, to]);
68
+
69
+ // prefetch viewport
70
+ useIntersectionObserver(ref, function (entry) {
71
+ if (entry !== null && entry !== void 0 && entry.isIntersecting) {
72
+ var _appData$preloadRoute3;
73
+ (_appData$preloadRoute3 = appData.preloadRoute) === null || _appData$preloadRoute3 === void 0 || _appData$preloadRoute3.call(appData, to);
74
+ }
75
+ }, {
76
+ rootMargin: '100px'
77
+ }, {
78
+ disabled: prefetch !== 'viewport'
79
+ });
80
+
13
81
  // compatible with old code
14
82
  // which to might be undefined
15
83
  if (!to) return null;
16
84
  return /*#__PURE__*/React.createElement(Link, _extends({
17
- onMouseEnter: function onMouseEnter() {
18
- var _appData$preloadRoute;
19
- return prefetch && to && ((_appData$preloadRoute = appData.preloadRoute) === null || _appData$preloadRoute === void 0 ? void 0 : _appData$preloadRoute.call(appData, to));
20
- }
85
+ onMouseEnter: handleMouseEnter,
86
+ onMouseLeave: handleMouseLeave,
87
+ ref: ref
21
88
  }, linkProps), props.children);
22
- }
89
+ });
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ export declare function useIntersectionObserver<T extends Element>(ref: React.RefObject<T>, callback: (entry: IntersectionObserverEntry | undefined) => void, intersectionObserverOptions?: IntersectionObserverInit, options?: {
3
+ disabled?: boolean;
4
+ }): IntersectionObserver | null;
@@ -0,0 +1,26 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import React from 'react';
3
+ export function useIntersectionObserver(ref, callback) {
4
+ var intersectionObserverOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
5
+ var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
6
+ // check if IntersectionObserver is available
7
+ if (typeof IntersectionObserver !== 'function') return null;
8
+ var isIntersectionObserverAvailable = React.useRef(typeof IntersectionObserver === 'function');
9
+ var observerRef = React.useRef(null);
10
+ React.useEffect(function () {
11
+ if (!ref.current || !isIntersectionObserverAvailable.current || options.disabled) {
12
+ return;
13
+ }
14
+ observerRef.current = new IntersectionObserver(function (_ref) {
15
+ var _ref2 = _slicedToArray(_ref, 1),
16
+ entry = _ref2[0];
17
+ callback(entry);
18
+ }, intersectionObserverOptions);
19
+ observerRef.current.observe(ref.current);
20
+ return function () {
21
+ var _observerRef$current;
22
+ (_observerRef$current = observerRef.current) === null || _observerRef$current === void 0 || _observerRef$current.disconnect();
23
+ };
24
+ }, [callback, intersectionObserverOptions, options.disabled, ref]);
25
+ return observerRef.current;
26
+ }
@@ -14,4 +14,4 @@ export interface RouteComponentProps<T = ReturnType<typeof useParams>> {
14
14
  params?: T;
15
15
  navigate?: ReturnType<typeof useNavigate>;
16
16
  }
17
- export declare function withRouter<P extends RouteComponentProps<P>>(Component: React.ComponentType<P>): (props: P) => React.JSX.Element;
17
+ export declare function withRouter<P extends RouteComponentProps<P>>(Component: React.ComponentType<P>): (props: P) => JSX.Element;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@umijs/renderer-react",
3
- "version": "4.3.36",
3
+ "version": "4.4.0",
4
4
  "description": "@umijs/renderer-react",
5
5
  "homepage": "https://github.com/umijs/umi/tree/master/packages/renderer-react#readme",
6
6
  "bugs": "https://github.com/umijs/umi/issues",