@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.
- package/build/commonjs/ViewPager/ChildrenMemoizedPage.js +90 -22
- package/build/commonjs/ViewPager/ChildrenMemoizedPage.js.map +1 -1
- package/build/commonjs/ViewPager/ViewPagerNative.js +41 -34
- package/build/commonjs/ViewPager/ViewPagerNative.js.map +1 -1
- package/build/commonjs/ViewPager/ViewPagerProps.js.map +1 -1
- package/build/commonjs/ViewPager/ViewPagerWeb.js +32 -25
- package/build/commonjs/ViewPager/ViewPagerWeb.js.map +1 -1
- package/build/commonjs/ViewPager/index.js.map +1 -1
- package/build/commonjs/ViewPager/utils.js +3 -41
- package/build/commonjs/ViewPager/utils.js.map +1 -1
- package/build/module/ViewPager/ChildrenMemoizedPage.js +85 -23
- package/build/module/ViewPager/ChildrenMemoizedPage.js.map +1 -1
- package/build/module/ViewPager/ViewPagerNative.js +40 -34
- package/build/module/ViewPager/ViewPagerNative.js.map +1 -1
- package/build/module/ViewPager/ViewPagerProps.js.map +1 -1
- package/build/module/ViewPager/ViewPagerWeb.js +26 -23
- package/build/module/ViewPager/ViewPagerWeb.js.map +1 -1
- package/build/module/ViewPager/index.js.map +1 -1
- package/build/module/ViewPager/utils.js +1 -32
- package/build/module/ViewPager/utils.js.map +1 -1
- package/build/typescript/ViewPager/ChildrenMemoizedPage.d.ts +2 -1
- package/build/typescript/ViewPager/ViewPagerNative.d.ts +4 -1
- package/build/typescript/ViewPager/ViewPagerProps.d.ts +20 -19
- package/build/typescript/ViewPager/ViewPagerWeb.d.ts +4 -1
- package/build/typescript/ViewPager/index.d.ts +1 -1
- package/build/typescript/ViewPager/utils.d.ts +2 -19
- package/package.json +2 -2
- package/src/ViewPager/ChildrenMemoizedPage.tsx +91 -22
- package/src/ViewPager/ViewPagerNative.tsx +43 -38
- package/src/ViewPager/ViewPagerProps.ts +20 -19
- package/src/ViewPager/ViewPagerWeb.tsx +34 -29
- package/src/ViewPager/index.ts +1 -1
- package/src/ViewPager/utils.tsx +2 -55
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","View","Page","props","
|
|
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,
|
|
1
|
+
import React, { Children, forwardRef, useCallback, useImperativeHandle, useRef } from 'react';
|
|
2
2
|
import RNViewPager from 'react-native-pager-view';
|
|
3
|
-
import {
|
|
4
|
-
|
|
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
|
-
|
|
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
|
|
17
|
+
const sharedIndex = useSharedValue(initialPage);
|
|
19
18
|
const pagerRef = useRef(null);
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
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(
|
|
42
|
+
onChange(nextIndex);
|
|
33
43
|
}
|
|
34
44
|
}, [onChange]);
|
|
35
|
-
|
|
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
|
-
|
|
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
|
-
},
|
|
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","
|
|
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
|
|
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 {
|
|
3
|
-
import {
|
|
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
|
-
|
|
13
|
+
const ViewPager = /*#__PURE__*/forwardRef(function ViewPager(props, ref) {
|
|
15
14
|
const {
|
|
16
15
|
children,
|
|
17
|
-
|
|
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
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
},
|
|
36
|
-
|
|
37
|
-
|
|
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","
|
|
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'
|
|
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
|
|
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":["
|
|
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
|
|
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
|
-
|
|
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
|
|
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 =
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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 =
|
|
12
|
+
export declare type PageComponent = ComponentType<PageProps>;
|
|
11
13
|
export declare type Loading = 'lazy' | 'eager';
|
|
12
|
-
export
|
|
13
|
-
/**
|
|
14
|
-
* Collection of ViewPager components.
|
|
15
|
-
*/
|
|
16
|
-
children?: React.ReactNode;
|
|
14
|
+
export interface ViewPagerInstance {
|
|
17
15
|
/**
|
|
18
|
-
*
|
|
19
|
-
* @
|
|
16
|
+
* Function to scroll to a specific page in the ViewPager. Invalid index is ignored.
|
|
17
|
+
* @param index
|
|
20
18
|
*/
|
|
21
|
-
|
|
19
|
+
setPage: (index: number) => void;
|
|
20
|
+
}
|
|
21
|
+
export default interface ViewPagerProps extends ComponentProps<{
|
|
22
|
+
ref?: Ref<ViewPagerInstance>;
|
|
22
23
|
/**
|
|
23
|
-
*
|
|
24
|
-
* @default false
|
|
24
|
+
* Collection of ViewPager components.
|
|
25
25
|
*/
|
|
26
|
-
|
|
26
|
+
children?: ReactNode;
|
|
27
27
|
/**
|
|
28
|
-
*
|
|
28
|
+
* Index of initial page that should be selected.
|
|
29
|
+
* @default 0
|
|
29
30
|
*/
|
|
30
|
-
|
|
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
|
-
|
|
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
|
|
2
|
-
|
|
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.
|
|
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": "
|
|
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
|
|
6
|
-
|
|
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
|
-
{
|
|
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.
|
|
104
|
+
return prevProps.index !== nextProps.index;
|
|
36
105
|
});
|