-
-
Notifications
You must be signed in to change notification settings - Fork 957
Expand file tree
/
Copy pathuseNormalizedSnapPoints.ts
More file actions
72 lines (64 loc) · 2.35 KB
/
Copy pathuseNormalizedSnapPoints.ts
File metadata and controls
72 lines (64 loc) · 2.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import Animated, { useDerivedValue } from 'react-native-reanimated';
import { normalizeSnapPoint } from '../utilities';
import type { BottomSheetProps } from '../components/bottomSheet';
import {
INITIAL_CONTAINER_HEIGHT,
INITIAL_HANDLE_HEIGHT,
INITIAL_SNAP_POINT,
} from '../components/bottomSheet/constants';
/**
* Convert percentage snap points to pixels in screen and calculate
* the accurate snap points positions.
* @param snapPoints provided snap points.
* @param containerHeight BottomSheetContainer height.
* @param contentHeight content size.
* @param handleHeight handle size.
* @param enableDynamicSizing
* @param maxDynamicContentSize
* @returns {Animated.SharedValue<number[]>}
*/
export const useNormalizedSnapPoints = (
snapPoints: BottomSheetProps['snapPoints'],
containerHeight: Animated.SharedValue<number>,
contentHeight: Animated.SharedValue<number>,
handleHeight: Animated.SharedValue<number>,
enableDynamicSizing: BottomSheetProps['enableDynamicSizing'],
maxDynamicContentSize: BottomSheetProps['maxDynamicContentSize']
) => {
const normalizedSnapPoints = useDerivedValue(() => {
const _snapPoints = snapPoints
? 'value' in snapPoints
? snapPoints.value
: snapPoints
: [];
// early exit, if container layout is not ready
const isContainerLayoutReady =
containerHeight.value !== INITIAL_CONTAINER_HEIGHT;
if (!isContainerLayoutReady) {
return new Array(_snapPoints.length || 1).fill(INITIAL_SNAP_POINT);
}
let _normalizedSnapPoints = _snapPoints.map(snapPoint =>
normalizeSnapPoint(snapPoint, containerHeight.value)
) as number[];
if (enableDynamicSizing) {
if (handleHeight.value === INITIAL_HANDLE_HEIGHT) {
return [INITIAL_SNAP_POINT];
}
if (contentHeight.value === INITIAL_CONTAINER_HEIGHT) {
return [INITIAL_SNAP_POINT];
}
_normalizedSnapPoints.push(
containerHeight.value -
Math.min(
contentHeight.value + handleHeight.value,
maxDynamicContentSize !== undefined
? maxDynamicContentSize
: containerHeight.value
)
);
_normalizedSnapPoints = _normalizedSnapPoints.sort((a, b) => b - a);
}
return _normalizedSnapPoints;
}, [snapPoints, enableDynamicSizing, maxDynamicContentSize]);
return normalizedSnapPoints;
};