@fountain-ui/lab 2.0.0-beta.1 → 2.0.0-beta.10
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/AnimatedY/AnimatedY.js +10 -14
- package/build/commonjs/AnimatedY/AnimatedY.js.map +1 -1
- package/build/commonjs/AnimatedY/AnimatedYProps.js.map +1 -1
- package/build/commonjs/AnimatedY/index.js.map +1 -1
- package/build/commonjs/BottomSheet/BottomSheetNative.js +1 -1
- package/build/commonjs/BottomSheet/BottomSheetNative.js.map +1 -1
- package/build/commonjs/BottomSheet/BottomSheetProps.js.map +1 -1
- package/build/commonjs/BottomSheet/BottomSheetWeb.js +2 -6
- package/build/commonjs/BottomSheet/BottomSheetWeb.js.map +1 -1
- package/build/commonjs/BottomSheet/TransparentBackdrop.js +1 -1
- package/build/commonjs/BottomSheet/TransparentBackdrop.js.map +1 -1
- package/build/commonjs/BottomSheet/index.js.map +1 -1
- package/build/commonjs/BottomSheet/index.native.js.map +1 -1
- package/build/commonjs/Carousel/CarouselNative.js.map +1 -1
- package/build/commonjs/Carousel/CarouselProps.js.map +1 -1
- package/build/commonjs/Carousel/CarouselWeb.js +1 -1
- package/build/commonjs/Carousel/CarouselWeb.js.map +1 -1
- package/build/commonjs/Carousel/index.js.map +1 -1
- package/build/commonjs/Carousel/index.native.js.map +1 -1
- package/build/commonjs/Carousel/utils.js +1 -1
- package/build/commonjs/Carousel/utils.js.map +1 -1
- package/build/commonjs/ComicViewer/ComicViewer.js +16 -11
- package/build/commonjs/ComicViewer/ComicViewer.js.map +1 -1
- package/build/commonjs/ComicViewer/ComicViewerItemProps.js.map +1 -1
- package/build/commonjs/ComicViewer/ComicViewerProps.js.map +1 -1
- package/build/commonjs/ComicViewer/ViewerItem.js +4 -3
- package/build/commonjs/ComicViewer/ViewerItem.js.map +1 -1
- package/build/commonjs/ComicViewer/index.js.map +1 -1
- package/build/commonjs/DateTimePicker/DateTimePicker.js +2 -2
- package/build/commonjs/DateTimePicker/DateTimePicker.js.map +1 -1
- package/build/commonjs/DateTimePicker/DateTimePickerProps.js.map +1 -1
- package/build/commonjs/DateTimePicker/DateTimePickerProvider.js.map +1 -1
- package/build/commonjs/DateTimePicker/YearPicker.js +21 -17
- package/build/commonjs/DateTimePicker/YearPicker.js.map +1 -1
- package/build/commonjs/DateTimePicker/index.js +4 -4
- package/build/commonjs/DateTimePicker/index.js.map +1 -1
- package/build/commonjs/DateTimePicker/utils.js +2 -1
- package/build/commonjs/DateTimePicker/utils.js.map +1 -1
- package/build/commonjs/FlipCard/FlipCard.js +7 -13
- package/build/commonjs/FlipCard/FlipCard.js.map +1 -1
- package/build/commonjs/FlipCard/FlipCardProps.js.map +1 -1
- package/build/commonjs/FlipCard/index.js.map +1 -1
- package/build/commonjs/StatusBarProvider/Provider.js +1 -1
- package/build/commonjs/StatusBarProvider/Provider.js.map +1 -1
- package/build/commonjs/StatusBarProvider/StatusBarProvider.js.map +1 -1
- package/build/commonjs/StatusBarProvider/StatusBarProviderProps.js.map +1 -1
- package/build/commonjs/StatusBarProvider/index.js.map +1 -1
- package/build/commonjs/ViewPager/ChildrenMemoizedPage.js +1 -1
- package/build/commonjs/ViewPager/ChildrenMemoizedPage.js.map +1 -1
- package/build/commonjs/ViewPager/ViewPagerNative.js +19 -16
- package/build/commonjs/ViewPager/ViewPagerNative.js.map +1 -1
- package/build/commonjs/ViewPager/ViewPagerProps.js.map +1 -1
- package/build/commonjs/ViewPager/ViewPagerWeb.js.map +1 -1
- package/build/commonjs/ViewPager/index.js.map +1 -1
- package/build/commonjs/ViewPager/index.native.js.map +1 -1
- package/build/commonjs/ViewPager/utils.js +13 -11
- package/build/commonjs/ViewPager/utils.js.map +1 -1
- package/build/commonjs/hooks/index.js.map +1 -1
- package/build/commonjs/hooks/useAppbarStyles.js.map +1 -1
- package/build/commonjs/hooks/useElevationStyle.js.map +1 -1
- package/build/commonjs/hooks/useHeight.js +5 -4
- package/build/commonjs/hooks/useHeight.js.map +1 -1
- package/build/commonjs/hooks/useUnstableCollapsibleAppBar.js +56 -57
- package/build/commonjs/hooks/useUnstableCollapsibleAppBar.js.map +1 -1
- package/build/commonjs/hooks/useUnstableToggleDisplayStyle.js +9 -11
- package/build/commonjs/hooks/useUnstableToggleDisplayStyle.js.map +1 -1
- package/build/commonjs/index.js +10 -10
- package/build/commonjs/index.js.map +1 -1
- package/build/module/AnimatedY/AnimatedY.js +11 -10
- package/build/module/AnimatedY/AnimatedY.js.map +1 -1
- package/build/module/AnimatedY/AnimatedYProps.js.map +1 -1
- package/build/module/AnimatedY/index.js.map +1 -1
- package/build/module/BottomSheet/BottomSheetNative.js +1 -1
- package/build/module/BottomSheet/BottomSheetNative.js.map +1 -1
- package/build/module/BottomSheet/BottomSheetProps.js.map +1 -1
- package/build/module/BottomSheet/BottomSheetWeb.js +2 -6
- package/build/module/BottomSheet/BottomSheetWeb.js.map +1 -1
- package/build/module/BottomSheet/TransparentBackdrop.js +1 -1
- package/build/module/BottomSheet/TransparentBackdrop.js.map +1 -1
- package/build/module/BottomSheet/index.js.map +1 -1
- package/build/module/BottomSheet/index.native.js.map +1 -1
- package/build/module/Carousel/CarouselNative.js.map +1 -1
- package/build/module/Carousel/CarouselProps.js.map +1 -1
- package/build/module/Carousel/CarouselWeb.js +1 -1
- package/build/module/Carousel/CarouselWeb.js.map +1 -1
- package/build/module/Carousel/index.js.map +1 -1
- package/build/module/Carousel/index.native.js.map +1 -1
- package/build/module/Carousel/utils.js.map +1 -1
- package/build/module/ComicViewer/ComicViewer.js +16 -11
- package/build/module/ComicViewer/ComicViewer.js.map +1 -1
- package/build/module/ComicViewer/ComicViewerItemProps.js.map +1 -1
- package/build/module/ComicViewer/ComicViewerProps.js.map +1 -1
- package/build/module/ComicViewer/ViewerItem.js +4 -3
- package/build/module/ComicViewer/ViewerItem.js.map +1 -1
- package/build/module/ComicViewer/index.js.map +1 -1
- package/build/module/DateTimePicker/DateTimePicker.js +2 -2
- package/build/module/DateTimePicker/DateTimePicker.js.map +1 -1
- package/build/module/DateTimePicker/DateTimePickerProps.js.map +1 -1
- package/build/module/DateTimePicker/DateTimePickerProvider.js.map +1 -1
- package/build/module/DateTimePicker/YearPicker.js +21 -17
- package/build/module/DateTimePicker/YearPicker.js.map +1 -1
- package/build/module/DateTimePicker/index.js.map +1 -1
- package/build/module/DateTimePicker/utils.js +2 -1
- package/build/module/DateTimePicker/utils.js.map +1 -1
- package/build/module/FlipCard/FlipCard.js +7 -7
- package/build/module/FlipCard/FlipCard.js.map +1 -1
- package/build/module/FlipCard/FlipCardProps.js.map +1 -1
- package/build/module/FlipCard/index.js.map +1 -1
- package/build/module/StatusBarProvider/Provider.js.map +1 -1
- package/build/module/StatusBarProvider/StatusBarProvider.js.map +1 -1
- package/build/module/StatusBarProvider/StatusBarProviderProps.js.map +1 -1
- package/build/module/StatusBarProvider/index.js.map +1 -1
- package/build/module/ViewPager/ChildrenMemoizedPage.js +1 -1
- package/build/module/ViewPager/ChildrenMemoizedPage.js.map +1 -1
- package/build/module/ViewPager/ViewPagerNative.js +14 -9
- package/build/module/ViewPager/ViewPagerNative.js.map +1 -1
- package/build/module/ViewPager/ViewPagerProps.js.map +1 -1
- package/build/module/ViewPager/ViewPagerWeb.js.map +1 -1
- package/build/module/ViewPager/index.js.map +1 -1
- package/build/module/ViewPager/index.native.js.map +1 -1
- package/build/module/ViewPager/utils.js +11 -10
- package/build/module/ViewPager/utils.js.map +1 -1
- package/build/module/hooks/index.js.map +1 -1
- package/build/module/hooks/useAppbarStyles.js.map +1 -1
- package/build/module/hooks/useElevationStyle.js.map +1 -1
- package/build/module/hooks/useHeight.js +4 -3
- package/build/module/hooks/useHeight.js.map +1 -1
- package/build/module/hooks/useUnstableCollapsibleAppBar.js +58 -43
- package/build/module/hooks/useUnstableCollapsibleAppBar.js.map +1 -1
- package/build/module/hooks/useUnstableToggleDisplayStyle.js +9 -7
- package/build/module/hooks/useUnstableToggleDisplayStyle.js.map +1 -1
- package/build/module/index.js.map +1 -1
- package/build/typescript/AnimatedY/AnimatedY.d.ts +0 -1
- package/build/typescript/BottomSheet/BottomSheetNative.d.ts +0 -1
- package/build/typescript/BottomSheet/BottomSheetWeb.d.ts +0 -1
- package/build/typescript/BottomSheet/TransparentBackdrop.d.ts +0 -1
- package/build/typescript/Carousel/CarouselNative.d.ts +0 -1
- package/build/typescript/ComicViewer/ComicViewer.d.ts +0 -1
- package/build/typescript/DateTimePicker/DateTimePicker.d.ts +0 -1
- package/build/typescript/DateTimePicker/YearPicker.d.ts +0 -1
- package/build/typescript/FlipCard/FlipCard.d.ts +0 -1
- package/build/typescript/StatusBarProvider/StatusBarProvider.d.ts +0 -1
- package/build/typescript/ViewPager/ViewPagerNative.d.ts +0 -1
- package/build/typescript/ViewPager/ViewPagerWeb.d.ts +0 -1
- package/build/typescript/hooks/useUnstableCollapsibleAppBar.d.ts +2 -3
- package/build/typescript/hooks/useUnstableToggleDisplayStyle.d.ts +2 -2
- package/package.json +13 -13
- package/src/AnimatedY/AnimatedY.tsx +13 -10
- package/src/DateTimePicker/DateTimePicker.tsx +2 -2
- package/src/FlipCard/FlipCard.tsx +8 -8
- package/src/ViewPager/ViewPagerNative.tsx +16 -9
- package/src/hooks/useHeight.ts +2 -2
- package/src/hooks/useUnstableCollapsibleAppBar.ts +59 -42
- package/src/hooks/useUnstableToggleDisplayStyle.ts +8 -6
- package/build/commonjs/hooks/useWidth.js +0 -29
- package/build/commonjs/hooks/useWidth.js.map +0 -1
- package/build/module/hooks/useWidth.js +0 -15
- package/build/module/hooks/useWidth.js.map +0 -1
- package/build/typescript/hooks/useWidth.d.ts +0 -2
- package/src/hooks/useWidth.ts +0 -17
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.10",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": "Fountain-UI Team",
|
|
6
6
|
"description": "Incubator for Fountain-UI React components.",
|
|
@@ -15,20 +15,21 @@
|
|
|
15
15
|
"prepare": "bob build"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@emotion/react": "^11.
|
|
19
|
-
"@emotion/styled": "^11.
|
|
20
|
-
"@fountain-ui/icons": "^2.0.0-beta.
|
|
21
|
-
"@fountain-ui/utils": "^2.0.0-beta.
|
|
18
|
+
"@emotion/react": "^11.10.0",
|
|
19
|
+
"@emotion/styled": "^11.10.0",
|
|
20
|
+
"@fountain-ui/icons": "^2.0.0-beta.6",
|
|
21
|
+
"@fountain-ui/utils": "^2.0.0-beta.3",
|
|
22
22
|
"react-native-calendars": "1.1267.0"
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
25
|
-
"@fountain-ui/core": "^2.0.0-beta.
|
|
25
|
+
"@fountain-ui/core": "^2.0.0-beta.3",
|
|
26
26
|
"@gorhom/bottom-sheet": "^4.1.3",
|
|
27
|
-
"@react-native-community/viewpager": "> 4.2.x",
|
|
28
27
|
"date-fns": "^2.0.0",
|
|
29
28
|
"react": "^16.8.0 || ^17.0.0",
|
|
30
29
|
"react-dom": "^16.8.0 || ^17.0.0",
|
|
31
30
|
"react-native": "^0.63.0",
|
|
31
|
+
"react-native-gesture-handler": "^2.0.0",
|
|
32
|
+
"react-native-pager-view": "^4.0.0",
|
|
32
33
|
"react-native-snap-carousel": "^3.9.0",
|
|
33
34
|
"react-slick": "^0.25.0"
|
|
34
35
|
},
|
|
@@ -36,9 +37,6 @@
|
|
|
36
37
|
"@gorhom/bottom-sheet": {
|
|
37
38
|
"optional": true
|
|
38
39
|
},
|
|
39
|
-
"@react-native-community/viewpager": {
|
|
40
|
-
"optional": true
|
|
41
|
-
},
|
|
42
40
|
"react-dom": {
|
|
43
41
|
"optional": true
|
|
44
42
|
},
|
|
@@ -48,17 +46,19 @@
|
|
|
48
46
|
"react-slick": {
|
|
49
47
|
"optional": true
|
|
50
48
|
},
|
|
49
|
+
"react-native-pager-view": {
|
|
50
|
+
"optional": true
|
|
51
|
+
},
|
|
51
52
|
"react-native-snap-carousel": {
|
|
52
53
|
"optional": true
|
|
53
54
|
}
|
|
54
55
|
},
|
|
55
56
|
"devDependencies": {
|
|
56
|
-
"@fountain-ui/core": "^2.0.0-beta.1",
|
|
57
57
|
"@gorhom/bottom-sheet": "4.1.3",
|
|
58
|
-
"@react-native-community/viewpager": "^4.2.2",
|
|
59
58
|
"@types/react-native-snap-carousel": "^3.8.4",
|
|
60
59
|
"@types/react-slick": "^0.23.5",
|
|
61
60
|
"date-fns": "^2.23.0",
|
|
61
|
+
"react-native-pager-view": "^4.2.4",
|
|
62
62
|
"react-native-safe-area-context": "^3.3.2",
|
|
63
63
|
"react-native-snap-carousel": "^3.9.1",
|
|
64
64
|
"react-slick": "^0.28.1"
|
|
@@ -85,5 +85,5 @@
|
|
|
85
85
|
"publishConfig": {
|
|
86
86
|
"access": "public"
|
|
87
87
|
},
|
|
88
|
-
"gitHead": "
|
|
88
|
+
"gitHead": "0ac49f4ca5f910fc8b5edad2593300d796b2d914"
|
|
89
89
|
}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import
|
|
1
|
+
import React, { useEffect } from 'react';
|
|
2
|
+
import type { WithTimingConfig } from 'react-native-reanimated';
|
|
3
|
+
import Animated, { Easing, useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated';
|
|
3
4
|
import type AnimatedYProps from './AnimatedYProps';
|
|
4
5
|
|
|
6
|
+
const ANIMATION_CONFIG: Readonly<WithTimingConfig> = {
|
|
7
|
+
duration: 150,
|
|
8
|
+
easing: Easing.out(Easing.exp),
|
|
9
|
+
};
|
|
10
|
+
|
|
5
11
|
export default function AnimatedY(props: AnimatedYProps) {
|
|
6
12
|
const {
|
|
7
13
|
children,
|
|
@@ -9,17 +15,14 @@ export default function AnimatedY(props: AnimatedYProps) {
|
|
|
9
15
|
style,
|
|
10
16
|
} = props;
|
|
11
17
|
|
|
12
|
-
const animatedY =
|
|
13
|
-
const animatedStyle =
|
|
18
|
+
const animatedY = useSharedValue(translateY);
|
|
19
|
+
const animatedStyle = useAnimatedStyle(() => ({
|
|
14
20
|
transform: [{ translateY: animatedY.value }],
|
|
15
|
-
}));
|
|
21
|
+
}), []);
|
|
16
22
|
|
|
17
|
-
|
|
23
|
+
useEffect(() => {
|
|
18
24
|
if (translateY >= 0) {
|
|
19
|
-
animatedY.value =
|
|
20
|
-
duration: 150,
|
|
21
|
-
easing: Easing.out(Easing.exp),
|
|
22
|
-
});
|
|
25
|
+
animatedY.value = withTiming(translateY, ANIMATION_CONFIG);
|
|
23
26
|
}
|
|
24
27
|
}, [translateY]);
|
|
25
28
|
|
|
@@ -82,8 +82,8 @@ export default function DateTimePicker(props: DateTimePickerProps) {
|
|
|
82
82
|
/>
|
|
83
83
|
)}
|
|
84
84
|
theme={{
|
|
85
|
-
backgroundColor: theme.palette.
|
|
86
|
-
calendarBackground: theme.palette.
|
|
85
|
+
backgroundColor: theme.palette.paper.default,
|
|
86
|
+
calendarBackground: theme.palette.paper.default,
|
|
87
87
|
dayTextColor: theme.palette.text.primary,
|
|
88
88
|
textDisabledColor: theme.palette.text.hint,
|
|
89
89
|
}}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React, { useEffect } from 'react';
|
|
2
2
|
import { StyleSheet, View } from 'react-native';
|
|
3
|
-
import Animated from 'react-native-reanimated';
|
|
3
|
+
import Animated, { useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated';
|
|
4
4
|
import type FlipCardProps from './FlipCardProps';
|
|
5
5
|
|
|
6
6
|
const styles = StyleSheet.create({
|
|
@@ -27,9 +27,9 @@ export default function FlipCard(props: FlipCardProps) {
|
|
|
27
27
|
style,
|
|
28
28
|
} = props;
|
|
29
29
|
|
|
30
|
-
const sharedAngle =
|
|
30
|
+
const sharedAngle = useSharedValue(0);
|
|
31
31
|
|
|
32
|
-
const animatedFrontCardStyle =
|
|
32
|
+
const animatedFrontCardStyle = useAnimatedStyle(() => {
|
|
33
33
|
return {
|
|
34
34
|
zIndex: sharedAngle.value < Z_INDEX_CHANGE_ANGLE ? 2 : 1,
|
|
35
35
|
transform: [
|
|
@@ -37,9 +37,9 @@ export default function FlipCard(props: FlipCardProps) {
|
|
|
37
37
|
{ rotateX: `${sharedAngle.value}deg` },
|
|
38
38
|
],
|
|
39
39
|
};
|
|
40
|
-
});
|
|
40
|
+
}, []);
|
|
41
41
|
|
|
42
|
-
const animatedBackCardStyle =
|
|
42
|
+
const animatedBackCardStyle = useAnimatedStyle(() => {
|
|
43
43
|
return {
|
|
44
44
|
zIndex: sharedAngle.value <= Z_INDEX_CHANGE_ANGLE ? 1 : 2,
|
|
45
45
|
transform: [
|
|
@@ -47,11 +47,11 @@ export default function FlipCard(props: FlipCardProps) {
|
|
|
47
47
|
{ rotateX: `${(sharedAngle.value + 180)}deg` },
|
|
48
48
|
],
|
|
49
49
|
};
|
|
50
|
-
});
|
|
50
|
+
}, []);
|
|
51
51
|
|
|
52
52
|
useEffect(() => {
|
|
53
53
|
sharedAngle.value = 0;
|
|
54
|
-
sharedAngle.value =
|
|
54
|
+
sharedAngle.value = withTiming(180, { duration: 500 });
|
|
55
55
|
}, [reanimationKey]);
|
|
56
56
|
|
|
57
57
|
return (
|
|
@@ -65,4 +65,4 @@ export default function FlipCard(props: FlipCardProps) {
|
|
|
65
65
|
</Animated.View>
|
|
66
66
|
</View>
|
|
67
67
|
);
|
|
68
|
-
};
|
|
68
|
+
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import
|
|
1
|
+
import React, { useCallback, useEffect, useRef } from 'react';
|
|
2
|
+
import type { ViewPagerOnPageSelectedEvent } from 'react-native-pager-view';
|
|
3
|
+
import RNViewPager from 'react-native-pager-view';
|
|
3
4
|
import type ViewPagerProps from './ViewPagerProps';
|
|
4
5
|
import {
|
|
5
6
|
defaultEnableNeighborPageRerender,
|
|
@@ -24,8 +25,8 @@ export default function ViewPager(props: ViewPagerProps) {
|
|
|
24
25
|
style,
|
|
25
26
|
} = props;
|
|
26
27
|
|
|
27
|
-
const indexRef =
|
|
28
|
-
const pagerRef =
|
|
28
|
+
const indexRef = useRef<number>(index);
|
|
29
|
+
const pagerRef = useRef<RNViewPager | null>(null);
|
|
29
30
|
|
|
30
31
|
const renderer = usePageRenderer({
|
|
31
32
|
enableVisibleHint,
|
|
@@ -36,7 +37,7 @@ export default function ViewPager(props: ViewPagerProps) {
|
|
|
36
37
|
enableNeighborPageRerender,
|
|
37
38
|
});
|
|
38
39
|
|
|
39
|
-
const handlePageSelected =
|
|
40
|
+
const handlePageSelected = useCallback((e: ViewPagerOnPageSelectedEvent) => {
|
|
40
41
|
indexRef.current = e.nativeEvent.position;
|
|
41
42
|
|
|
42
43
|
if (onChange) {
|
|
@@ -44,10 +45,16 @@ export default function ViewPager(props: ViewPagerProps) {
|
|
|
44
45
|
}
|
|
45
46
|
}, [onChange]);
|
|
46
47
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
pagerRef.current?.setPage(index)
|
|
50
|
-
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
const handleNumber = index !== indexRef.current
|
|
50
|
+
? requestAnimationFrame(() => pagerRef.current?.setPage(index))
|
|
51
|
+
: undefined;
|
|
52
|
+
|
|
53
|
+
return () => {
|
|
54
|
+
if (handleNumber) {
|
|
55
|
+
cancelAnimationFrame(handleNumber);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
51
58
|
}, [index]);
|
|
52
59
|
|
|
53
60
|
return (
|
package/src/hooks/useHeight.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { ViewProps } from 'react-native';
|
|
3
|
-
import
|
|
3
|
+
import { useWorkletCallback } from 'react-native-reanimated';
|
|
4
4
|
|
|
5
5
|
type OnLayoutCallback = ViewProps['onLayout'];
|
|
6
6
|
|
|
7
7
|
export default function useHeight(initialHeight = 0): [number, OnLayoutCallback] {
|
|
8
8
|
const [height, setHeight] = React.useState<number>(initialHeight);
|
|
9
9
|
|
|
10
|
-
const onLayout =
|
|
10
|
+
const onLayout = useWorkletCallback((e) => {
|
|
11
11
|
setHeight(e.nativeEvent.layout.height);
|
|
12
12
|
}, []);
|
|
13
13
|
|
|
@@ -1,6 +1,13 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { useRef } from 'react';
|
|
2
2
|
import { Falsy, Platform, RegisteredStyle, ScrollViewProps, ViewProps, ViewStyle } from 'react-native';
|
|
3
|
-
import
|
|
3
|
+
import type { SharedValue } from 'react-native-reanimated';
|
|
4
|
+
import {
|
|
5
|
+
useAnimatedScrollHandler,
|
|
6
|
+
useAnimatedStyle,
|
|
7
|
+
useDerivedValue,
|
|
8
|
+
useSharedValue,
|
|
9
|
+
withTiming,
|
|
10
|
+
} from 'react-native-reanimated';
|
|
4
11
|
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
5
12
|
import useAppbarStyles from './useAppbarStyles';
|
|
6
13
|
import useElevationStyle from './useElevationStyle';
|
|
@@ -22,13 +29,12 @@ export interface ContentInsets {
|
|
|
22
29
|
}
|
|
23
30
|
|
|
24
31
|
export interface Options {
|
|
25
|
-
translucent?: boolean;
|
|
26
32
|
shouldTranslateYReset?: boolean;
|
|
27
33
|
}
|
|
28
34
|
|
|
29
35
|
export interface CollapsibleAppBar {
|
|
30
36
|
appBarStyle: ViewStyleProp;
|
|
31
|
-
vectorY:
|
|
37
|
+
vectorY: SharedValue<number>;
|
|
32
38
|
onAppBarLayout: OnLayoutCallback;
|
|
33
39
|
onCollapsibleToolbarLayout: OnLayoutCallback;
|
|
34
40
|
onScroll: OnScroll;
|
|
@@ -37,7 +43,6 @@ export interface CollapsibleAppBar {
|
|
|
37
43
|
}
|
|
38
44
|
|
|
39
45
|
const defaultOptions: Required<Options> = {
|
|
40
|
-
translucent: false,
|
|
41
46
|
shouldTranslateYReset: false,
|
|
42
47
|
};
|
|
43
48
|
|
|
@@ -45,7 +50,6 @@ const ANIMATION_DURATION_MILLIS = 100;
|
|
|
45
50
|
|
|
46
51
|
const SUPPORTS_DRAG_DETECTION = Platform.OS !== 'web';
|
|
47
52
|
|
|
48
|
-
|
|
49
53
|
function useLargerValueOfLastTwoValues(value: number) {
|
|
50
54
|
const refLatestTwoValues = useRef([0, 0]);
|
|
51
55
|
|
|
@@ -55,12 +59,8 @@ function useLargerValueOfLastTwoValues(value: number) {
|
|
|
55
59
|
return Math.max(...refLatestTwoValues.current);
|
|
56
60
|
}
|
|
57
61
|
|
|
58
|
-
|
|
59
62
|
export default function useUnstableCollapsibleAppBar(userOptions: Options = defaultOptions): CollapsibleAppBar {
|
|
60
|
-
const {
|
|
61
|
-
translucent,
|
|
62
|
-
shouldTranslateYReset,
|
|
63
|
-
}: Required<Options> = {
|
|
63
|
+
const { shouldTranslateYReset }: Required<Options> = {
|
|
64
64
|
...defaultOptions,
|
|
65
65
|
...userOptions,
|
|
66
66
|
};
|
|
@@ -73,38 +73,55 @@ export default function useUnstableCollapsibleAppBar(userOptions: Options = defa
|
|
|
73
73
|
const appBarMaxHeight = useLargerValueOfLastTwoValues(appBarHeight);
|
|
74
74
|
const [collapsibleToolbarHeight, onCollapsibleToolbarLayout] = useHeight();
|
|
75
75
|
|
|
76
|
-
const maxTranslateY =
|
|
76
|
+
const maxTranslateY = useDerivedValue(() => -collapsibleToolbarHeight, [collapsibleToolbarHeight]);
|
|
77
77
|
|
|
78
|
-
const translateY =
|
|
79
|
-
const lastTranslateY =
|
|
80
|
-
const lastOffsetY =
|
|
81
|
-
const prevOffsetY =
|
|
82
|
-
const overlapped =
|
|
83
|
-
const vectorY =
|
|
78
|
+
const translateY = useSharedValue<number>(0);
|
|
79
|
+
const lastTranslateY = useSharedValue<number>(0);
|
|
80
|
+
const lastOffsetY = useSharedValue<number>(0);
|
|
81
|
+
const prevOffsetY = useSharedValue<number>(0);
|
|
82
|
+
const overlapped = useSharedValue<boolean>(false);
|
|
83
|
+
const vectorY = useSharedValue<number>(0);
|
|
84
84
|
|
|
85
85
|
const elevationStyle = useElevationStyle(4);
|
|
86
|
-
const animatedStyle =
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
86
|
+
const animatedStyle = useAnimatedStyle(() => {
|
|
87
|
+
const transform = [{ translateY: translateY.value }];
|
|
88
|
+
|
|
89
|
+
if (Platform.OS === 'web') {
|
|
90
|
+
return {
|
|
91
|
+
transform,
|
|
92
|
+
boxShadow: overlapped.value ? elevationStyle?.boxShadow : 0,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
if (Platform.OS === 'android') {
|
|
96
|
+
return {
|
|
97
|
+
transform,
|
|
98
|
+
elevation: overlapped.value ? elevationStyle?.elevation : 0,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
if (Platform.OS === 'ios') {
|
|
102
|
+
return {
|
|
103
|
+
transform,
|
|
104
|
+
shadowColor: elevationStyle?.shadowColor,
|
|
105
|
+
shadowOffset: elevationStyle?.shadowOffset,
|
|
106
|
+
shadowRadius: elevationStyle?.shadowRadius,
|
|
107
|
+
shadowOpacity: overlapped.value ? elevationStyle?.shadowOpacity : 0,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
return {};
|
|
111
|
+
}, [
|
|
112
|
+
/**
|
|
113
|
+
* FIXME: Consider add `elevationStyle` to dependencies.
|
|
114
|
+
*/
|
|
115
|
+
]);
|
|
116
|
+
|
|
117
|
+
const indexRef = useRef<number>(0);
|
|
118
|
+
const offsetsRef = useRef<Array<number>>([]);
|
|
102
119
|
|
|
103
120
|
const onScrollViewChanged = (nextIndex: number) => {
|
|
104
121
|
const prevIndex = indexRef.current;
|
|
105
122
|
if (prevIndex === nextIndex) {
|
|
106
123
|
if (shouldTranslateYReset) {
|
|
107
|
-
translateY.value =
|
|
124
|
+
translateY.value = withTiming(0, {
|
|
108
125
|
duration: ANIMATION_DURATION_MILLIS,
|
|
109
126
|
});
|
|
110
127
|
|
|
@@ -128,7 +145,7 @@ export default function useUnstableCollapsibleAppBar(userOptions: Options = defa
|
|
|
128
145
|
|
|
129
146
|
// If next ScrollView's offset is too short, expand app bar.
|
|
130
147
|
if (translateY.value < 0 && savedOffsetY < appBarHeight) {
|
|
131
|
-
translateY.value =
|
|
148
|
+
translateY.value = withTiming(0, {
|
|
132
149
|
duration: ANIMATION_DURATION_MILLIS,
|
|
133
150
|
});
|
|
134
151
|
|
|
@@ -136,7 +153,7 @@ export default function useUnstableCollapsibleAppBar(userOptions: Options = defa
|
|
|
136
153
|
}
|
|
137
154
|
};
|
|
138
155
|
|
|
139
|
-
const scrollHandler =
|
|
156
|
+
const scrollHandler = useAnimatedScrollHandler({
|
|
140
157
|
onBeginDrag: () => {
|
|
141
158
|
lastTranslateY.value = translateY.value;
|
|
142
159
|
},
|
|
@@ -162,13 +179,13 @@ export default function useUnstableCollapsibleAppBar(userOptions: Options = defa
|
|
|
162
179
|
} else {
|
|
163
180
|
if (offsetY > -maxTy) {
|
|
164
181
|
if (ty === 0) {
|
|
165
|
-
translateY.value =
|
|
182
|
+
translateY.value = withTiming(Math.min(Math.max(-offsetY, maxTy), 0), {
|
|
166
183
|
duration: ANIMATION_DURATION_MILLIS,
|
|
167
184
|
});
|
|
168
185
|
}
|
|
169
186
|
} else {
|
|
170
187
|
if (ty === maxTy) {
|
|
171
|
-
translateY.value =
|
|
188
|
+
translateY.value = withTiming(0, {
|
|
172
189
|
duration: ANIMATION_DURATION_MILLIS,
|
|
173
190
|
});
|
|
174
191
|
}
|
|
@@ -201,17 +218,17 @@ export default function useUnstableCollapsibleAppBar(userOptions: Options = defa
|
|
|
201
218
|
|
|
202
219
|
overlapped.value = offsetY + nextTranslateY > 0;
|
|
203
220
|
|
|
204
|
-
translateY.value =
|
|
221
|
+
translateY.value = withTiming(nextTranslateY, {
|
|
205
222
|
duration: ANIMATION_DURATION_MILLIS,
|
|
206
223
|
});
|
|
207
224
|
},
|
|
208
|
-
});
|
|
225
|
+
}, []);
|
|
209
226
|
|
|
210
227
|
const hasCollapsible = collapsibleToolbarHeight > 0;
|
|
211
228
|
|
|
212
229
|
const appBarStyle = [
|
|
213
230
|
animatedStyle,
|
|
214
|
-
|
|
231
|
+
{ paddingTop: safeAreaInsets.top },
|
|
215
232
|
hasCollapsible ? styles.floating : undefined,
|
|
216
233
|
];
|
|
217
234
|
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import
|
|
1
|
+
import type { SharedValue } from 'react-native-reanimated';
|
|
2
|
+
import { useAnimatedReaction, useAnimatedStyle, useSharedValue } from 'react-native-reanimated';
|
|
2
3
|
|
|
3
4
|
export default function useAnimatedDisplayStyle(
|
|
4
|
-
vectorY:
|
|
5
|
+
vectorY: SharedValue<number>,
|
|
5
6
|
threshold: number = 200,
|
|
6
7
|
defaultDisplay: 'flex' | 'none' = 'flex',
|
|
7
8
|
) {
|
|
8
|
-
const display =
|
|
9
|
+
const display = useSharedValue(defaultDisplay);
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
useAnimatedReaction(
|
|
11
12
|
() => vectorY.value,
|
|
12
13
|
(vy) => {
|
|
13
14
|
if (vy >= threshold) {
|
|
@@ -16,9 +17,10 @@ export default function useAnimatedDisplayStyle(
|
|
|
16
17
|
display.value = 'flex';
|
|
17
18
|
}
|
|
18
19
|
},
|
|
20
|
+
[threshold],
|
|
19
21
|
);
|
|
20
22
|
|
|
21
|
-
return
|
|
23
|
+
return useAnimatedStyle(() => ({
|
|
22
24
|
display: display.value,
|
|
23
|
-
}));
|
|
25
|
+
}), []);
|
|
24
26
|
};
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = useWidth;
|
|
7
|
-
|
|
8
|
-
var _react = _interopRequireDefault(require("react"));
|
|
9
|
-
|
|
10
|
-
var _reactNative = require("react-native");
|
|
11
|
-
|
|
12
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
-
|
|
14
|
-
function useWidth() {
|
|
15
|
-
const window = (0, _reactNative.useWindowDimensions)();
|
|
16
|
-
|
|
17
|
-
const [width, setWidth] = _react.default.useState(window.width);
|
|
18
|
-
|
|
19
|
-
const onLayout = _react.default.useCallback(e => {
|
|
20
|
-
const newWidth = e.nativeEvent.layout.width;
|
|
21
|
-
|
|
22
|
-
if (newWidth > 0 && Math.round(newWidth) !== Math.round(width)) {
|
|
23
|
-
setWidth(newWidth);
|
|
24
|
-
}
|
|
25
|
-
}, []);
|
|
26
|
-
|
|
27
|
-
return [width, onLayout];
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=useWidth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["useWidth.ts"],"names":["useWidth","window","width","setWidth","React","useState","onLayout","useCallback","e","newWidth","nativeEvent","layout","Math","round"],"mappings":";;;;;;;AAAA;;AACA;;;;AAEe,SAASA,QAAT,GAAqD;AAChE,QAAMC,MAAM,GAAG,uCAAf;;AACA,QAAM,CAACC,KAAD,EAAQC,QAAR,IAAoBC,eAAMC,QAAN,CAAeJ,MAAM,CAACC,KAAtB,CAA1B;;AAEA,QAAMI,QAAQ,GAAGF,eAAMG,WAAN,CAAmBC,CAAD,IAA0B;AACzD,UAAMC,QAAQ,GAAGD,CAAC,CAACE,WAAF,CAAcC,MAAd,CAAqBT,KAAtC;;AAEA,QAAIO,QAAQ,GAAG,CAAX,IAAgBG,IAAI,CAACC,KAAL,CAAWJ,QAAX,MAAyBG,IAAI,CAACC,KAAL,CAAWX,KAAX,CAA7C,EAAgE;AAC5DC,MAAAA,QAAQ,CAACM,QAAD,CAAR;AACH;AACJ,GANgB,EAMd,EANc,CAAjB;;AAQA,SAAO,CAACP,KAAD,EAAQI,QAAR,CAAP;AACH","sourcesContent":["import React from 'react';\nimport { LayoutChangeEvent, useWindowDimensions, ViewProps } from 'react-native';\n\nexport default function useWidth(): [number, ViewProps['onLayout']] {\n const window = useWindowDimensions();\n const [width, setWidth] = React.useState(window.width);\n\n const onLayout = React.useCallback((e: LayoutChangeEvent) => {\n const newWidth = e.nativeEvent.layout.width;\n\n if (newWidth > 0 && Math.round(newWidth) !== Math.round(width)) {\n setWidth(newWidth);\n }\n }, []);\n\n return [width, onLayout];\n}"]}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { useWindowDimensions } from 'react-native';
|
|
3
|
-
export default function useWidth() {
|
|
4
|
-
const window = useWindowDimensions();
|
|
5
|
-
const [width, setWidth] = React.useState(window.width);
|
|
6
|
-
const onLayout = React.useCallback(e => {
|
|
7
|
-
const newWidth = e.nativeEvent.layout.width;
|
|
8
|
-
|
|
9
|
-
if (newWidth > 0 && Math.round(newWidth) !== Math.round(width)) {
|
|
10
|
-
setWidth(newWidth);
|
|
11
|
-
}
|
|
12
|
-
}, []);
|
|
13
|
-
return [width, onLayout];
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=useWidth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["useWidth.ts"],"names":["React","useWindowDimensions","useWidth","window","width","setWidth","useState","onLayout","useCallback","e","newWidth","nativeEvent","layout","Math","round"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAA4BC,mBAA5B,QAAkE,cAAlE;AAEA,eAAe,SAASC,QAAT,GAAqD;AAChE,QAAMC,MAAM,GAAGF,mBAAmB,EAAlC;AACA,QAAM,CAACG,KAAD,EAAQC,QAAR,IAAoBL,KAAK,CAACM,QAAN,CAAeH,MAAM,CAACC,KAAtB,CAA1B;AAEA,QAAMG,QAAQ,GAAGP,KAAK,CAACQ,WAAN,CAAmBC,CAAD,IAA0B;AACzD,UAAMC,QAAQ,GAAGD,CAAC,CAACE,WAAF,CAAcC,MAAd,CAAqBR,KAAtC;;AAEA,QAAIM,QAAQ,GAAG,CAAX,IAAgBG,IAAI,CAACC,KAAL,CAAWJ,QAAX,MAAyBG,IAAI,CAACC,KAAL,CAAWV,KAAX,CAA7C,EAAgE;AAC5DC,MAAAA,QAAQ,CAACK,QAAD,CAAR;AACH;AACJ,GANgB,EAMd,EANc,CAAjB;AAQA,SAAO,CAACN,KAAD,EAAQG,QAAR,CAAP;AACH","sourcesContent":["import React from 'react';\nimport { LayoutChangeEvent, useWindowDimensions, ViewProps } from 'react-native';\n\nexport default function useWidth(): [number, ViewProps['onLayout']] {\n const window = useWindowDimensions();\n const [width, setWidth] = React.useState(window.width);\n\n const onLayout = React.useCallback((e: LayoutChangeEvent) => {\n const newWidth = e.nativeEvent.layout.width;\n\n if (newWidth > 0 && Math.round(newWidth) !== Math.round(width)) {\n setWidth(newWidth);\n }\n }, []);\n\n return [width, onLayout];\n}"]}
|
package/src/hooks/useWidth.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { LayoutChangeEvent, useWindowDimensions, ViewProps } from 'react-native';
|
|
3
|
-
|
|
4
|
-
export default function useWidth(): [number, ViewProps['onLayout']] {
|
|
5
|
-
const window = useWindowDimensions();
|
|
6
|
-
const [width, setWidth] = React.useState(window.width);
|
|
7
|
-
|
|
8
|
-
const onLayout = React.useCallback((e: LayoutChangeEvent) => {
|
|
9
|
-
const newWidth = e.nativeEvent.layout.width;
|
|
10
|
-
|
|
11
|
-
if (newWidth > 0 && Math.round(newWidth) !== Math.round(width)) {
|
|
12
|
-
setWidth(newWidth);
|
|
13
|
-
}
|
|
14
|
-
}, []);
|
|
15
|
-
|
|
16
|
-
return [width, onLayout];
|
|
17
|
-
}
|