@lodev09/react-native-true-sheet 3.1.1 → 3.2.1
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/lib/module/navigation/TrueSheetRouter.js +12 -18
- package/lib/module/navigation/TrueSheetRouter.js.map +1 -1
- package/lib/module/navigation/TrueSheetView.js +30 -128
- package/lib/module/navigation/TrueSheetView.js.map +1 -1
- package/lib/module/navigation/createTrueSheetNavigator.js +3 -3
- package/lib/module/navigation/createTrueSheetNavigator.js.map +1 -1
- package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js +56 -0
- package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js.map +1 -0
- package/lib/module/navigation/screen/TrueSheetScreen.js +49 -0
- package/lib/module/navigation/screen/TrueSheetScreen.js.map +1 -0
- package/lib/module/navigation/screen/index.js +5 -0
- package/lib/module/navigation/screen/index.js.map +1 -0
- package/lib/module/navigation/screen/types.js +4 -0
- package/lib/module/navigation/screen/types.js.map +1 -0
- package/lib/module/navigation/screen/useSheetScreenState.js +77 -0
- package/lib/module/navigation/screen/useSheetScreenState.js.map +1 -0
- package/lib/module/navigation/useTrueSheetNavigation.js +1 -3
- package/lib/module/navigation/useTrueSheetNavigation.js.map +1 -1
- package/lib/typescript/src/navigation/TrueSheetRouter.d.ts +4 -4
- package/lib/typescript/src/navigation/TrueSheetRouter.d.ts.map +1 -1
- package/lib/typescript/src/navigation/TrueSheetView.d.ts +1 -1
- package/lib/typescript/src/navigation/TrueSheetView.d.ts.map +1 -1
- package/lib/typescript/src/navigation/createTrueSheetNavigator.d.ts +1 -1
- package/lib/typescript/src/navigation/createTrueSheetNavigator.d.ts.map +1 -1
- package/lib/typescript/src/navigation/screen/ReanimatedTrueSheetScreen.d.ts +3 -0
- package/lib/typescript/src/navigation/screen/ReanimatedTrueSheetScreen.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen/TrueSheetScreen.d.ts +3 -0
- package/lib/typescript/src/navigation/screen/TrueSheetScreen.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen/index.d.ts +4 -0
- package/lib/typescript/src/navigation/screen/index.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen/types.d.ts +17 -0
- package/lib/typescript/src/navigation/screen/types.d.ts.map +1 -0
- package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts +35 -0
- package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts.map +1 -0
- package/lib/typescript/src/navigation/types.d.ts +27 -0
- package/lib/typescript/src/navigation/types.d.ts.map +1 -1
- package/lib/typescript/src/navigation/useTrueSheetNavigation.d.ts +1 -1
- package/lib/typescript/src/navigation/useTrueSheetNavigation.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/navigation/TrueSheetRouter.ts +6 -12
- package/src/navigation/TrueSheetView.tsx +40 -212
- package/src/navigation/createTrueSheetNavigator.tsx +3 -3
- package/src/navigation/screen/ReanimatedTrueSheetScreen.tsx +61 -0
- package/src/navigation/screen/TrueSheetScreen.tsx +54 -0
- package/src/navigation/screen/index.ts +3 -0
- package/src/navigation/screen/types.ts +19 -0
- package/src/navigation/screen/useSheetScreenState.ts +106 -0
- package/src/navigation/types.ts +29 -0
- package/src/navigation/useTrueSheetNavigation.ts +2 -4
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { useEffect, useRef } from 'react';
|
|
2
|
+
|
|
3
|
+
import { TrueSheet } from '../../TrueSheet';
|
|
4
|
+
import type {
|
|
5
|
+
DetentChangeEvent,
|
|
6
|
+
DetentInfoEventPayload,
|
|
7
|
+
DidBlurEvent,
|
|
8
|
+
DidFocusEvent,
|
|
9
|
+
DidPresentEvent,
|
|
10
|
+
DragBeginEvent,
|
|
11
|
+
DragChangeEvent,
|
|
12
|
+
DragEndEvent,
|
|
13
|
+
PositionChangeEvent,
|
|
14
|
+
PositionChangeEventPayload,
|
|
15
|
+
WillBlurEvent,
|
|
16
|
+
WillDismissEvent,
|
|
17
|
+
WillFocusEvent,
|
|
18
|
+
WillPresentEvent,
|
|
19
|
+
} from '../../TrueSheet.types';
|
|
20
|
+
import type {
|
|
21
|
+
TrueSheetNavigationEventMap,
|
|
22
|
+
TrueSheetNavigationHelpers,
|
|
23
|
+
TrueSheetNavigationProp,
|
|
24
|
+
} from '../types';
|
|
25
|
+
import { TrueSheetActions } from '../TrueSheetRouter';
|
|
26
|
+
import type { ParamListBase } from '@react-navigation/native';
|
|
27
|
+
|
|
28
|
+
type EmitFn = TrueSheetNavigationHelpers['emit'];
|
|
29
|
+
|
|
30
|
+
interface UseSheetScreenStateProps {
|
|
31
|
+
detentIndex: number;
|
|
32
|
+
resizeKey?: number;
|
|
33
|
+
closing?: boolean;
|
|
34
|
+
navigation: TrueSheetNavigationProp<ParamListBase>;
|
|
35
|
+
routeKey: string;
|
|
36
|
+
emit: EmitFn;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export const useSheetScreenState = (props: UseSheetScreenStateProps) => {
|
|
40
|
+
const { detentIndex, resizeKey, closing, navigation, routeKey, emit } = props;
|
|
41
|
+
|
|
42
|
+
const ref = useRef<TrueSheet>(null);
|
|
43
|
+
const isDismissedRef = useRef(false);
|
|
44
|
+
const isFirstRenderRef = useRef(true);
|
|
45
|
+
const initialDetentIndexRef = useRef(detentIndex);
|
|
46
|
+
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
if (closing && !isDismissedRef.current) {
|
|
49
|
+
isDismissedRef.current = true;
|
|
50
|
+
(async () => {
|
|
51
|
+
await ref.current?.dismiss();
|
|
52
|
+
navigation.dispatch({ ...TrueSheetActions.remove(), source: routeKey });
|
|
53
|
+
})();
|
|
54
|
+
} else if (closing && isDismissedRef.current) {
|
|
55
|
+
navigation.dispatch({ ...TrueSheetActions.remove(), source: routeKey });
|
|
56
|
+
}
|
|
57
|
+
}, [closing, navigation, routeKey]);
|
|
58
|
+
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
if (isFirstRenderRef.current) {
|
|
61
|
+
isFirstRenderRef.current = false;
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
ref.current?.resize(detentIndex);
|
|
65
|
+
}, [detentIndex, resizeKey]);
|
|
66
|
+
|
|
67
|
+
const emitEvent = (
|
|
68
|
+
type: keyof TrueSheetNavigationEventMap,
|
|
69
|
+
data: DetentInfoEventPayload | PositionChangeEventPayload | undefined
|
|
70
|
+
) => {
|
|
71
|
+
emit({
|
|
72
|
+
type,
|
|
73
|
+
target: routeKey,
|
|
74
|
+
data,
|
|
75
|
+
} as Parameters<EmitFn>[0]);
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
const onDidDismiss = () => {
|
|
79
|
+
emitEvent('sheetDidDismiss', undefined);
|
|
80
|
+
if (!isDismissedRef.current) {
|
|
81
|
+
isDismissedRef.current = true;
|
|
82
|
+
navigation.goBack();
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
return {
|
|
87
|
+
ref,
|
|
88
|
+
initialDetentIndex: initialDetentIndexRef.current,
|
|
89
|
+
emitEvent,
|
|
90
|
+
eventHandlers: {
|
|
91
|
+
onWillPresent: (e: WillPresentEvent) => emitEvent('sheetWillPresent', e.nativeEvent),
|
|
92
|
+
onDidPresent: (e: DidPresentEvent) => emitEvent('sheetDidPresent', e.nativeEvent),
|
|
93
|
+
onWillDismiss: (_e: WillDismissEvent) => emitEvent('sheetWillDismiss', undefined),
|
|
94
|
+
onDidDismiss,
|
|
95
|
+
onDetentChange: (e: DetentChangeEvent) => emitEvent('sheetDetentChange', e.nativeEvent),
|
|
96
|
+
onDragBegin: (e: DragBeginEvent) => emitEvent('sheetDragBegin', e.nativeEvent),
|
|
97
|
+
onDragChange: (e: DragChangeEvent) => emitEvent('sheetDragChange', e.nativeEvent),
|
|
98
|
+
onDragEnd: (e: DragEndEvent) => emitEvent('sheetDragEnd', e.nativeEvent),
|
|
99
|
+
onPositionChange: (e: PositionChangeEvent) => emitEvent('sheetPositionChange', e.nativeEvent),
|
|
100
|
+
onWillFocus: (_e: WillFocusEvent) => emitEvent('sheetWillFocus', undefined),
|
|
101
|
+
onDidFocus: (_e: DidFocusEvent) => emitEvent('sheetDidFocus', undefined),
|
|
102
|
+
onWillBlur: (_e: WillBlurEvent) => emitEvent('sheetWillBlur', undefined),
|
|
103
|
+
onDidBlur: (_e: DidBlurEvent) => emitEvent('sheetDidBlur', undefined),
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
};
|
package/src/navigation/types.ts
CHANGED
|
@@ -14,6 +14,7 @@ import type {
|
|
|
14
14
|
PositionChangeEventPayload,
|
|
15
15
|
TrueSheetProps,
|
|
16
16
|
} from '../TrueSheet.types';
|
|
17
|
+
import type { PositionChangeHandler } from './screen/types';
|
|
17
18
|
|
|
18
19
|
export type TrueSheetNavigationEventMap = {
|
|
19
20
|
/**
|
|
@@ -147,6 +148,34 @@ export type TrueSheetNavigationOptions = Pick<
|
|
|
147
148
|
* @default 0
|
|
148
149
|
*/
|
|
149
150
|
detentIndex?: number;
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Use ReanimatedTrueSheet for this screen.
|
|
154
|
+
* Enables worklet-based `onPositionChange` events.
|
|
155
|
+
*
|
|
156
|
+
* @default false
|
|
157
|
+
*/
|
|
158
|
+
reanimated?: boolean;
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* A callback that receives position change events.
|
|
162
|
+
* When `reanimated` is enabled, this must be a worklet function.
|
|
163
|
+
*
|
|
164
|
+
* @example
|
|
165
|
+
* ```tsx
|
|
166
|
+
* <Navigator.Screen
|
|
167
|
+
* name="Sheet"
|
|
168
|
+
* options={{
|
|
169
|
+
* reanimated: true,
|
|
170
|
+
* positionChangeHandler: (payload) => {
|
|
171
|
+
* 'worklet';
|
|
172
|
+
* animatedValue.value = payload.position;
|
|
173
|
+
* },
|
|
174
|
+
* }}
|
|
175
|
+
* />
|
|
176
|
+
* ```
|
|
177
|
+
*/
|
|
178
|
+
positionChangeHandler?: PositionChangeHandler;
|
|
150
179
|
};
|
|
151
180
|
|
|
152
181
|
export type TrueSheetNavigatorProps = DefaultNavigatorOptions<
|
|
@@ -21,8 +21,6 @@ import type { TrueSheetNavigationProp } from './types';
|
|
|
21
21
|
* }
|
|
22
22
|
* ```
|
|
23
23
|
*/
|
|
24
|
-
export
|
|
24
|
+
export const useTrueSheetNavigation = <
|
|
25
25
|
T extends ParamListBase = ParamListBase,
|
|
26
|
-
>(): TrueSheetNavigationProp<T>
|
|
27
|
-
return useNavigation<TrueSheetNavigationProp<T>>();
|
|
28
|
-
}
|
|
26
|
+
>(): TrueSheetNavigationProp<T> => useNavigation<TrueSheetNavigationProp<T>>();
|