@fountain-ui/lab 2.0.0-beta.10 → 2.0.0-beta.11

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.
Files changed (33) hide show
  1. package/build/commonjs/ViewPager/ChildrenMemoizedPage.js +90 -22
  2. package/build/commonjs/ViewPager/ChildrenMemoizedPage.js.map +1 -1
  3. package/build/commonjs/ViewPager/ViewPagerNative.js +41 -34
  4. package/build/commonjs/ViewPager/ViewPagerNative.js.map +1 -1
  5. package/build/commonjs/ViewPager/ViewPagerProps.js.map +1 -1
  6. package/build/commonjs/ViewPager/ViewPagerWeb.js +32 -25
  7. package/build/commonjs/ViewPager/ViewPagerWeb.js.map +1 -1
  8. package/build/commonjs/ViewPager/index.js.map +1 -1
  9. package/build/commonjs/ViewPager/utils.js +3 -41
  10. package/build/commonjs/ViewPager/utils.js.map +1 -1
  11. package/build/module/ViewPager/ChildrenMemoizedPage.js +85 -23
  12. package/build/module/ViewPager/ChildrenMemoizedPage.js.map +1 -1
  13. package/build/module/ViewPager/ViewPagerNative.js +40 -34
  14. package/build/module/ViewPager/ViewPagerNative.js.map +1 -1
  15. package/build/module/ViewPager/ViewPagerProps.js.map +1 -1
  16. package/build/module/ViewPager/ViewPagerWeb.js +26 -23
  17. package/build/module/ViewPager/ViewPagerWeb.js.map +1 -1
  18. package/build/module/ViewPager/index.js.map +1 -1
  19. package/build/module/ViewPager/utils.js +1 -32
  20. package/build/module/ViewPager/utils.js.map +1 -1
  21. package/build/typescript/ViewPager/ChildrenMemoizedPage.d.ts +2 -1
  22. package/build/typescript/ViewPager/ViewPagerNative.d.ts +4 -1
  23. package/build/typescript/ViewPager/ViewPagerProps.d.ts +20 -19
  24. package/build/typescript/ViewPager/ViewPagerWeb.d.ts +4 -1
  25. package/build/typescript/ViewPager/index.d.ts +1 -1
  26. package/build/typescript/ViewPager/utils.d.ts +2 -19
  27. package/package.json +2 -2
  28. package/src/ViewPager/ChildrenMemoizedPage.tsx +91 -22
  29. package/src/ViewPager/ViewPagerNative.tsx +43 -38
  30. package/src/ViewPager/ViewPagerProps.ts +20 -19
  31. package/src/ViewPager/ViewPagerWeb.tsx +34 -29
  32. package/src/ViewPager/index.ts +1 -1
  33. package/src/ViewPager/utils.tsx +2 -55
@@ -5,44 +5,112 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
- var _react = _interopRequireDefault(require("react"));
8
+ var _react = _interopRequireWildcard(require("react"));
9
9
 
10
10
  var _reactNative = require("react-native");
11
11
 
12
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+ var _reactNativeReanimated = require("react-native-reanimated");
13
13
 
14
- function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
14
+ var _core = require("@fountain-ui/core");
15
15
 
16
- const Page = function Page(props) {
16
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
17
+
18
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
19
+
20
+ const OFFSCREEN_RERENDER_LIMIT = 1;
21
+
22
+ const styles = _core.StyleSheet.create({
23
+ none: {
24
+ display: 'none'
25
+ }
26
+ });
27
+
28
+ function Page(props) {
17
29
  const {
18
- isVisible,
19
- ...otherProps
30
+ index,
31
+ children,
32
+ loading,
33
+ sharedIndex
20
34
  } = props;
21
- return /*#__PURE__*/_react.default.createElement(_reactNative.View, _extends({
22
- collapsable: false
23
- }, otherProps));
24
- };
25
35
 
26
- var _default = /*#__PURE__*/_react.default.memo(Page, (prevProps, nextProps) => {
27
- if (prevProps.children === null && nextProps.children === null) {
28
- return true;
29
- } // isVisible is an important condition for determining memos on the web.
30
- // Reference ViewPagerWeb's return.
36
+ const assumeInitialPageState = () => {
37
+ const activeIndex = sharedIndex.value;
38
+ const active = index === activeIndex;
31
39
 
40
+ if (_reactNative.Platform.OS === 'web') {
41
+ return {
42
+ active,
43
+ visited: active
44
+ };
45
+ }
32
46
 
33
- if (prevProps.isVisible !== nextProps.isVisible) {
34
- return false;
35
- }
47
+ if (loading === 'eager') {
48
+ return {
49
+ active,
50
+ visited: true
51
+ };
52
+ }
36
53
 
37
- if (nextProps.isVisible || nextProps.isNeighbor) {
38
- return false;
39
- }
54
+ const visited = index >= activeIndex - OFFSCREEN_RERENDER_LIMIT && index <= activeIndex + OFFSCREEN_RERENDER_LIMIT;
55
+ return {
56
+ active,
57
+ visited
58
+ };
59
+ };
60
+
61
+ const [pageState, setPageState] = (0, _react.useState)(assumeInitialPageState);
62
+ const content = pageState.visited ? children : null;
63
+
64
+ const updatePageState = (active, neighbor) => {
65
+ setPageState(prevState => {
66
+ if (prevState.active !== active) {
67
+ return {
68
+ active,
69
+ visited: active || prevState.visited
70
+ };
71
+ }
72
+
73
+ if (neighbor && !prevState.visited) {
74
+ return { ...prevState,
75
+ visited: true
76
+ };
77
+ }
78
+
79
+ return prevState;
80
+ });
81
+ };
82
+
83
+ (0, _reactNativeReanimated.useAnimatedReaction)(() => {
84
+ const activeIndex = sharedIndex.value;
85
+ const willVisible = index >= activeIndex - OFFSCREEN_RERENDER_LIMIT && index <= activeIndex + OFFSCREEN_RERENDER_LIMIT;
86
+ const willActive = index === activeIndex;
87
+ const willNeighbor = _reactNative.Platform.OS === 'web' ? false : willVisible && !willActive;
88
+ return {
89
+ willActive,
90
+ willNeighbor
91
+ };
92
+ }, (nextState, prevState) => {
93
+ const activeStateChanged = nextState.willActive !== (prevState === null || prevState === void 0 ? void 0 : prevState.willActive);
94
+ const willNewNeighbor = nextState.willNeighbor && !(prevState !== null && prevState !== void 0 && prevState.willNeighbor);
95
+
96
+ if (activeStateChanged || willNewNeighbor) {
97
+ (0, _reactNativeReanimated.runOnJS)(updatePageState)(nextState.willActive, nextState.willNeighbor);
98
+ }
99
+ }, [index]);
100
+ const style = _reactNative.Platform.OS === 'web' ? pageState.active ? _core.StyleSheet.absoluteFill : styles.none : undefined;
101
+ return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
102
+ children: content,
103
+ collapsable: false,
104
+ style: style
105
+ });
106
+ }
40
107
 
108
+ var _default = /*#__PURE__*/(0, _react.memo)(Page, (prevProps, nextProps) => {
41
109
  if (prevProps.rerenderKey !== nextProps.rerenderKey) {
42
110
  return false;
43
111
  }
44
112
 
45
- return prevProps.children !== null && nextProps.children !== null;
113
+ return prevProps.index !== nextProps.index;
46
114
  });
47
115
 
48
116
  exports.default = _default;
@@ -1 +1 @@
1
- {"version":3,"names":["Page","props","isVisible","otherProps","React","memo","prevProps","nextProps","children","isNeighbor","rerenderKey"],"sources":["ChildrenMemoizedPage.tsx"],"sourcesContent":["import React from 'react';\nimport { View } from 'react-native';\nimport type { PageProps } from './ViewPagerProps';\n\nconst Page = function Page(props: PageProps) {\n const { isVisible, ...otherProps } = props;\n\n return (\n <View\n collapsable={false}\n {...otherProps}\n />\n );\n};\n\nexport default React.memo(Page, (prevProps, nextProps) => {\n if (prevProps.children === null && nextProps.children === null) {\n return true;\n }\n\n // isVisible is an important condition for determining memos on the web.\n // Reference ViewPagerWeb's return.\n if (prevProps.isVisible !== nextProps.isVisible) {\n return false;\n }\n\n if (nextProps.isVisible || nextProps.isNeighbor) {\n return false;\n }\n\n if (prevProps.rerenderKey !== nextProps.rerenderKey) {\n return false;\n }\n\n return prevProps.children !== null && nextProps.children !== null;\n});\n"],"mappings":";;;;;;;AAAA;;AACA;;;;;;AAGA,MAAMA,IAAI,GAAG,SAASA,IAAT,CAAcC,KAAd,EAAgC;EACzC,MAAM;IAAEC,SAAF;IAAa,GAAGC;EAAhB,IAA+BF,KAArC;EAEA,oBACI,6BAAC,iBAAD;IACI,WAAW,EAAE;EADjB,GAEQE,UAFR,EADJ;AAMH,CATD;;4BAWeC,cAAA,CAAMC,IAAN,CAAWL,IAAX,EAAiB,CAACM,SAAD,EAAYC,SAAZ,KAA0B;EACtD,IAAID,SAAS,CAACE,QAAV,KAAuB,IAAvB,IAA+BD,SAAS,CAACC,QAAV,KAAuB,IAA1D,EAAgE;IAC5D,OAAO,IAAP;EACH,CAHqD,CAKtD;EACA;;;EACA,IAAIF,SAAS,CAACJ,SAAV,KAAwBK,SAAS,CAACL,SAAtC,EAAiD;IAC7C,OAAO,KAAP;EACH;;EAED,IAAIK,SAAS,CAACL,SAAV,IAAuBK,SAAS,CAACE,UAArC,EAAiD;IAC7C,OAAO,KAAP;EACH;;EAED,IAAIH,SAAS,CAACI,WAAV,KAA0BH,SAAS,CAACG,WAAxC,EAAqD;IACjD,OAAO,KAAP;EACH;;EAED,OAAOJ,SAAS,CAACE,QAAV,KAAuB,IAAvB,IAA+BD,SAAS,CAACC,QAAV,KAAuB,IAA7D;AACH,CApBc,C"}
1
+ {"version":3,"names":["OFFSCREEN_RERENDER_LIMIT","styles","StyleSheet","create","none","display","Page","props","index","children","loading","sharedIndex","assumeInitialPageState","activeIndex","value","active","Platform","OS","visited","pageState","setPageState","useState","content","updatePageState","neighbor","prevState","useAnimatedReaction","willVisible","willActive","willNeighbor","nextState","activeStateChanged","willNewNeighbor","runOnJS","style","absoluteFill","undefined","memo","prevProps","nextProps","rerenderKey"],"sources":["ChildrenMemoizedPage.tsx"],"sourcesContent":["import React, { memo, useState } from 'react';\nimport { Platform, View } from 'react-native';\nimport { runOnJS, useAnimatedReaction } from 'react-native-reanimated';\nimport { StyleSheet } from '@fountain-ui/core';\nimport type { PageProps } from './ViewPagerProps';\n\nconst OFFSCREEN_RERENDER_LIMIT = 1;\n\nconst styles = StyleSheet.create({\n none: { display: 'none' },\n});\n\ninterface PageState {\n active: boolean;\n visited: boolean;\n}\n\nfunction Page(props: PageProps) {\n const {\n index,\n children,\n loading,\n sharedIndex,\n } = props;\n\n const assumeInitialPageState = (): PageState => {\n const activeIndex = sharedIndex.value;\n\n const active = index === activeIndex;\n\n if (Platform.OS === 'web') {\n return { active, visited: active };\n }\n\n if (loading === 'eager') {\n return { active, visited: true };\n }\n\n const visited = index >= activeIndex - OFFSCREEN_RERENDER_LIMIT\n && index <= activeIndex + OFFSCREEN_RERENDER_LIMIT;\n\n return { active, visited };\n };\n\n const [pageState, setPageState] = useState<PageState>(assumeInitialPageState);\n\n const content = pageState.visited ? children : null;\n\n const updatePageState = (active: boolean, neighbor: boolean) => {\n setPageState(prevState => {\n if (prevState.active !== active) {\n return { active, visited: active || prevState.visited };\n }\n\n if (neighbor && !prevState.visited) {\n return { ...prevState, visited: true };\n }\n\n return prevState;\n });\n };\n\n useAnimatedReaction(\n () => {\n const activeIndex = sharedIndex.value;\n\n const willVisible = index >= activeIndex - OFFSCREEN_RERENDER_LIMIT\n && index <= activeIndex + OFFSCREEN_RERENDER_LIMIT;\n\n const willActive = index === activeIndex;\n const willNeighbor = Platform.OS === 'web' ? false : (willVisible && !willActive);\n\n return { willActive, willNeighbor };\n },\n (nextState, prevState) => {\n const activeStateChanged = nextState.willActive !== prevState?.willActive;\n const willNewNeighbor = nextState.willNeighbor && !prevState?.willNeighbor;\n\n if (activeStateChanged || willNewNeighbor) {\n runOnJS(updatePageState)(nextState.willActive, nextState.willNeighbor);\n }\n },\n [index],\n );\n\n const style = Platform.OS === 'web'\n ? (pageState.active ? StyleSheet.absoluteFill : styles.none)\n : undefined;\n\n return (\n <View\n children={content}\n collapsable={false}\n style={style}\n />\n );\n}\n\nexport default memo(Page, (prevProps, nextProps) => {\n if (prevProps.rerenderKey !== nextProps.rerenderKey) {\n return false;\n }\n\n return prevProps.index !== nextProps.index;\n});\n"],"mappings":"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"}
@@ -3,12 +3,14 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = ViewPager;
6
+ exports.default = void 0;
7
7
 
8
8
  var _react = _interopRequireWildcard(require("react"));
9
9
 
10
10
  var _reactNativePagerView = _interopRequireDefault(require("react-native-pager-view"));
11
11
 
12
+ var _reactNativeReanimated = require("react-native-reanimated");
13
+
12
14
  var _utils = require("./utils");
13
15
 
14
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -17,59 +19,64 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
17
19
 
18
20
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
19
21
 
20
- function ViewPager(props) {
22
+ const ViewPager = /*#__PURE__*/(0, _react.forwardRef)(function ViewPager(props, ref) {
21
23
  const {
22
24
  children,
23
- enableVisibleHint = _utils.defaultEnableVisibleHint,
24
- index,
25
+ initialPage = _utils.defaultInitialPage,
25
26
  keyboardDismissMode = 'on-drag',
26
27
  loading = _utils.defaultLoading,
27
28
  onChange,
28
29
  pageComponent = _utils.defaultPageComponent,
29
- enableNeighborPageRerender = _utils.defaultEnableNeighborPageRerender,
30
30
  pageForceRerenderKey,
31
31
  scrollEnabled = true,
32
32
  style
33
33
  } = props;
34
- const indexRef = (0, _react.useRef)(index);
34
+ const sharedIndex = (0, _reactNativeReanimated.useSharedValue)(initialPage);
35
35
  const pagerRef = (0, _react.useRef)(null);
36
- const renderer = (0, _utils.usePageRenderer)({
37
- enableVisibleHint,
38
- index,
39
- loading,
40
- pageComponent,
41
- pageForceRerenderKey,
42
- enableNeighborPageRerender
43
- });
36
+
37
+ const setPage = newIndex => {
38
+ requestAnimationFrame(() => {
39
+ var _pagerRef$current;
40
+
41
+ (_pagerRef$current = pagerRef.current) === null || _pagerRef$current === void 0 ? void 0 : _pagerRef$current.setPage(newIndex);
42
+ });
43
+ };
44
+
45
+ (0, _react.useImperativeHandle)(ref, () => ({
46
+ setPage
47
+ }), []);
44
48
  const handlePageSelected = (0, _react.useCallback)(e => {
45
- indexRef.current = e.nativeEvent.position;
49
+ const currentIndex = sharedIndex.value;
50
+ const nextIndex = e.nativeEvent.position;
51
+
52
+ if (currentIndex === nextIndex) {
53
+ return;
54
+ }
55
+
56
+ sharedIndex.value = nextIndex;
46
57
 
47
58
  if (onChange) {
48
- onChange(indexRef.current);
59
+ onChange(nextIndex);
49
60
  }
50
61
  }, [onChange]);
51
- (0, _react.useEffect)(() => {
52
- const handleNumber = index !== indexRef.current ? requestAnimationFrame(() => {
53
- var _pagerRef$current;
54
-
55
- return (_pagerRef$current = pagerRef.current) === null || _pagerRef$current === void 0 ? void 0 : _pagerRef$current.setPage(index);
56
- }) : undefined;
57
- return () => {
58
- if (handleNumber) {
59
- cancelAnimationFrame(handleNumber);
60
- }
61
- };
62
- }, [index]);
62
+ const PageComponent = pageComponent;
63
63
  return /*#__PURE__*/_react.default.createElement(_reactNativePagerView.default, {
64
- initialPage: index,
64
+ ref: pagerRef,
65
+ initialPage: initialPage,
65
66
  keyboardDismissMode: keyboardDismissMode,
66
67
  onPageSelected: handlePageSelected,
67
68
  pageMargin: 8,
68
- ref: pagerRef,
69
69
  scrollEnabled: scrollEnabled,
70
70
  style: style
71
- }, renderer(children));
72
- }
73
-
74
- ;
71
+ }, _react.Children.map(children, (child, index) => /*#__PURE__*/_react.default.createElement(PageComponent, {
72
+ key: index,
73
+ children: child,
74
+ index: index,
75
+ loading: loading,
76
+ rerenderKey: pageForceRerenderKey,
77
+ sharedIndex: sharedIndex
78
+ })));
79
+ });
80
+ var _default = ViewPager;
81
+ exports.default = _default;
75
82
  //# sourceMappingURL=ViewPagerNative.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["ViewPager","props","children","enableVisibleHint","defaultEnableVisibleHint","index","keyboardDismissMode","loading","defaultLoading","onChange","pageComponent","defaultPageComponent","enableNeighborPageRerender","defaultEnableNeighborPageRerender","pageForceRerenderKey","scrollEnabled","style","indexRef","useRef","pagerRef","renderer","usePageRenderer","handlePageSelected","useCallback","e","current","nativeEvent","position","useEffect","handleNumber","requestAnimationFrame","setPage","undefined","cancelAnimationFrame"],"sources":["ViewPagerNative.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef } from 'react';\nimport type { ViewPagerOnPageSelectedEvent } from 'react-native-pager-view';\nimport RNViewPager from 'react-native-pager-view';\nimport type ViewPagerProps from './ViewPagerProps';\nimport {\n defaultEnableNeighborPageRerender,\n defaultEnableVisibleHint,\n defaultLoading,\n defaultPageComponent,\n usePageRenderer,\n} from './utils';\n\nexport default function ViewPager(props: ViewPagerProps) {\n const {\n children,\n enableVisibleHint = defaultEnableVisibleHint,\n index,\n keyboardDismissMode = 'on-drag',\n loading = defaultLoading,\n onChange,\n pageComponent = defaultPageComponent,\n enableNeighborPageRerender = defaultEnableNeighborPageRerender,\n pageForceRerenderKey,\n scrollEnabled = true,\n style,\n } = props;\n\n const indexRef = useRef<number>(index);\n const pagerRef = useRef<RNViewPager | null>(null);\n\n const renderer = usePageRenderer({\n enableVisibleHint,\n index,\n loading,\n pageComponent,\n pageForceRerenderKey,\n enableNeighborPageRerender,\n });\n\n const handlePageSelected = useCallback((e: ViewPagerOnPageSelectedEvent) => {\n indexRef.current = e.nativeEvent.position;\n\n if (onChange) {\n onChange(indexRef.current);\n }\n }, [onChange]);\n\n useEffect(() => {\n const handleNumber = index !== indexRef.current\n ? requestAnimationFrame(() => pagerRef.current?.setPage(index))\n : undefined;\n\n return () => {\n if (handleNumber) {\n cancelAnimationFrame(handleNumber);\n }\n };\n }, [index]);\n\n return (\n <RNViewPager\n initialPage={index}\n keyboardDismissMode={keyboardDismissMode}\n onPageSelected={handlePageSelected}\n pageMargin={8}\n ref={pagerRef}\n scrollEnabled={scrollEnabled}\n style={style}\n >\n {renderer(children)}\n </RNViewPager>\n );\n};\n"],"mappings":";;;;;;;AAAA;;AAEA;;AAEA;;;;;;;;AAQe,SAASA,SAAT,CAAmBC,KAAnB,EAA0C;EACrD,MAAM;IACFC,QADE;IAEFC,iBAAiB,GAAGC,+BAFlB;IAGFC,KAHE;IAIFC,mBAAmB,GAAG,SAJpB;IAKFC,OAAO,GAAGC,qBALR;IAMFC,QANE;IAOFC,aAAa,GAAGC,2BAPd;IAQFC,0BAA0B,GAAGC,wCAR3B;IASFC,oBATE;IAUFC,aAAa,GAAG,IAVd;IAWFC;EAXE,IAYFf,KAZJ;EAcA,MAAMgB,QAAQ,GAAG,IAAAC,aAAA,EAAeb,KAAf,CAAjB;EACA,MAAMc,QAAQ,GAAG,IAAAD,aAAA,EAA2B,IAA3B,CAAjB;EAEA,MAAME,QAAQ,GAAG,IAAAC,sBAAA,EAAgB;IAC7BlB,iBAD6B;IAE7BE,KAF6B;IAG7BE,OAH6B;IAI7BG,aAJ6B;IAK7BI,oBAL6B;IAM7BF;EAN6B,CAAhB,CAAjB;EASA,MAAMU,kBAAkB,GAAG,IAAAC,kBAAA,EAAaC,CAAD,IAAqC;IACxEP,QAAQ,CAACQ,OAAT,GAAmBD,CAAC,CAACE,WAAF,CAAcC,QAAjC;;IAEA,IAAIlB,QAAJ,EAAc;MACVA,QAAQ,CAACQ,QAAQ,CAACQ,OAAV,CAAR;IACH;EACJ,CAN0B,EAMxB,CAAChB,QAAD,CANwB,CAA3B;EAQA,IAAAmB,gBAAA,EAAU,MAAM;IACZ,MAAMC,YAAY,GAAGxB,KAAK,KAAKY,QAAQ,CAACQ,OAAnB,GACfK,qBAAqB,CAAC;MAAA;;MAAA,4BAAMX,QAAQ,CAACM,OAAf,sDAAM,kBAAkBM,OAAlB,CAA0B1B,KAA1B,CAAN;IAAA,CAAD,CADN,GAEf2B,SAFN;IAIA,OAAO,MAAM;MACT,IAAIH,YAAJ,EAAkB;QACdI,oBAAoB,CAACJ,YAAD,CAApB;MACH;IACJ,CAJD;EAKH,CAVD,EAUG,CAACxB,KAAD,CAVH;EAYA,oBACI,6BAAC,6BAAD;IACI,WAAW,EAAEA,KADjB;IAEI,mBAAmB,EAAEC,mBAFzB;IAGI,cAAc,EAAEgB,kBAHpB;IAII,UAAU,EAAE,CAJhB;IAKI,GAAG,EAAEH,QALT;IAMI,aAAa,EAAEJ,aANnB;IAOI,KAAK,EAAEC;EAPX,GASKI,QAAQ,CAAClB,QAAD,CATb,CADJ;AAaH;;AAAA"}
1
+ {"version":3,"names":["ViewPager","forwardRef","props","ref","children","initialPage","defaultInitialPage","keyboardDismissMode","loading","defaultLoading","onChange","pageComponent","defaultPageComponent","pageForceRerenderKey","scrollEnabled","style","sharedIndex","useSharedValue","pagerRef","useRef","setPage","newIndex","requestAnimationFrame","current","useImperativeHandle","handlePageSelected","useCallback","e","currentIndex","value","nextIndex","nativeEvent","position","PageComponent","Children","map","child","index"],"sources":["ViewPagerNative.tsx"],"sourcesContent":["import React, { Children, forwardRef, useCallback, useImperativeHandle, useRef } from 'react';\nimport type { ViewPagerOnPageSelectedEvent } from 'react-native-pager-view';\nimport RNViewPager from 'react-native-pager-view';\nimport { useSharedValue } from 'react-native-reanimated';\nimport type ViewPagerProps from './ViewPagerProps';\nimport type { ViewPagerInstance } from './ViewPagerProps';\nimport { defaultInitialPage, defaultLoading, defaultPageComponent } from './utils';\n\nconst ViewPager = forwardRef<ViewPagerInstance, ViewPagerProps>(function ViewPager(props, ref) {\n const {\n children,\n initialPage = defaultInitialPage,\n keyboardDismissMode = 'on-drag',\n loading = defaultLoading,\n onChange,\n pageComponent = defaultPageComponent,\n pageForceRerenderKey,\n scrollEnabled = true,\n style,\n } = props;\n\n const sharedIndex = useSharedValue<number>(initialPage);\n const pagerRef = useRef<RNViewPager | null>(null);\n\n const setPage = (newIndex: number) => {\n requestAnimationFrame(() => {\n pagerRef.current?.setPage(newIndex);\n });\n };\n\n useImperativeHandle(\n ref,\n () => ({ setPage }),\n [],\n );\n\n const handlePageSelected = useCallback((e: ViewPagerOnPageSelectedEvent) => {\n const currentIndex = sharedIndex.value;\n const nextIndex = e.nativeEvent.position;\n\n if (currentIndex === nextIndex) {\n return;\n }\n\n sharedIndex.value = nextIndex;\n\n if (onChange) {\n onChange(nextIndex);\n }\n }, [onChange]);\n\n const PageComponent = pageComponent;\n\n return (\n <RNViewPager\n ref={pagerRef}\n initialPage={initialPage}\n keyboardDismissMode={keyboardDismissMode}\n onPageSelected={handlePageSelected}\n pageMargin={8}\n scrollEnabled={scrollEnabled}\n style={style}\n >\n {Children.map(children, (child, index) => (\n <PageComponent\n key={index}\n children={child}\n index={index}\n loading={loading}\n rerenderKey={pageForceRerenderKey}\n sharedIndex={sharedIndex}\n />\n ))}\n </RNViewPager>\n );\n});\n\nexport default ViewPager;\n"],"mappings":";;;;;;;AAAA;;AAEA;;AACA;;AAGA;;;;;;;;AAEA,MAAMA,SAAS,gBAAG,IAAAC,iBAAA,EAA8C,SAASD,SAAT,CAAmBE,KAAnB,EAA0BC,GAA1B,EAA+B;EAC3F,MAAM;IACFC,QADE;IAEFC,WAAW,GAAGC,yBAFZ;IAGFC,mBAAmB,GAAG,SAHpB;IAIFC,OAAO,GAAGC,qBAJR;IAKFC,QALE;IAMFC,aAAa,GAAGC,2BANd;IAOFC,oBAPE;IAQFC,aAAa,GAAG,IARd;IASFC;EATE,IAUFb,KAVJ;EAYA,MAAMc,WAAW,GAAG,IAAAC,qCAAA,EAAuBZ,WAAvB,CAApB;EACA,MAAMa,QAAQ,GAAG,IAAAC,aAAA,EAA2B,IAA3B,CAAjB;;EAEA,MAAMC,OAAO,GAAIC,QAAD,IAAsB;IAClCC,qBAAqB,CAAC,MAAM;MAAA;;MACxB,qBAAAJ,QAAQ,CAACK,OAAT,wEAAkBH,OAAlB,CAA0BC,QAA1B;IACH,CAFoB,CAArB;EAGH,CAJD;;EAMA,IAAAG,0BAAA,EACIrB,GADJ,EAEI,OAAO;IAAEiB;EAAF,CAAP,CAFJ,EAGI,EAHJ;EAMA,MAAMK,kBAAkB,GAAG,IAAAC,kBAAA,EAAaC,CAAD,IAAqC;IACxE,MAAMC,YAAY,GAAGZ,WAAW,CAACa,KAAjC;IACA,MAAMC,SAAS,GAAGH,CAAC,CAACI,WAAF,CAAcC,QAAhC;;IAEA,IAAIJ,YAAY,KAAKE,SAArB,EAAgC;MAC5B;IACH;;IAEDd,WAAW,CAACa,KAAZ,GAAoBC,SAApB;;IAEA,IAAIpB,QAAJ,EAAc;MACVA,QAAQ,CAACoB,SAAD,CAAR;IACH;EACJ,CAb0B,EAaxB,CAACpB,QAAD,CAbwB,CAA3B;EAeA,MAAMuB,aAAa,GAAGtB,aAAtB;EAEA,oBACI,6BAAC,6BAAD;IACI,GAAG,EAAEO,QADT;IAEI,WAAW,EAAEb,WAFjB;IAGI,mBAAmB,EAAEE,mBAHzB;IAII,cAAc,EAAEkB,kBAJpB;IAKI,UAAU,EAAE,CALhB;IAMI,aAAa,EAAEX,aANnB;IAOI,KAAK,EAAEC;EAPX,GASKmB,eAAA,CAASC,GAAT,CAAa/B,QAAb,EAAuB,CAACgC,KAAD,EAAQC,KAAR,kBACpB,6BAAC,aAAD;IACI,GAAG,EAAEA,KADT;IAEI,QAAQ,EAAED,KAFd;IAGI,KAAK,EAAEC,KAHX;IAII,OAAO,EAAE7B,OAJb;IAKI,WAAW,EAAEK,oBALjB;IAMI,WAAW,EAAEG;EANjB,EADH,CATL,CADJ;AAsBH,CAnEiB,CAAlB;eAqEehB,S"}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["ViewPagerProps.ts"],"sourcesContent":["import React from 'react';\nimport type { ViewProps } from 'react-native';\nimport type { ComponentProps } from '@fountain-ui/core';\n\nexport type KeyboardDismissMode = 'none' | 'on-drag';\n\nexport type PageProps = React.PropsWithChildren<ViewProps> & {\n isNeighbor: boolean;\n isVisible: boolean;\n rerenderKey?: any;\n};\n\nexport type PageComponent = React.ComponentType<PageProps>;\n\nexport type Loading = 'lazy' | 'eager';\n\nexport default interface ViewPagerProps extends ComponentProps<{\n /**\n * Collection of ViewPager components.\n */\n children?: React.ReactNode;\n\n /**\n * If `true`, enable page visible hint.\n * @default false\n */\n enableVisibleHint?: boolean;\n\n /**\n * If `true`, Based on the current index, the pages on the left and right are also rerender.\n * @default false\n */\n enableNeighborPageRerender?: boolean;\n\n /**\n * A number representing the index of the active page.\n */\n index: number,\n\n /**\n * Whether to load the page immediately (`eager`) or on an as-needed basis (`lazy`).\n * @default 'lazy'\n */\n loading?: Loading;\n\n /**\n * Callback fired when an index is changed.\n */\n onChange?: (newIndex: number) => void,\n\n /**\n * The component used to render the wrapper of the page.\n * @default 'ChildrenMemoizedPage'\n */\n pageComponent?: PageComponent,\n\n /**\n * When this value is changed, page will be rerender.\n */\n pageForceRerenderKey?: any;\n\n /**\n * Mobile only. Should pager view scroll, when scroll enabled.\n * @default true\n */\n scrollEnabled?: boolean;\n\n /**\n * Mobile only. Determines whether the keyboard gets dismissed in response to a drag.\n * @default 'on-drag'\n */\n keyboardDismissMode?: KeyboardDismissMode;\n}> {}\n"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["ViewPagerProps.ts"],"sourcesContent":["import type { ComponentType, PropsWithChildren, ReactNode, Ref } from 'react';\nimport type { ViewProps } from 'react-native';\nimport type { SharedValue } from 'react-native-reanimated';\nimport type { ComponentProps } from '@fountain-ui/core';\n\nexport type KeyboardDismissMode = 'none' | 'on-drag';\n\nexport type PageProps = PropsWithChildren<ViewProps> & {\n index: number;\n loading: ViewPagerProps['loading'];\n sharedIndex: SharedValue<number>;\n rerenderKey?: ViewPagerProps['pageForceRerenderKey'];\n};\n\nexport type PageComponent = ComponentType<PageProps>;\n\nexport type Loading = 'lazy' | 'eager';\n\nexport interface ViewPagerInstance {\n /**\n * Function to scroll to a specific page in the ViewPager. Invalid index is ignored.\n * @param index\n */\n setPage: (index: number) => void;\n}\n\nexport default interface ViewPagerProps extends ComponentProps<{\n ref?: Ref<ViewPagerInstance>;\n\n /**\n * Collection of ViewPager components.\n */\n children?: ReactNode;\n\n /**\n * Index of initial page that should be selected.\n * @default 0\n */\n initialPage?: number;\n\n /**\n * Whether to load the page immediately (`eager`) or on an as-needed basis (`lazy`).\n * @default 'lazy'\n */\n loading?: Loading;\n\n /**\n * Callback fired when an index is changed.\n */\n onChange?: (newIndex: number) => void,\n\n /**\n * The component used to render the wrapper of the page.\n * @default 'ChildrenMemoizedPage'\n */\n pageComponent?: PageComponent,\n\n /**\n * When this value is changed, page will be rerender.\n */\n pageForceRerenderKey?: any;\n\n /**\n * Mobile only. Should pager view scroll, when scroll enabled.\n * @default true\n */\n scrollEnabled?: boolean;\n\n /**\n * Mobile only. Determines whether the keyboard gets dismissed in response to a drag.\n * @default 'on-drag'\n */\n keyboardDismissMode?: KeyboardDismissMode;\n}> {}\n"],"mappings":""}
@@ -3,53 +3,60 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = ViewPager;
6
+ exports.default = void 0;
7
7
 
8
- var _react = _interopRequireDefault(require("react"));
8
+ var _react = _interopRequireWildcard(require("react"));
9
9
 
10
10
  var _reactNative = require("react-native");
11
11
 
12
+ var _reactNativeReanimated = require("react-native-reanimated");
13
+
14
+ var _core = require("@fountain-ui/core");
15
+
12
16
  var _utils = require("./utils");
13
17
 
14
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
15
19
 
16
- const styles = _reactNative.StyleSheet.create({
20
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
21
+
22
+ const styles = _core.StyleSheet.create({
17
23
  root: {
18
24
  // @ts-ignore
19
25
  overflow: 'auto',
20
26
  position: 'relative'
21
- },
22
- none: {
23
- display: 'none'
24
27
  }
25
28
  });
26
29
 
27
- function ViewPager(props) {
30
+ const ViewPager = /*#__PURE__*/(0, _react.forwardRef)(function ViewPager(props, ref) {
28
31
  const {
29
32
  children,
30
- enableVisibleHint = _utils.defaultEnableVisibleHint,
31
- enableNeighborPageRerender = _utils.defaultEnableNeighborPageRerender,
32
- index,
33
+ initialPage = _utils.defaultInitialPage,
33
34
  loading = _utils.defaultLoading,
34
35
  pageComponent = _utils.defaultPageComponent,
35
36
  pageForceRerenderKey,
36
37
  style
37
38
  } = props;
38
- const renderer = (0, _utils.usePageRenderer)({
39
- enableVisibleHint,
40
- enableNeighborPageRerender,
41
- index,
42
- loading,
43
- pageComponent,
44
- pageForceRerenderKey
45
- });
39
+ const sharedIndex = (0, _reactNativeReanimated.useSharedValue)(initialPage);
40
+
41
+ const setPage = newIndex => {
42
+ sharedIndex.value = newIndex;
43
+ };
44
+
45
+ (0, _react.useImperativeHandle)(ref, () => ({
46
+ setPage
47
+ }), []);
48
+ const PageComponent = pageComponent;
46
49
  return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
47
50
  style: [styles.root, style]
48
- }, _react.default.Children.map(renderer(children), (child, i) => /*#__PURE__*/_react.default.cloneElement(child, {
49
- isVisible: i === index,
50
- style: i !== index ? styles.none : _reactNative.StyleSheet.absoluteFill
51
+ }, _react.Children.map(children, (child, index) => /*#__PURE__*/_react.default.createElement(PageComponent, {
52
+ key: index,
53
+ children: child,
54
+ index: index,
55
+ loading: loading,
56
+ rerenderKey: pageForceRerenderKey,
57
+ sharedIndex: sharedIndex
51
58
  })));
52
- }
53
-
54
- ;
59
+ });
60
+ var _default = ViewPager;
61
+ exports.default = _default;
55
62
  //# sourceMappingURL=ViewPagerWeb.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["styles","StyleSheet","create","root","overflow","position","none","display","ViewPager","props","children","enableVisibleHint","defaultEnableVisibleHint","enableNeighborPageRerender","defaultEnableNeighborPageRerender","index","loading","defaultLoading","pageComponent","defaultPageComponent","pageForceRerenderKey","style","renderer","usePageRenderer","React","Children","map","child","i","cloneElement","isVisible","absoluteFill"],"sources":["ViewPagerWeb.tsx"],"sourcesContent":["import React from 'react';\nimport { StyleSheet, View } from 'react-native';\nimport type ViewPagerProps from './ViewPagerProps';\nimport {\n defaultEnableNeighborPageRerender,\n defaultEnableVisibleHint,\n defaultLoading,\n defaultPageComponent,\n usePageRenderer,\n} from './utils';\n\nconst styles = StyleSheet.create({\n root: {\n // @ts-ignore\n overflow: 'auto',\n position: 'relative',\n },\n none: { display: 'none' },\n});\n\nexport default function ViewPager(props: ViewPagerProps) {\n const {\n children,\n enableVisibleHint = defaultEnableVisibleHint,\n enableNeighborPageRerender = defaultEnableNeighborPageRerender,\n index,\n loading = defaultLoading,\n pageComponent = defaultPageComponent,\n pageForceRerenderKey,\n style,\n } = props;\n\n const renderer = usePageRenderer({\n enableVisibleHint,\n enableNeighborPageRerender,\n index,\n loading,\n pageComponent,\n pageForceRerenderKey,\n });\n\n return (\n <View style={[styles.root, style]}>\n {React.Children.map(renderer(children), (child, i) =>\n React.cloneElement(child as React.ReactElement, {\n isVisible: i === index,\n style: i !== index ? styles.none : StyleSheet.absoluteFill,\n }),\n )}\n </View>\n );\n};\n"],"mappings":";;;;;;;AAAA;;AACA;;AAEA;;;;AAQA,MAAMA,MAAM,GAAGC,uBAAA,CAAWC,MAAX,CAAkB;EAC7BC,IAAI,EAAE;IACF;IACAC,QAAQ,EAAE,MAFR;IAGFC,QAAQ,EAAE;EAHR,CADuB;EAM7BC,IAAI,EAAE;IAAEC,OAAO,EAAE;EAAX;AANuB,CAAlB,CAAf;;AASe,SAASC,SAAT,CAAmBC,KAAnB,EAA0C;EACrD,MAAM;IACFC,QADE;IAEFC,iBAAiB,GAAGC,+BAFlB;IAGFC,0BAA0B,GAAGC,wCAH3B;IAIFC,KAJE;IAKFC,OAAO,GAAGC,qBALR;IAMFC,aAAa,GAAGC,2BANd;IAOFC,oBAPE;IAQFC;EARE,IASFZ,KATJ;EAWA,MAAMa,QAAQ,GAAG,IAAAC,sBAAA,EAAgB;IAC7BZ,iBAD6B;IAE7BE,0BAF6B;IAG7BE,KAH6B;IAI7BC,OAJ6B;IAK7BE,aAL6B;IAM7BE;EAN6B,CAAhB,CAAjB;EASA,oBACI,6BAAC,iBAAD;IAAM,KAAK,EAAE,CAACpB,MAAM,CAACG,IAAR,EAAckB,KAAd;EAAb,GACKG,cAAA,CAAMC,QAAN,CAAeC,GAAf,CAAmBJ,QAAQ,CAACZ,QAAD,CAA3B,EAAuC,CAACiB,KAAD,EAAQC,CAAR,kBACpCJ,cAAA,CAAMK,YAAN,CAAmBF,KAAnB,EAAgD;IAC5CG,SAAS,EAAEF,CAAC,KAAKb,KAD2B;IAE5CM,KAAK,EAAEO,CAAC,KAAKb,KAAN,GAAcf,MAAM,CAACM,IAArB,GAA4BL,uBAAA,CAAW8B;EAFF,CAAhD,CADH,CADL,CADJ;AAUH;;AAAA"}
1
+ {"version":3,"names":["styles","StyleSheet","create","root","overflow","position","ViewPager","forwardRef","props","ref","children","initialPage","defaultInitialPage","loading","defaultLoading","pageComponent","defaultPageComponent","pageForceRerenderKey","style","sharedIndex","useSharedValue","setPage","newIndex","value","useImperativeHandle","PageComponent","Children","map","child","index"],"sources":["ViewPagerWeb.tsx"],"sourcesContent":["import React, { Children, forwardRef, useImperativeHandle } from 'react';\nimport { View } from 'react-native';\nimport { useSharedValue } from 'react-native-reanimated';\nimport { StyleSheet } from '@fountain-ui/core';\nimport type ViewPagerProps from './ViewPagerProps';\nimport type { ViewPagerInstance } from './ViewPagerProps';\nimport { defaultInitialPage, defaultLoading, defaultPageComponent } from './utils';\n\nconst styles = StyleSheet.create({\n root: {\n // @ts-ignore\n overflow: 'auto',\n position: 'relative',\n },\n});\n\nconst ViewPager = forwardRef<ViewPagerInstance, ViewPagerProps>(function ViewPager(props, ref) {\n const {\n children,\n initialPage = defaultInitialPage,\n loading = defaultLoading,\n pageComponent = defaultPageComponent,\n pageForceRerenderKey,\n style,\n } = props;\n\n const sharedIndex = useSharedValue<number>(initialPage);\n\n const setPage = (newIndex: number) => {\n sharedIndex.value = newIndex;\n };\n\n useImperativeHandle(\n ref,\n () => ({ setPage }),\n [],\n );\n\n const PageComponent = pageComponent;\n\n return (\n <View style={[styles.root, style]}>\n {Children.map(children, (child, index) => (\n <PageComponent\n key={index}\n children={child}\n index={index}\n loading={loading}\n rerenderKey={pageForceRerenderKey}\n sharedIndex={sharedIndex}\n />\n ))}\n </View>\n );\n});\n\nexport default ViewPager;\n"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AACA;;AAGA;;;;;;AAEA,MAAMA,MAAM,GAAGC,gBAAA,CAAWC,MAAX,CAAkB;EAC7BC,IAAI,EAAE;IACF;IACAC,QAAQ,EAAE,MAFR;IAGFC,QAAQ,EAAE;EAHR;AADuB,CAAlB,CAAf;;AAQA,MAAMC,SAAS,gBAAG,IAAAC,iBAAA,EAA8C,SAASD,SAAT,CAAmBE,KAAnB,EAA0BC,GAA1B,EAA+B;EAC3F,MAAM;IACFC,QADE;IAEFC,WAAW,GAAGC,yBAFZ;IAGFC,OAAO,GAAGC,qBAHR;IAIFC,aAAa,GAAGC,2BAJd;IAKFC,oBALE;IAMFC;EANE,IAOFV,KAPJ;EASA,MAAMW,WAAW,GAAG,IAAAC,qCAAA,EAAuBT,WAAvB,CAApB;;EAEA,MAAMU,OAAO,GAAIC,QAAD,IAAsB;IAClCH,WAAW,CAACI,KAAZ,GAAoBD,QAApB;EACH,CAFD;;EAIA,IAAAE,0BAAA,EACIf,GADJ,EAEI,OAAO;IAAEY;EAAF,CAAP,CAFJ,EAGI,EAHJ;EAMA,MAAMI,aAAa,GAAGV,aAAtB;EAEA,oBACI,6BAAC,iBAAD;IAAM,KAAK,EAAE,CAACf,MAAM,CAACG,IAAR,EAAce,KAAd;EAAb,GACKQ,eAAA,CAASC,GAAT,CAAajB,QAAb,EAAuB,CAACkB,KAAD,EAAQC,KAAR,kBACpB,6BAAC,aAAD;IACI,GAAG,EAAEA,KADT;IAEI,QAAQ,EAAED,KAFd;IAGI,KAAK,EAAEC,KAHX;IAII,OAAO,EAAEhB,OAJb;IAKI,WAAW,EAAEI,oBALjB;IAMI,WAAW,EAAEE;EANjB,EADH,CADL,CADJ;AAcH,CAtCiB,CAAlB;eAwCeb,S"}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export { default } from './ViewPagerWeb';\nexport type { default as ViewPagerProps } from './ViewPagerProps';"],"mappings":";;;;;;;;;;;;AAAA"}
1
+ {"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export { default } from './ViewPagerWeb';\nexport type { default as ViewPagerProps, ViewPagerInstance } from './ViewPagerProps';\n"],"mappings":";;;;;;;;;;;;AAAA"}
@@ -3,54 +3,16 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.usePageRenderer = exports.defaultPageComponent = exports.defaultLoading = exports.defaultEnableVisibleHint = exports.defaultEnableNeighborPageRerender = void 0;
7
-
8
- var _react = _interopRequireDefault(require("react"));
6
+ exports.defaultPageComponent = exports.defaultLoading = exports.defaultInitialPage = void 0;
9
7
 
10
8
  var _ChildrenMemoizedPage = _interopRequireDefault(require("./ChildrenMemoizedPage"));
11
9
 
12
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
11
 
14
- const defaultEnableVisibleHint = false;
15
- exports.defaultEnableVisibleHint = defaultEnableVisibleHint;
16
- const defaultEnableNeighborPageRerender = false;
17
- exports.defaultEnableNeighborPageRerender = defaultEnableNeighborPageRerender;
12
+ const defaultInitialPage = 0;
13
+ exports.defaultInitialPage = defaultInitialPage;
18
14
  const defaultLoading = 'lazy';
19
15
  exports.defaultLoading = defaultLoading;
20
16
  const defaultPageComponent = _ChildrenMemoizedPage.default;
21
17
  exports.defaultPageComponent = defaultPageComponent;
22
-
23
- const usePageRenderer = _ref => {
24
- let {
25
- enableVisibleHint,
26
- index: currentIndex,
27
- loading,
28
- pageComponent: PageComponent,
29
- pageForceRerenderKey,
30
- enableNeighborPageRerender
31
- } = _ref;
32
-
33
- const pagesStateRef = _react.default.useRef([]);
34
-
35
- pagesStateRef.current[currentIndex] = { ...pagesStateRef.current[currentIndex],
36
- visited: true
37
- };
38
- return children => _react.default.Children.map(children, (child, index) => {
39
- var _pagesStateRef$curren;
40
-
41
- const visited = ((_pagesStateRef$curren = pagesStateRef.current[index]) === null || _pagesStateRef$curren === void 0 ? void 0 : _pagesStateRef$curren.visited) ?? false;
42
- const content = loading === 'eager' || visited ? child : null;
43
- const isVisible = enableVisibleHint ? index === currentIndex : false;
44
- const isNeighborIndex = index === currentIndex - 1 || index === currentIndex + 1;
45
- return /*#__PURE__*/_react.default.createElement(PageComponent, {
46
- key: index,
47
- children: content,
48
- isNeighbor: enableNeighborPageRerender && isNeighborIndex,
49
- isVisible: isVisible,
50
- rerenderKey: pageForceRerenderKey
51
- });
52
- });
53
- };
54
-
55
- exports.usePageRenderer = usePageRenderer;
56
18
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["defaultEnableVisibleHint","defaultEnableNeighborPageRerender","defaultLoading","defaultPageComponent","ChildrenMemoizedPage","usePageRenderer","enableVisibleHint","index","currentIndex","loading","pageComponent","PageComponent","pageForceRerenderKey","enableNeighborPageRerender","pagesStateRef","React","useRef","current","visited","children","Children","map","child","content","isVisible","isNeighborIndex"],"sources":["utils.tsx"],"sourcesContent":["import React from 'react';\nimport ViewPagerProps, { Loading, PageComponent } from './ViewPagerProps';\nimport ChildrenMemoizedPage from './ChildrenMemoizedPage';\n\nexport interface PageState {\n visited?: boolean;\n}\n\nexport interface PageRenderOption {\n enableVisibleHint: boolean;\n enableNeighborPageRerender: boolean;\n index: number;\n loading: Loading;\n pageComponent: PageComponent;\n pageForceRerenderKey?: any;\n}\n\nexport interface PageRenderer {\n (children: ViewPagerProps['children']): React.ReactNode;\n}\n\nexport const defaultEnableVisibleHint: boolean = false;\n\nexport const defaultEnableNeighborPageRerender: boolean = false;\n\nexport const defaultLoading: Loading = 'lazy';\n\nexport const defaultPageComponent: PageComponent = ChildrenMemoizedPage;\n\nexport const usePageRenderer = ({\n enableVisibleHint,\n index: currentIndex,\n loading,\n pageComponent: PageComponent,\n pageForceRerenderKey,\n enableNeighborPageRerender,\n}: PageRenderOption): PageRenderer => {\n const pagesStateRef = React.useRef<Array<PageState>>([]);\n\n pagesStateRef.current[currentIndex] = {\n ...pagesStateRef.current[currentIndex],\n visited: true,\n };\n\n return (children => React.Children.map(children, (child, index) => {\n const visited = pagesStateRef.current[index]?.visited ?? false;\n const content = (loading === 'eager' || visited) ? child : null;\n\n const isVisible = enableVisibleHint ? (index === currentIndex) : false;\n const isNeighborIndex = index === currentIndex - 1 || index === currentIndex + 1;\n\n return (\n <PageComponent\n key={index}\n children={content}\n isNeighbor={enableNeighborPageRerender && isNeighborIndex}\n isVisible={isVisible}\n rerenderKey={pageForceRerenderKey}\n />\n );\n }));\n};\n"],"mappings":";;;;;;;AAAA;;AAEA;;;;AAmBO,MAAMA,wBAAiC,GAAG,KAA1C;;AAEA,MAAMC,iCAA0C,GAAG,KAAnD;;AAEA,MAAMC,cAAuB,GAAG,MAAhC;;AAEA,MAAMC,oBAAmC,GAAGC,6BAA5C;;;AAEA,MAAMC,eAAe,GAAG,QAOO;EAAA,IAPN;IAC5BC,iBAD4B;IAE5BC,KAAK,EAAEC,YAFqB;IAG5BC,OAH4B;IAI5BC,aAAa,EAAEC,aAJa;IAK5BC,oBAL4B;IAM5BC;EAN4B,CAOM;;EAClC,MAAMC,aAAa,GAAGC,cAAA,CAAMC,MAAN,CAA+B,EAA/B,CAAtB;;EAEAF,aAAa,CAACG,OAAd,CAAsBT,YAAtB,IAAsC,EAClC,GAAGM,aAAa,CAACG,OAAd,CAAsBT,YAAtB,CAD+B;IAElCU,OAAO,EAAE;EAFyB,CAAtC;EAKA,OAAQC,QAAQ,IAAIJ,cAAA,CAAMK,QAAN,CAAeC,GAAf,CAAmBF,QAAnB,EAA6B,CAACG,KAAD,EAAQf,KAAR,KAAkB;IAAA;;IAC/D,MAAMW,OAAO,GAAG,0BAAAJ,aAAa,CAACG,OAAd,CAAsBV,KAAtB,iFAA8BW,OAA9B,KAAyC,KAAzD;IACA,MAAMK,OAAO,GAAId,OAAO,KAAK,OAAZ,IAAuBS,OAAxB,GAAmCI,KAAnC,GAA2C,IAA3D;IAEA,MAAME,SAAS,GAAGlB,iBAAiB,GAAIC,KAAK,KAAKC,YAAd,GAA8B,KAAjE;IACA,MAAMiB,eAAe,GAAGlB,KAAK,KAAKC,YAAY,GAAG,CAAzB,IAA8BD,KAAK,KAAKC,YAAY,GAAG,CAA/E;IAEA,oBACI,6BAAC,aAAD;MACI,GAAG,EAAED,KADT;MAEI,QAAQ,EAAEgB,OAFd;MAGI,UAAU,EAAEV,0BAA0B,IAAIY,eAH9C;MAII,SAAS,EAAED,SAJf;MAKI,WAAW,EAAEZ;IALjB,EADJ;EASH,CAhBmB,CAApB;AAiBH,CAhCM"}
1
+ {"version":3,"names":["defaultInitialPage","defaultLoading","defaultPageComponent","ChildrenMemoizedPage"],"sources":["utils.tsx"],"sourcesContent":["import React from 'react';\nimport { Loading, PageComponent } from './ViewPagerProps';\nimport ChildrenMemoizedPage from './ChildrenMemoizedPage';\n\nexport const defaultInitialPage: number = 0;\n\nexport const defaultLoading: Loading = 'lazy';\n\nexport const defaultPageComponent: PageComponent = ChildrenMemoizedPage;\n"],"mappings":";;;;;;;AAEA;;;;AAEO,MAAMA,kBAA0B,GAAG,CAAnC;;AAEA,MAAMC,cAAuB,GAAG,MAAhC;;AAEA,MAAMC,oBAAmC,GAAGC,6BAA5C"}
@@ -1,37 +1,99 @@
1
- function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2
-
3
- import React from 'react';
4
- import { View } from 'react-native';
1
+ import React, { memo, useState } from 'react';
2
+ import { Platform, View } from 'react-native';
3
+ import { runOnJS, useAnimatedReaction } from 'react-native-reanimated';
4
+ import { StyleSheet } from '@fountain-ui/core';
5
+ const OFFSCREEN_RERENDER_LIMIT = 1;
6
+ const styles = StyleSheet.create({
7
+ none: {
8
+ display: 'none'
9
+ }
10
+ });
5
11
 
6
- const Page = function Page(props) {
12
+ function Page(props) {
7
13
  const {
8
- isVisible,
9
- ...otherProps
14
+ index,
15
+ children,
16
+ loading,
17
+ sharedIndex
10
18
  } = props;
11
- return /*#__PURE__*/React.createElement(View, _extends({
12
- collapsable: false
13
- }, otherProps));
14
- };
15
19
 
16
- export default /*#__PURE__*/React.memo(Page, (prevProps, nextProps) => {
17
- if (prevProps.children === null && nextProps.children === null) {
18
- return true;
19
- } // isVisible is an important condition for determining memos on the web.
20
- // Reference ViewPagerWeb's return.
20
+ const assumeInitialPageState = () => {
21
+ const activeIndex = sharedIndex.value;
22
+ const active = index === activeIndex;
21
23
 
24
+ if (Platform.OS === 'web') {
25
+ return {
26
+ active,
27
+ visited: active
28
+ };
29
+ }
22
30
 
23
- if (prevProps.isVisible !== nextProps.isVisible) {
24
- return false;
25
- }
31
+ if (loading === 'eager') {
32
+ return {
33
+ active,
34
+ visited: true
35
+ };
36
+ }
26
37
 
27
- if (nextProps.isVisible || nextProps.isNeighbor) {
28
- return false;
29
- }
38
+ const visited = index >= activeIndex - OFFSCREEN_RERENDER_LIMIT && index <= activeIndex + OFFSCREEN_RERENDER_LIMIT;
39
+ return {
40
+ active,
41
+ visited
42
+ };
43
+ };
44
+
45
+ const [pageState, setPageState] = useState(assumeInitialPageState);
46
+ const content = pageState.visited ? children : null;
47
+
48
+ const updatePageState = (active, neighbor) => {
49
+ setPageState(prevState => {
50
+ if (prevState.active !== active) {
51
+ return {
52
+ active,
53
+ visited: active || prevState.visited
54
+ };
55
+ }
56
+
57
+ if (neighbor && !prevState.visited) {
58
+ return { ...prevState,
59
+ visited: true
60
+ };
61
+ }
62
+
63
+ return prevState;
64
+ });
65
+ };
66
+
67
+ useAnimatedReaction(() => {
68
+ const activeIndex = sharedIndex.value;
69
+ const willVisible = index >= activeIndex - OFFSCREEN_RERENDER_LIMIT && index <= activeIndex + OFFSCREEN_RERENDER_LIMIT;
70
+ const willActive = index === activeIndex;
71
+ const willNeighbor = Platform.OS === 'web' ? false : willVisible && !willActive;
72
+ return {
73
+ willActive,
74
+ willNeighbor
75
+ };
76
+ }, (nextState, prevState) => {
77
+ const activeStateChanged = nextState.willActive !== (prevState === null || prevState === void 0 ? void 0 : prevState.willActive);
78
+ const willNewNeighbor = nextState.willNeighbor && !(prevState !== null && prevState !== void 0 && prevState.willNeighbor);
79
+
80
+ if (activeStateChanged || willNewNeighbor) {
81
+ runOnJS(updatePageState)(nextState.willActive, nextState.willNeighbor);
82
+ }
83
+ }, [index]);
84
+ const style = Platform.OS === 'web' ? pageState.active ? StyleSheet.absoluteFill : styles.none : undefined;
85
+ return /*#__PURE__*/React.createElement(View, {
86
+ children: content,
87
+ collapsable: false,
88
+ style: style
89
+ });
90
+ }
30
91
 
92
+ export default /*#__PURE__*/memo(Page, (prevProps, nextProps) => {
31
93
  if (prevProps.rerenderKey !== nextProps.rerenderKey) {
32
94
  return false;
33
95
  }
34
96
 
35
- return prevProps.children !== null && nextProps.children !== null;
97
+ return prevProps.index !== nextProps.index;
36
98
  });
37
99
  //# sourceMappingURL=ChildrenMemoizedPage.js.map