@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
@@ -1 +1 @@
1
- {"version":3,"names":["React","View","Page","props","isVisible","otherProps","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,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,IAAT,QAAqB,cAArB;;AAGA,MAAMC,IAAI,GAAG,SAASA,IAAT,CAAcC,KAAd,EAAgC;EACzC,MAAM;IAAEC,SAAF;IAAa,GAAGC;EAAhB,IAA+BF,KAArC;EAEA,oBACI,oBAAC,IAAD;IACI,WAAW,EAAE;EADjB,GAEQE,UAFR,EADJ;AAMH,CATD;;AAWA,4BAAeL,KAAK,CAACM,IAAN,CAAWJ,IAAX,EAAiB,CAACK,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,CAACH,SAAV,KAAwBI,SAAS,CAACJ,SAAtC,EAAiD;IAC7C,OAAO,KAAP;EACH;;EAED,IAAII,SAAS,CAACJ,SAAV,IAAuBI,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,CAAf"}
1
+ {"version":3,"names":["React","memo","useState","Platform","View","runOnJS","useAnimatedReaction","StyleSheet","OFFSCREEN_RERENDER_LIMIT","styles","create","none","display","Page","props","index","children","loading","sharedIndex","assumeInitialPageState","activeIndex","value","active","OS","visited","pageState","setPageState","content","updatePageState","neighbor","prevState","willVisible","willActive","willNeighbor","nextState","activeStateChanged","willNewNeighbor","style","absoluteFill","undefined","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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"}
@@ -1,58 +1,64 @@
1
- import React, { useCallback, useEffect, useRef } from 'react';
1
+ import React, { Children, forwardRef, useCallback, useImperativeHandle, useRef } from 'react';
2
2
  import RNViewPager from 'react-native-pager-view';
3
- import { defaultEnableNeighborPageRerender, defaultEnableVisibleHint, defaultLoading, defaultPageComponent, usePageRenderer } from './utils';
4
- export default function ViewPager(props) {
3
+ import { useSharedValue } from 'react-native-reanimated';
4
+ import { defaultInitialPage, defaultLoading, defaultPageComponent } from './utils';
5
+ const ViewPager = /*#__PURE__*/forwardRef(function ViewPager(props, ref) {
5
6
  const {
6
7
  children,
7
- enableVisibleHint = defaultEnableVisibleHint,
8
- index,
8
+ initialPage = defaultInitialPage,
9
9
  keyboardDismissMode = 'on-drag',
10
10
  loading = defaultLoading,
11
11
  onChange,
12
12
  pageComponent = defaultPageComponent,
13
- enableNeighborPageRerender = defaultEnableNeighborPageRerender,
14
13
  pageForceRerenderKey,
15
14
  scrollEnabled = true,
16
15
  style
17
16
  } = props;
18
- const indexRef = useRef(index);
17
+ const sharedIndex = useSharedValue(initialPage);
19
18
  const pagerRef = useRef(null);
20
- const renderer = usePageRenderer({
21
- enableVisibleHint,
22
- index,
23
- loading,
24
- pageComponent,
25
- pageForceRerenderKey,
26
- enableNeighborPageRerender
27
- });
19
+
20
+ const setPage = newIndex => {
21
+ requestAnimationFrame(() => {
22
+ var _pagerRef$current;
23
+
24
+ (_pagerRef$current = pagerRef.current) === null || _pagerRef$current === void 0 ? void 0 : _pagerRef$current.setPage(newIndex);
25
+ });
26
+ };
27
+
28
+ useImperativeHandle(ref, () => ({
29
+ setPage
30
+ }), []);
28
31
  const handlePageSelected = useCallback(e => {
29
- indexRef.current = e.nativeEvent.position;
32
+ const currentIndex = sharedIndex.value;
33
+ const nextIndex = e.nativeEvent.position;
34
+
35
+ if (currentIndex === nextIndex) {
36
+ return;
37
+ }
38
+
39
+ sharedIndex.value = nextIndex;
30
40
 
31
41
  if (onChange) {
32
- onChange(indexRef.current);
42
+ onChange(nextIndex);
33
43
  }
34
44
  }, [onChange]);
35
- useEffect(() => {
36
- const handleNumber = index !== indexRef.current ? requestAnimationFrame(() => {
37
- var _pagerRef$current;
38
-
39
- return (_pagerRef$current = pagerRef.current) === null || _pagerRef$current === void 0 ? void 0 : _pagerRef$current.setPage(index);
40
- }) : undefined;
41
- return () => {
42
- if (handleNumber) {
43
- cancelAnimationFrame(handleNumber);
44
- }
45
- };
46
- }, [index]);
45
+ const PageComponent = pageComponent;
47
46
  return /*#__PURE__*/React.createElement(RNViewPager, {
48
- initialPage: index,
47
+ ref: pagerRef,
48
+ initialPage: initialPage,
49
49
  keyboardDismissMode: keyboardDismissMode,
50
50
  onPageSelected: handlePageSelected,
51
51
  pageMargin: 8,
52
- ref: pagerRef,
53
52
  scrollEnabled: scrollEnabled,
54
53
  style: style
55
- }, renderer(children));
56
- }
57
- ;
54
+ }, Children.map(children, (child, index) => /*#__PURE__*/React.createElement(PageComponent, {
55
+ key: index,
56
+ children: child,
57
+ index: index,
58
+ loading: loading,
59
+ rerenderKey: pageForceRerenderKey,
60
+ sharedIndex: sharedIndex
61
+ })));
62
+ });
63
+ export default ViewPager;
58
64
  //# sourceMappingURL=ViewPagerNative.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","useCallback","useEffect","useRef","RNViewPager","defaultEnableNeighborPageRerender","defaultEnableVisibleHint","defaultLoading","defaultPageComponent","usePageRenderer","ViewPager","props","children","enableVisibleHint","index","keyboardDismissMode","loading","onChange","pageComponent","enableNeighborPageRerender","pageForceRerenderKey","scrollEnabled","style","indexRef","pagerRef","renderer","handlePageSelected","e","current","nativeEvent","position","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,OAAOA,KAAP,IAAgBC,WAAhB,EAA6BC,SAA7B,EAAwCC,MAAxC,QAAsD,OAAtD;AAEA,OAAOC,WAAP,MAAwB,yBAAxB;AAEA,SACIC,iCADJ,EAEIC,wBAFJ,EAGIC,cAHJ,EAIIC,oBAJJ,EAKIC,eALJ,QAMO,SANP;AAQA,eAAe,SAASC,SAAT,CAAmBC,KAAnB,EAA0C;EACrD,MAAM;IACFC,QADE;IAEFC,iBAAiB,GAAGP,wBAFlB;IAGFQ,KAHE;IAIFC,mBAAmB,GAAG,SAJpB;IAKFC,OAAO,GAAGT,cALR;IAMFU,QANE;IAOFC,aAAa,GAAGV,oBAPd;IAQFW,0BAA0B,GAAGd,iCAR3B;IASFe,oBATE;IAUFC,aAAa,GAAG,IAVd;IAWFC;EAXE,IAYFX,KAZJ;EAcA,MAAMY,QAAQ,GAAGpB,MAAM,CAASW,KAAT,CAAvB;EACA,MAAMU,QAAQ,GAAGrB,MAAM,CAAqB,IAArB,CAAvB;EAEA,MAAMsB,QAAQ,GAAGhB,eAAe,CAAC;IAC7BI,iBAD6B;IAE7BC,KAF6B;IAG7BE,OAH6B;IAI7BE,aAJ6B;IAK7BE,oBAL6B;IAM7BD;EAN6B,CAAD,CAAhC;EASA,MAAMO,kBAAkB,GAAGzB,WAAW,CAAE0B,CAAD,IAAqC;IACxEJ,QAAQ,CAACK,OAAT,GAAmBD,CAAC,CAACE,WAAF,CAAcC,QAAjC;;IAEA,IAAIb,QAAJ,EAAc;MACVA,QAAQ,CAACM,QAAQ,CAACK,OAAV,CAAR;IACH;EACJ,CANqC,EAMnC,CAACX,QAAD,CANmC,CAAtC;EAQAf,SAAS,CAAC,MAAM;IACZ,MAAM6B,YAAY,GAAGjB,KAAK,KAAKS,QAAQ,CAACK,OAAnB,GACfI,qBAAqB,CAAC;MAAA;;MAAA,4BAAMR,QAAQ,CAACI,OAAf,sDAAM,kBAAkBK,OAAlB,CAA0BnB,KAA1B,CAAN;IAAA,CAAD,CADN,GAEfoB,SAFN;IAIA,OAAO,MAAM;MACT,IAAIH,YAAJ,EAAkB;QACdI,oBAAoB,CAACJ,YAAD,CAApB;MACH;IACJ,CAJD;EAKH,CAVQ,EAUN,CAACjB,KAAD,CAVM,CAAT;EAYA,oBACI,oBAAC,WAAD;IACI,WAAW,EAAEA,KADjB;IAEI,mBAAmB,EAAEC,mBAFzB;IAGI,cAAc,EAAEW,kBAHpB;IAII,UAAU,EAAE,CAJhB;IAKI,GAAG,EAAEF,QALT;IAMI,aAAa,EAAEH,aANnB;IAOI,KAAK,EAAEC;EAPX,GASKG,QAAQ,CAACb,QAAD,CATb,CADJ;AAaH;AAAA"}
1
+ {"version":3,"names":["React","Children","forwardRef","useCallback","useImperativeHandle","useRef","RNViewPager","useSharedValue","defaultInitialPage","defaultLoading","defaultPageComponent","ViewPager","props","ref","children","initialPage","keyboardDismissMode","loading","onChange","pageComponent","pageForceRerenderKey","scrollEnabled","style","sharedIndex","pagerRef","setPage","newIndex","requestAnimationFrame","current","handlePageSelected","e","currentIndex","value","nextIndex","nativeEvent","position","PageComponent","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,OAAOA,KAAP,IAAgBC,QAAhB,EAA0BC,UAA1B,EAAsCC,WAAtC,EAAmDC,mBAAnD,EAAwEC,MAAxE,QAAsF,OAAtF;AAEA,OAAOC,WAAP,MAAwB,yBAAxB;AACA,SAASC,cAAT,QAA+B,yBAA/B;AAGA,SAASC,kBAAT,EAA6BC,cAA7B,EAA6CC,oBAA7C,QAAyE,SAAzE;AAEA,MAAMC,SAAS,gBAAGT,UAAU,CAAoC,SAASS,SAAT,CAAmBC,KAAnB,EAA0BC,GAA1B,EAA+B;EAC3F,MAAM;IACFC,QADE;IAEFC,WAAW,GAAGP,kBAFZ;IAGFQ,mBAAmB,GAAG,SAHpB;IAIFC,OAAO,GAAGR,cAJR;IAKFS,QALE;IAMFC,aAAa,GAAGT,oBANd;IAOFU,oBAPE;IAQFC,aAAa,GAAG,IARd;IASFC;EATE,IAUFV,KAVJ;EAYA,MAAMW,WAAW,GAAGhB,cAAc,CAASQ,WAAT,CAAlC;EACA,MAAMS,QAAQ,GAAGnB,MAAM,CAAqB,IAArB,CAAvB;;EAEA,MAAMoB,OAAO,GAAIC,QAAD,IAAsB;IAClCC,qBAAqB,CAAC,MAAM;MAAA;;MACxB,qBAAAH,QAAQ,CAACI,OAAT,wEAAkBH,OAAlB,CAA0BC,QAA1B;IACH,CAFoB,CAArB;EAGH,CAJD;;EAMAtB,mBAAmB,CACfS,GADe,EAEf,OAAO;IAAEY;EAAF,CAAP,CAFe,EAGf,EAHe,CAAnB;EAMA,MAAMI,kBAAkB,GAAG1B,WAAW,CAAE2B,CAAD,IAAqC;IACxE,MAAMC,YAAY,GAAGR,WAAW,CAACS,KAAjC;IACA,MAAMC,SAAS,GAAGH,CAAC,CAACI,WAAF,CAAcC,QAAhC;;IAEA,IAAIJ,YAAY,KAAKE,SAArB,EAAgC;MAC5B;IACH;;IAEDV,WAAW,CAACS,KAAZ,GAAoBC,SAApB;;IAEA,IAAIf,QAAJ,EAAc;MACVA,QAAQ,CAACe,SAAD,CAAR;IACH;EACJ,CAbqC,EAanC,CAACf,QAAD,CAbmC,CAAtC;EAeA,MAAMkB,aAAa,GAAGjB,aAAtB;EAEA,oBACI,oBAAC,WAAD;IACI,GAAG,EAAEK,QADT;IAEI,WAAW,EAAET,WAFjB;IAGI,mBAAmB,EAAEC,mBAHzB;IAII,cAAc,EAAEa,kBAJpB;IAKI,UAAU,EAAE,CALhB;IAMI,aAAa,EAAER,aANnB;IAOI,KAAK,EAAEC;EAPX,GASKrB,QAAQ,CAACoC,GAAT,CAAavB,QAAb,EAAuB,CAACwB,KAAD,EAAQC,KAAR,kBACpB,oBAAC,aAAD;IACI,GAAG,EAAEA,KADT;IAEI,QAAQ,EAAED,KAFd;IAGI,KAAK,EAAEC,KAHX;IAII,OAAO,EAAEtB,OAJb;IAKI,WAAW,EAAEG,oBALjB;IAMI,WAAW,EAAEG;EANjB,EADH,CATL,CADJ;AAsBH,CAnE2B,CAA5B;AAqEA,eAAeZ,SAAf"}
@@ -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":""}
@@ -1,41 +1,44 @@
1
- import React from 'react';
2
- import { StyleSheet, View } from 'react-native';
3
- import { defaultEnableNeighborPageRerender, defaultEnableVisibleHint, defaultLoading, defaultPageComponent, usePageRenderer } from './utils';
1
+ import React, { Children, forwardRef, useImperativeHandle } from 'react';
2
+ import { View } from 'react-native';
3
+ import { useSharedValue } from 'react-native-reanimated';
4
+ import { StyleSheet } from '@fountain-ui/core';
5
+ import { defaultInitialPage, defaultLoading, defaultPageComponent } from './utils';
4
6
  const styles = StyleSheet.create({
5
7
  root: {
6
8
  // @ts-ignore
7
9
  overflow: 'auto',
8
10
  position: 'relative'
9
- },
10
- none: {
11
- display: 'none'
12
11
  }
13
12
  });
14
- export default function ViewPager(props) {
13
+ const ViewPager = /*#__PURE__*/forwardRef(function ViewPager(props, ref) {
15
14
  const {
16
15
  children,
17
- enableVisibleHint = defaultEnableVisibleHint,
18
- enableNeighborPageRerender = defaultEnableNeighborPageRerender,
19
- index,
16
+ initialPage = defaultInitialPage,
20
17
  loading = defaultLoading,
21
18
  pageComponent = defaultPageComponent,
22
19
  pageForceRerenderKey,
23
20
  style
24
21
  } = props;
25
- const renderer = usePageRenderer({
26
- enableVisibleHint,
27
- enableNeighborPageRerender,
28
- index,
29
- loading,
30
- pageComponent,
31
- pageForceRerenderKey
32
- });
22
+ const sharedIndex = useSharedValue(initialPage);
23
+
24
+ const setPage = newIndex => {
25
+ sharedIndex.value = newIndex;
26
+ };
27
+
28
+ useImperativeHandle(ref, () => ({
29
+ setPage
30
+ }), []);
31
+ const PageComponent = pageComponent;
33
32
  return /*#__PURE__*/React.createElement(View, {
34
33
  style: [styles.root, style]
35
- }, React.Children.map(renderer(children), (child, i) => /*#__PURE__*/React.cloneElement(child, {
36
- isVisible: i === index,
37
- style: i !== index ? styles.none : StyleSheet.absoluteFill
34
+ }, Children.map(children, (child, index) => /*#__PURE__*/React.createElement(PageComponent, {
35
+ key: index,
36
+ children: child,
37
+ index: index,
38
+ loading: loading,
39
+ rerenderKey: pageForceRerenderKey,
40
+ sharedIndex: sharedIndex
38
41
  })));
39
- }
40
- ;
42
+ });
43
+ export default ViewPager;
41
44
  //# sourceMappingURL=ViewPagerWeb.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","StyleSheet","View","defaultEnableNeighborPageRerender","defaultEnableVisibleHint","defaultLoading","defaultPageComponent","usePageRenderer","styles","create","root","overflow","position","none","display","ViewPager","props","children","enableVisibleHint","enableNeighborPageRerender","index","loading","pageComponent","pageForceRerenderKey","style","renderer","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,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,UAAT,EAAqBC,IAArB,QAAiC,cAAjC;AAEA,SACIC,iCADJ,EAEIC,wBAFJ,EAGIC,cAHJ,EAIIC,oBAJJ,EAKIC,eALJ,QAMO,SANP;AAQA,MAAMC,MAAM,GAAGP,UAAU,CAACQ,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;AASA,eAAe,SAASC,SAAT,CAAmBC,KAAnB,EAA0C;EACrD,MAAM;IACFC,QADE;IAEFC,iBAAiB,GAAGd,wBAFlB;IAGFe,0BAA0B,GAAGhB,iCAH3B;IAIFiB,KAJE;IAKFC,OAAO,GAAGhB,cALR;IAMFiB,aAAa,GAAGhB,oBANd;IAOFiB,oBAPE;IAQFC;EARE,IASFR,KATJ;EAWA,MAAMS,QAAQ,GAAGlB,eAAe,CAAC;IAC7BW,iBAD6B;IAE7BC,0BAF6B;IAG7BC,KAH6B;IAI7BC,OAJ6B;IAK7BC,aAL6B;IAM7BC;EAN6B,CAAD,CAAhC;EASA,oBACI,oBAAC,IAAD;IAAM,KAAK,EAAE,CAACf,MAAM,CAACE,IAAR,EAAcc,KAAd;EAAb,GACKxB,KAAK,CAAC0B,QAAN,CAAeC,GAAf,CAAmBF,QAAQ,CAACR,QAAD,CAA3B,EAAuC,CAACW,KAAD,EAAQC,CAAR,kBACpC7B,KAAK,CAAC8B,YAAN,CAAmBF,KAAnB,EAAgD;IAC5CG,SAAS,EAAEF,CAAC,KAAKT,KAD2B;IAE5CI,KAAK,EAAEK,CAAC,KAAKT,KAAN,GAAcZ,MAAM,CAACK,IAArB,GAA4BZ,UAAU,CAAC+B;EAFF,CAAhD,CADH,CADL,CADJ;AAUH;AAAA"}
1
+ {"version":3,"names":["React","Children","forwardRef","useImperativeHandle","View","useSharedValue","StyleSheet","defaultInitialPage","defaultLoading","defaultPageComponent","styles","create","root","overflow","position","ViewPager","props","ref","children","initialPage","loading","pageComponent","pageForceRerenderKey","style","sharedIndex","setPage","newIndex","value","PageComponent","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,OAAOA,KAAP,IAAgBC,QAAhB,EAA0BC,UAA1B,EAAsCC,mBAAtC,QAAiE,OAAjE;AACA,SAASC,IAAT,QAAqB,cAArB;AACA,SAASC,cAAT,QAA+B,yBAA/B;AACA,SAASC,UAAT,QAA2B,mBAA3B;AAGA,SAASC,kBAAT,EAA6BC,cAA7B,EAA6CC,oBAA7C,QAAyE,SAAzE;AAEA,MAAMC,MAAM,GAAGJ,UAAU,CAACK,MAAX,CAAkB;EAC7BC,IAAI,EAAE;IACF;IACAC,QAAQ,EAAE,MAFR;IAGFC,QAAQ,EAAE;EAHR;AADuB,CAAlB,CAAf;AAQA,MAAMC,SAAS,gBAAGb,UAAU,CAAoC,SAASa,SAAT,CAAmBC,KAAnB,EAA0BC,GAA1B,EAA+B;EAC3F,MAAM;IACFC,QADE;IAEFC,WAAW,GAAGZ,kBAFZ;IAGFa,OAAO,GAAGZ,cAHR;IAIFa,aAAa,GAAGZ,oBAJd;IAKFa,oBALE;IAMFC;EANE,IAOFP,KAPJ;EASA,MAAMQ,WAAW,GAAGnB,cAAc,CAASc,WAAT,CAAlC;;EAEA,MAAMM,OAAO,GAAIC,QAAD,IAAsB;IAClCF,WAAW,CAACG,KAAZ,GAAoBD,QAApB;EACH,CAFD;;EAIAvB,mBAAmB,CACfc,GADe,EAEf,OAAO;IAAEQ;EAAF,CAAP,CAFe,EAGf,EAHe,CAAnB;EAMA,MAAMG,aAAa,GAAGP,aAAtB;EAEA,oBACI,oBAAC,IAAD;IAAM,KAAK,EAAE,CAACX,MAAM,CAACE,IAAR,EAAcW,KAAd;EAAb,GACKtB,QAAQ,CAAC4B,GAAT,CAAaX,QAAb,EAAuB,CAACY,KAAD,EAAQC,KAAR,kBACpB,oBAAC,aAAD;IACI,GAAG,EAAEA,KADT;IAEI,QAAQ,EAAED,KAFd;IAGI,KAAK,EAAEC,KAHX;IAII,OAAO,EAAEX,OAJb;IAKI,WAAW,EAAEE,oBALjB;IAMI,WAAW,EAAEE;EANjB,EADH,CADL,CADJ;AAcH,CAtC2B,CAA5B;AAwCA,eAAeT,SAAf"}
@@ -1 +1 @@
1
- {"version":3,"names":["default"],"sources":["index.ts"],"sourcesContent":["export { default } from './ViewPagerWeb';\nexport type { default as ViewPagerProps } from './ViewPagerProps';"],"mappings":"AAAA,SAASA,OAAT,QAAwB,gBAAxB"}
1
+ {"version":3,"names":["default"],"sources":["index.ts"],"sourcesContent":["export { default } from './ViewPagerWeb';\nexport type { default as ViewPagerProps, ViewPagerInstance } from './ViewPagerProps';\n"],"mappings":"AAAA,SAASA,OAAT,QAAwB,gBAAxB"}
@@ -1,36 +1,5 @@
1
- import React from 'react';
2
1
  import ChildrenMemoizedPage from './ChildrenMemoizedPage';
3
- export const defaultEnableVisibleHint = false;
4
- export const defaultEnableNeighborPageRerender = false;
2
+ export const defaultInitialPage = 0;
5
3
  export const defaultLoading = 'lazy';
6
4
  export const defaultPageComponent = ChildrenMemoizedPage;
7
- export const usePageRenderer = _ref => {
8
- let {
9
- enableVisibleHint,
10
- index: currentIndex,
11
- loading,
12
- pageComponent: PageComponent,
13
- pageForceRerenderKey,
14
- enableNeighborPageRerender
15
- } = _ref;
16
- const pagesStateRef = React.useRef([]);
17
- pagesStateRef.current[currentIndex] = { ...pagesStateRef.current[currentIndex],
18
- visited: true
19
- };
20
- return children => React.Children.map(children, (child, index) => {
21
- var _pagesStateRef$curren;
22
-
23
- const visited = ((_pagesStateRef$curren = pagesStateRef.current[index]) === null || _pagesStateRef$curren === void 0 ? void 0 : _pagesStateRef$curren.visited) ?? false;
24
- const content = loading === 'eager' || visited ? child : null;
25
- const isVisible = enableVisibleHint ? index === currentIndex : false;
26
- const isNeighborIndex = index === currentIndex - 1 || index === currentIndex + 1;
27
- return /*#__PURE__*/React.createElement(PageComponent, {
28
- key: index,
29
- children: content,
30
- isNeighbor: enableNeighborPageRerender && isNeighborIndex,
31
- isVisible: isVisible,
32
- rerenderKey: pageForceRerenderKey
33
- });
34
- });
35
- };
36
5
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","ChildrenMemoizedPage","defaultEnableVisibleHint","defaultEnableNeighborPageRerender","defaultLoading","defaultPageComponent","usePageRenderer","enableVisibleHint","index","currentIndex","loading","pageComponent","PageComponent","pageForceRerenderKey","enableNeighborPageRerender","pagesStateRef","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,OAAOA,KAAP,MAAkB,OAAlB;AAEA,OAAOC,oBAAP,MAAiC,wBAAjC;AAmBA,OAAO,MAAMC,wBAAiC,GAAG,KAA1C;AAEP,OAAO,MAAMC,iCAA0C,GAAG,KAAnD;AAEP,OAAO,MAAMC,cAAuB,GAAG,MAAhC;AAEP,OAAO,MAAMC,oBAAmC,GAAGJ,oBAA5C;AAEP,OAAO,MAAMK,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,GAAGf,KAAK,CAACgB,MAAN,CAA+B,EAA/B,CAAtB;EAEAD,aAAa,CAACE,OAAd,CAAsBR,YAAtB,IAAsC,EAClC,GAAGM,aAAa,CAACE,OAAd,CAAsBR,YAAtB,CAD+B;IAElCS,OAAO,EAAE;EAFyB,CAAtC;EAKA,OAAQC,QAAQ,IAAInB,KAAK,CAACoB,QAAN,CAAeC,GAAf,CAAmBF,QAAnB,EAA6B,CAACG,KAAD,EAAQd,KAAR,KAAkB;IAAA;;IAC/D,MAAMU,OAAO,GAAG,0BAAAH,aAAa,CAACE,OAAd,CAAsBT,KAAtB,iFAA8BU,OAA9B,KAAyC,KAAzD;IACA,MAAMK,OAAO,GAAIb,OAAO,KAAK,OAAZ,IAAuBQ,OAAxB,GAAmCI,KAAnC,GAA2C,IAA3D;IAEA,MAAME,SAAS,GAAGjB,iBAAiB,GAAIC,KAAK,KAAKC,YAAd,GAA8B,KAAjE;IACA,MAAMgB,eAAe,GAAGjB,KAAK,KAAKC,YAAY,GAAG,CAAzB,IAA8BD,KAAK,KAAKC,YAAY,GAAG,CAA/E;IAEA,oBACI,oBAAC,aAAD;MACI,GAAG,EAAED,KADT;MAEI,QAAQ,EAAEe,OAFd;MAGI,UAAU,EAAET,0BAA0B,IAAIW,eAH9C;MAII,SAAS,EAAED,SAJf;MAKI,WAAW,EAAEX;IALjB,EADJ;EASH,CAhBmB,CAApB;AAiBH,CAhCM"}
1
+ {"version":3,"names":["ChildrenMemoizedPage","defaultInitialPage","defaultLoading","defaultPageComponent"],"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,OAAOA,oBAAP,MAAiC,wBAAjC;AAEA,OAAO,MAAMC,kBAA0B,GAAG,CAAnC;AAEP,OAAO,MAAMC,cAAuB,GAAG,MAAhC;AAEP,OAAO,MAAMC,oBAAmC,GAAGH,oBAA5C"}
@@ -1,4 +1,5 @@
1
1
  import React from 'react';
2
2
  import type { PageProps } from './ViewPagerProps';
3
- declare const _default: React.MemoExoticComponent<(props: PageProps) => JSX.Element>;
3
+ declare function Page(props: PageProps): JSX.Element;
4
+ declare const _default: React.MemoExoticComponent<typeof Page>;
4
5
  export default _default;
@@ -1,2 +1,5 @@
1
+ import React from 'react';
1
2
  import type ViewPagerProps from './ViewPagerProps';
2
- export default function ViewPager(props: ViewPagerProps): JSX.Element;
3
+ import type { ViewPagerInstance } from './ViewPagerProps';
4
+ declare const ViewPager: React.ForwardRefExoticComponent<Pick<ViewPagerProps, "style" | "children" | "onChange" | "keyboardDismissMode" | "scrollEnabled" | "loading" | "initialPage" | "pageComponent" | "pageForceRerenderKey"> & React.RefAttributes<ViewPagerInstance>>;
5
+ export default ViewPager;
@@ -1,33 +1,34 @@
1
- import React from 'react';
1
+ import type { ComponentType, PropsWithChildren, ReactNode, Ref } from 'react';
2
2
  import type { ViewProps } from 'react-native';
3
+ import type { SharedValue } from 'react-native-reanimated';
3
4
  import type { ComponentProps } from '@fountain-ui/core';
4
5
  export declare type KeyboardDismissMode = 'none' | 'on-drag';
5
- export declare type PageProps = React.PropsWithChildren<ViewProps> & {
6
- isNeighbor: boolean;
7
- isVisible: boolean;
8
- rerenderKey?: any;
6
+ export declare type PageProps = PropsWithChildren<ViewProps> & {
7
+ index: number;
8
+ loading: ViewPagerProps['loading'];
9
+ sharedIndex: SharedValue<number>;
10
+ rerenderKey?: ViewPagerProps['pageForceRerenderKey'];
9
11
  };
10
- export declare type PageComponent = React.ComponentType<PageProps>;
12
+ export declare type PageComponent = ComponentType<PageProps>;
11
13
  export declare type Loading = 'lazy' | 'eager';
12
- export default interface ViewPagerProps extends ComponentProps<{
13
- /**
14
- * Collection of ViewPager components.
15
- */
16
- children?: React.ReactNode;
14
+ export interface ViewPagerInstance {
17
15
  /**
18
- * If `true`, enable page visible hint.
19
- * @default false
16
+ * Function to scroll to a specific page in the ViewPager. Invalid index is ignored.
17
+ * @param index
20
18
  */
21
- enableVisibleHint?: boolean;
19
+ setPage: (index: number) => void;
20
+ }
21
+ export default interface ViewPagerProps extends ComponentProps<{
22
+ ref?: Ref<ViewPagerInstance>;
22
23
  /**
23
- * If `true`, Based on the current index, the pages on the left and right are also rerender.
24
- * @default false
24
+ * Collection of ViewPager components.
25
25
  */
26
- enableNeighborPageRerender?: boolean;
26
+ children?: ReactNode;
27
27
  /**
28
- * A number representing the index of the active page.
28
+ * Index of initial page that should be selected.
29
+ * @default 0
29
30
  */
30
- index: number;
31
+ initialPage?: number;
31
32
  /**
32
33
  * Whether to load the page immediately (`eager`) or on an as-needed basis (`lazy`).
33
34
  * @default 'lazy'
@@ -1,2 +1,5 @@
1
+ import React from 'react';
1
2
  import type ViewPagerProps from './ViewPagerProps';
2
- export default function ViewPager(props: ViewPagerProps): JSX.Element;
3
+ import type { ViewPagerInstance } from './ViewPagerProps';
4
+ declare const ViewPager: React.ForwardRefExoticComponent<Pick<ViewPagerProps, "style" | "children" | "onChange" | "keyboardDismissMode" | "scrollEnabled" | "loading" | "initialPage" | "pageComponent" | "pageForceRerenderKey"> & React.RefAttributes<ViewPagerInstance>>;
5
+ export default ViewPager;
@@ -1,2 +1,2 @@
1
1
  export { default } from './ViewPagerWeb';
2
- export type { default as ViewPagerProps } from './ViewPagerProps';
2
+ export type { default as ViewPagerProps, ViewPagerInstance } from './ViewPagerProps';
@@ -1,21 +1,4 @@
1
- import React from 'react';
2
- import ViewPagerProps, { Loading, PageComponent } from './ViewPagerProps';
3
- export interface PageState {
4
- visited?: boolean;
5
- }
6
- export interface PageRenderOption {
7
- enableVisibleHint: boolean;
8
- enableNeighborPageRerender: boolean;
9
- index: number;
10
- loading: Loading;
11
- pageComponent: PageComponent;
12
- pageForceRerenderKey?: any;
13
- }
14
- export interface PageRenderer {
15
- (children: ViewPagerProps['children']): React.ReactNode;
16
- }
17
- export declare const defaultEnableVisibleHint: boolean;
18
- export declare const defaultEnableNeighborPageRerender: boolean;
1
+ import { Loading, PageComponent } from './ViewPagerProps';
2
+ export declare const defaultInitialPage: number;
19
3
  export declare const defaultLoading: Loading;
20
4
  export declare const defaultPageComponent: PageComponent;
21
- export declare const usePageRenderer: ({ enableVisibleHint, index: currentIndex, loading, pageComponent: PageComponent, pageForceRerenderKey, enableNeighborPageRerender, }: PageRenderOption) => PageRenderer;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fountain-ui/lab",
3
- "version": "2.0.0-beta.10",
3
+ "version": "2.0.0-beta.11",
4
4
  "private": false,
5
5
  "author": "Fountain-UI Team",
6
6
  "description": "Incubator for Fountain-UI React components.",
@@ -85,5 +85,5 @@
85
85
  "publishConfig": {
86
86
  "access": "public"
87
87
  },
88
- "gitHead": "0ac49f4ca5f910fc8b5edad2593300d796b2d914"
88
+ "gitHead": "80988af3fdfd671fcb655d4b36a017ce13baf29e"
89
89
  }
@@ -1,36 +1,105 @@
1
- import React from 'react';
2
- 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';
3
5
  import type { PageProps } from './ViewPagerProps';
4
6
 
5
- const Page = function Page(props: PageProps) {
6
- const { isVisible, ...otherProps } = props;
7
+ const OFFSCREEN_RERENDER_LIMIT = 1;
8
+
9
+ const styles = StyleSheet.create({
10
+ none: { display: 'none' },
11
+ });
12
+
13
+ interface PageState {
14
+ active: boolean;
15
+ visited: boolean;
16
+ }
17
+
18
+ function Page(props: PageProps) {
19
+ const {
20
+ index,
21
+ children,
22
+ loading,
23
+ sharedIndex,
24
+ } = props;
25
+
26
+ const assumeInitialPageState = (): PageState => {
27
+ const activeIndex = sharedIndex.value;
28
+
29
+ const active = index === activeIndex;
30
+
31
+ if (Platform.OS === 'web') {
32
+ return { active, visited: active };
33
+ }
34
+
35
+ if (loading === 'eager') {
36
+ return { active, visited: true };
37
+ }
38
+
39
+ const visited = index >= activeIndex - OFFSCREEN_RERENDER_LIMIT
40
+ && index <= activeIndex + OFFSCREEN_RERENDER_LIMIT;
41
+
42
+ return { active, visited };
43
+ };
44
+
45
+ const [pageState, setPageState] = useState<PageState>(assumeInitialPageState);
46
+
47
+ const content = pageState.visited ? children : null;
48
+
49
+ const updatePageState = (active: boolean, neighbor: boolean) => {
50
+ setPageState(prevState => {
51
+ if (prevState.active !== active) {
52
+ return { active, visited: active || prevState.visited };
53
+ }
54
+
55
+ if (neighbor && !prevState.visited) {
56
+ return { ...prevState, visited: true };
57
+ }
58
+
59
+ return prevState;
60
+ });
61
+ };
62
+
63
+ useAnimatedReaction(
64
+ () => {
65
+ const activeIndex = sharedIndex.value;
66
+
67
+ const willVisible = index >= activeIndex - OFFSCREEN_RERENDER_LIMIT
68
+ && index <= activeIndex + OFFSCREEN_RERENDER_LIMIT;
69
+
70
+ const willActive = index === activeIndex;
71
+ const willNeighbor = Platform.OS === 'web' ? false : (willVisible && !willActive);
72
+
73
+ return { willActive, willNeighbor };
74
+ },
75
+ (nextState, prevState) => {
76
+ const activeStateChanged = nextState.willActive !== prevState?.willActive;
77
+ const willNewNeighbor = nextState.willNeighbor && !prevState?.willNeighbor;
78
+
79
+ if (activeStateChanged || willNewNeighbor) {
80
+ runOnJS(updatePageState)(nextState.willActive, nextState.willNeighbor);
81
+ }
82
+ },
83
+ [index],
84
+ );
85
+
86
+ const style = Platform.OS === 'web'
87
+ ? (pageState.active ? StyleSheet.absoluteFill : styles.none)
88
+ : undefined;
7
89
 
8
90
  return (
9
91
  <View
92
+ children={content}
10
93
  collapsable={false}
11
- {...otherProps}
94
+ style={style}
12
95
  />
13
96
  );
14
- };
15
-
16
- export default React.memo(Page, (prevProps, nextProps) => {
17
- if (prevProps.children === null && nextProps.children === null) {
18
- return true;
19
- }
20
-
21
- // isVisible is an important condition for determining memos on the web.
22
- // Reference ViewPagerWeb's return.
23
- if (prevProps.isVisible !== nextProps.isVisible) {
24
- return false;
25
- }
26
-
27
- if (nextProps.isVisible || nextProps.isNeighbor) {
28
- return false;
29
- }
97
+ }
30
98
 
99
+ export default memo(Page, (prevProps, nextProps) => {
31
100
  if (prevProps.rerenderKey !== nextProps.rerenderKey) {
32
101
  return false;
33
102
  }
34
103
 
35
- return prevProps.children !== null && nextProps.children !== null;
104
+ return prevProps.index !== nextProps.index;
36
105
  });