@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.
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetView.kt +5 -1
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewController.kt +103 -118
- package/android/src/main/java/com/lodev09/truesheet/TrueSheetViewManager.kt +7 -2
- package/android/src/main/java/com/lodev09/truesheet/core/TrueSheetDialogObserver.kt +2 -2
- package/android/src/main/java/com/lodev09/truesheet/utils/ScreenUtils.kt +64 -81
- package/android/src/main/res/values/styles.xml +1 -0
- package/ios/TrueSheetView.mm +20 -3
- package/ios/TrueSheetViewController.h +2 -0
- package/ios/TrueSheetViewController.mm +36 -18
- package/lib/module/TrueSheet.js +3 -1
- package/lib/module/TrueSheet.js.map +1 -1
- package/lib/module/fabric/TrueSheetViewNativeComponent.ts +5 -2
- package/lib/module/navigation/TrueSheetRouter.js +12 -18
- package/lib/module/navigation/TrueSheetRouter.js.map +1 -1
- package/lib/module/navigation/TrueSheetView.js +29 -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 +46 -0
- package/lib/module/navigation/screen/ReanimatedTrueSheetScreen.js.map +1 -0
- package/lib/module/navigation/screen/TrueSheetScreen.js +39 -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/TrueSheet.d.ts.map +1 -1
- package/lib/typescript/src/TrueSheet.types.d.ts +24 -0
- package/lib/typescript/src/TrueSheet.types.d.ts.map +1 -1
- package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts +3 -2
- package/lib/typescript/src/fabric/TrueSheetViewNativeComponent.d.ts.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 +18 -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 +29 -1
- 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/TrueSheet.tsx +3 -1
- package/src/TrueSheet.types.ts +26 -0
- package/src/fabric/TrueSheetViewNativeComponent.ts +5 -2
- package/src/navigation/TrueSheetRouter.ts +6 -12
- package/src/navigation/TrueSheetView.tsx +39 -212
- package/src/navigation/createTrueSheetNavigator.tsx +3 -3
- package/src/navigation/screen/ReanimatedTrueSheetScreen.tsx +47 -0
- package/src/navigation/screen/TrueSheetScreen.tsx +37 -0
- package/src/navigation/screen/index.ts +3 -0
- package/src/navigation/screen/types.ts +20 -0
- package/src/navigation/screen/useSheetScreenState.ts +106 -0
- package/src/navigation/types.ts +31 -0
- 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,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
|
+
};
|
package/src/navigation/types.ts
CHANGED
|
@@ -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
|
|
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>>();
|