@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.
Files changed (49) hide show
  1. package/lib/module/navigation/TrueSheetRouter.js +12 -18
  2. package/lib/module/navigation/TrueSheetRouter.js.map +1 -1
  3. package/lib/module/navigation/TrueSheetView.js +30 -128
  4. package/lib/module/navigation/TrueSheetView.js.map +1 -1
  5. package/lib/module/navigation/createTrueSheetNavigator.js +3 -3
  6. package/lib/module/navigation/createTrueSheetNavigator.js.map +1 -1
  7. package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js +56 -0
  8. package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js.map +1 -0
  9. package/lib/module/navigation/screen/TrueSheetScreen.js +49 -0
  10. package/lib/module/navigation/screen/TrueSheetScreen.js.map +1 -0
  11. package/lib/module/navigation/screen/index.js +5 -0
  12. package/lib/module/navigation/screen/index.js.map +1 -0
  13. package/lib/module/navigation/screen/types.js +4 -0
  14. package/lib/module/navigation/screen/types.js.map +1 -0
  15. package/lib/module/navigation/screen/useSheetScreenState.js +77 -0
  16. package/lib/module/navigation/screen/useSheetScreenState.js.map +1 -0
  17. package/lib/module/navigation/useTrueSheetNavigation.js +1 -3
  18. package/lib/module/navigation/useTrueSheetNavigation.js.map +1 -1
  19. package/lib/typescript/src/navigation/TrueSheetRouter.d.ts +4 -4
  20. package/lib/typescript/src/navigation/TrueSheetRouter.d.ts.map +1 -1
  21. package/lib/typescript/src/navigation/TrueSheetView.d.ts +1 -1
  22. package/lib/typescript/src/navigation/TrueSheetView.d.ts.map +1 -1
  23. package/lib/typescript/src/navigation/createTrueSheetNavigator.d.ts +1 -1
  24. package/lib/typescript/src/navigation/createTrueSheetNavigator.d.ts.map +1 -1
  25. package/lib/typescript/src/navigation/screen/ReanimatedTrueSheetScreen.d.ts +3 -0
  26. package/lib/typescript/src/navigation/screen/ReanimatedTrueSheetScreen.d.ts.map +1 -0
  27. package/lib/typescript/src/navigation/screen/TrueSheetScreen.d.ts +3 -0
  28. package/lib/typescript/src/navigation/screen/TrueSheetScreen.d.ts.map +1 -0
  29. package/lib/typescript/src/navigation/screen/index.d.ts +4 -0
  30. package/lib/typescript/src/navigation/screen/index.d.ts.map +1 -0
  31. package/lib/typescript/src/navigation/screen/types.d.ts +17 -0
  32. package/lib/typescript/src/navigation/screen/types.d.ts.map +1 -0
  33. package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts +35 -0
  34. package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts.map +1 -0
  35. package/lib/typescript/src/navigation/types.d.ts +27 -0
  36. package/lib/typescript/src/navigation/types.d.ts.map +1 -1
  37. package/lib/typescript/src/navigation/useTrueSheetNavigation.d.ts +1 -1
  38. package/lib/typescript/src/navigation/useTrueSheetNavigation.d.ts.map +1 -1
  39. package/package.json +1 -1
  40. package/src/navigation/TrueSheetRouter.ts +6 -12
  41. package/src/navigation/TrueSheetView.tsx +40 -212
  42. package/src/navigation/createTrueSheetNavigator.tsx +3 -3
  43. package/src/navigation/screen/ReanimatedTrueSheetScreen.tsx +61 -0
  44. package/src/navigation/screen/TrueSheetScreen.tsx +54 -0
  45. package/src/navigation/screen/index.ts +3 -0
  46. package/src/navigation/screen/types.ts +19 -0
  47. package/src/navigation/screen/useSheetScreenState.ts +106 -0
  48. package/src/navigation/types.ts +29 -0
  49. 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
+ };
@@ -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 function useTrueSheetNavigation<
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>>();