@lodev09/react-native-true-sheet 3.1.0 → 3.2.0

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 (69) hide show
  1. package/android/src/main/java/com/lodev09/truesheet/TrueSheetView.kt +5 -1
  2. package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewController.kt +103 -118
  3. package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewManager.kt +7 -2
  4. package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDialogObserver.kt +2 -2
  5. package/android/src/main/java/com/lodev09/truesheet/utils/ScreenUtils.kt +64 -81
  6. package/android/src/main/res/values/styles.xml +1 -0
  7. package/ios/TrueSheetView.mm +20 -3
  8. package/ios/TrueSheetViewController.h +2 -0
  9. package/ios/TrueSheetViewController.mm +36 -18
  10. package/lib/module/TrueSheet.js +3 -1
  11. package/lib/module/TrueSheet.js.map +1 -1
  12. package/lib/module/fabric/TrueSheetViewNativeComponent.ts +5 -2
  13. package/lib/module/navigation/TrueSheetRouter.js +12 -18
  14. package/lib/module/navigation/TrueSheetRouter.js.map +1 -1
  15. package/lib/module/navigation/TrueSheetView.js +29 -128
  16. package/lib/module/navigation/TrueSheetView.js.map +1 -1
  17. package/lib/module/navigation/createTrueSheetNavigator.js +3 -3
  18. package/lib/module/navigation/createTrueSheetNavigator.js.map +1 -1
  19. package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js +46 -0
  20. package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js.map +1 -0
  21. package/lib/module/navigation/screen/TrueSheetScreen.js +39 -0
  22. package/lib/module/navigation/screen/TrueSheetScreen.js.map +1 -0
  23. package/lib/module/navigation/screen/index.js +5 -0
  24. package/lib/module/navigation/screen/index.js.map +1 -0
  25. package/lib/module/navigation/screen/types.js +4 -0
  26. package/lib/module/navigation/screen/types.js.map +1 -0
  27. package/lib/module/navigation/screen/useSheetScreenState.js +77 -0
  28. package/lib/module/navigation/screen/useSheetScreenState.js.map +1 -0
  29. package/lib/module/navigation/useTrueSheetNavigation.js +1 -3
  30. package/lib/module/navigation/useTrueSheetNavigation.js.map +1 -1
  31. package/lib/typescript/src/TrueSheet.d.ts.map +1 -1
  32. package/lib/typescript/src/TrueSheet.types.d.ts +24 -0
  33. package/lib/typescript/src/TrueSheet.types.d.ts.map +1 -1
  34. package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts +3 -2
  35. package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts.map +1 -1
  36. package/lib/typescript/src/navigation/TrueSheetRouter.d.ts +4 -4
  37. package/lib/typescript/src/navigation/TrueSheetRouter.d.ts.map +1 -1
  38. package/lib/typescript/src/navigation/TrueSheetView.d.ts +1 -1
  39. package/lib/typescript/src/navigation/TrueSheetView.d.ts.map +1 -1
  40. package/lib/typescript/src/navigation/createTrueSheetNavigator.d.ts +1 -1
  41. package/lib/typescript/src/navigation/createTrueSheetNavigator.d.ts.map +1 -1
  42. package/lib/typescript/src/navigation/screen/ReanimatedTrueSheetScreen.d.ts +3 -0
  43. package/lib/typescript/src/navigation/screen/ReanimatedTrueSheetScreen.d.ts.map +1 -0
  44. package/lib/typescript/src/navigation/screen/TrueSheetScreen.d.ts +3 -0
  45. package/lib/typescript/src/navigation/screen/TrueSheetScreen.d.ts.map +1 -0
  46. package/lib/typescript/src/navigation/screen/index.d.ts +4 -0
  47. package/lib/typescript/src/navigation/screen/index.d.ts.map +1 -0
  48. package/lib/typescript/src/navigation/screen/types.d.ts +18 -0
  49. package/lib/typescript/src/navigation/screen/types.d.ts.map +1 -0
  50. package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts +35 -0
  51. package/lib/typescript/src/navigation/screen/useSheetScreenState.d.ts.map +1 -0
  52. package/lib/typescript/src/navigation/types.d.ts +29 -1
  53. package/lib/typescript/src/navigation/types.d.ts.map +1 -1
  54. package/lib/typescript/src/navigation/useTrueSheetNavigation.d.ts +1 -1
  55. package/lib/typescript/src/navigation/useTrueSheetNavigation.d.ts.map +1 -1
  56. package/package.json +1 -1
  57. package/src/TrueSheet.tsx +3 -1
  58. package/src/TrueSheet.types.ts +26 -0
  59. package/src/fabric/TrueSheetViewNativeComponent.ts +5 -2
  60. package/src/navigation/TrueSheetRouter.ts +6 -12
  61. package/src/navigation/TrueSheetView.tsx +39 -212
  62. package/src/navigation/createTrueSheetNavigator.tsx +3 -3
  63. package/src/navigation/screen/ReanimatedTrueSheetScreen.tsx +47 -0
  64. package/src/navigation/screen/TrueSheetScreen.tsx +37 -0
  65. package/src/navigation/screen/index.ts +3 -0
  66. package/src/navigation/screen/types.ts +20 -0
  67. package/src/navigation/screen/useSheetScreenState.ts +106 -0
  68. package/src/navigation/types.ts +31 -0
  69. package/src/navigation/useTrueSheetNavigation.ts +2 -4
@@ -0,0 +1,37 @@
1
+ import { TrueSheet } from '../../TrueSheet';
2
+ import type { TrueSheetScreenProps } from './types';
3
+ import { useSheetScreenState } from './useSheetScreenState';
4
+
5
+ export const TrueSheetScreen = ({
6
+ detentIndex,
7
+ resizeKey,
8
+ navigation,
9
+ emit,
10
+ routeKey,
11
+ closing,
12
+ detents,
13
+ children,
14
+ ...sheetProps
15
+ }: TrueSheetScreenProps) => {
16
+ const { ref, initialDetentIndex, eventHandlers } = useSheetScreenState({
17
+ detentIndex,
18
+ resizeKey,
19
+ closing,
20
+ navigation,
21
+ routeKey,
22
+ emit,
23
+ });
24
+
25
+ return (
26
+ <TrueSheet
27
+ ref={ref}
28
+ name={`navigation-sheet-${routeKey}`}
29
+ initialDetentIndex={initialDetentIndex}
30
+ detents={detents}
31
+ {...eventHandlers}
32
+ {...sheetProps}
33
+ >
34
+ {children}
35
+ </TrueSheet>
36
+ );
37
+ };
@@ -0,0 +1,3 @@
1
+ export { TrueSheetScreen } from './TrueSheetScreen';
2
+ export { useSheetScreenState } from './useSheetScreenState';
3
+ export type { TrueSheetScreenProps, ReanimatedTrueSheetScreenProps } from './types';
@@ -0,0 +1,20 @@
1
+ import type { ParamListBase } from '@react-navigation/native';
2
+
3
+ import type { TrueSheetProps } from '../../TrueSheet.types';
4
+ import type { TrueSheetNavigationHelpers, TrueSheetNavigationProp } from '../types';
5
+
6
+ export interface TrueSheetScreenProps {
7
+ detentIndex: number;
8
+ resizeKey?: number;
9
+ navigation: TrueSheetNavigationProp<ParamListBase>;
10
+ emit: TrueSheetNavigationHelpers['emit'];
11
+ routeKey: string;
12
+ closing?: boolean;
13
+ detents: TrueSheetProps['detents'];
14
+ children: React.ReactNode;
15
+ [key: string]: unknown;
16
+ }
17
+
18
+ export interface ReanimatedTrueSheetScreenProps extends TrueSheetScreenProps {
19
+ reanimatedPositionChangeHandler?: TrueSheetProps['onPositionChange'];
20
+ }
@@ -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
+ };
@@ -12,6 +12,7 @@ import type {
12
12
  import type {
13
13
  DetentInfoEventPayload,
14
14
  PositionChangeEventPayload,
15
+ PositionChangeEvent,
15
16
  TrueSheetProps,
16
17
  } from '../TrueSheet.types';
17
18
 
@@ -147,6 +148,36 @@ 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 reanimated position change handler created by `useReanimatedPositionChangeHandler`.
162
+ * Only used when `reanimated` is enabled.
163
+ *
164
+ * @example
165
+ * ```tsx
166
+ * const positionHandler = useReanimatedPositionChangeHandler((payload) => {
167
+ * 'worklet';
168
+ * animatedValue.value = payload.position;
169
+ * });
170
+ *
171
+ * <Navigator.Screen
172
+ * name="Sheet"
173
+ * options={{
174
+ * reanimated: true,
175
+ * reanimatedPositionChangeHandler: positionHandler,
176
+ * }}
177
+ * />
178
+ * ```
179
+ */
180
+ reanimatedPositionChangeHandler?: (e: PositionChangeEvent) => void;
150
181
  };
151
182
 
152
183
  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>>();