react-native-drawer-layout 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 (78) hide show
  1. package/lib/commonjs/index.js +8 -9
  2. package/lib/commonjs/index.js.map +1 -1
  3. package/lib/commonjs/utils/DrawerGestureContext.js +3 -3
  4. package/lib/commonjs/utils/DrawerGestureContext.js.map +1 -1
  5. package/lib/commonjs/utils/DrawerProgressContext.js +3 -3
  6. package/lib/commonjs/utils/DrawerProgressContext.js.map +1 -1
  7. package/lib/commonjs/utils/useDrawerProgress.js +3 -4
  8. package/lib/commonjs/utils/useDrawerProgress.js.map +1 -1
  9. package/lib/commonjs/views/Drawer.js +2 -2
  10. package/lib/commonjs/views/Drawer.js.map +1 -1
  11. package/lib/commonjs/views/GestureHandler.android.js.map +1 -1
  12. package/lib/commonjs/views/GestureHandler.ios.js.map +1 -1
  13. package/lib/commonjs/views/GestureHandler.js.map +1 -1
  14. package/lib/commonjs/views/GestureHandlerNative.js +2 -3
  15. package/lib/commonjs/views/GestureHandlerNative.js.map +1 -1
  16. package/lib/commonjs/views/legacy/Drawer.js +232 -199
  17. package/lib/commonjs/views/legacy/Drawer.js.map +1 -1
  18. package/lib/commonjs/views/legacy/Overlay.js +2 -3
  19. package/lib/commonjs/views/legacy/Overlay.js.map +1 -1
  20. package/lib/commonjs/views/modern/Drawer.js +31 -10
  21. package/lib/commonjs/views/modern/Drawer.js.map +1 -1
  22. package/lib/commonjs/views/modern/Overlay.js +2 -3
  23. package/lib/commonjs/views/modern/Overlay.js.map +1 -1
  24. package/lib/module/index.js +4 -4
  25. package/lib/module/index.js.map +1 -1
  26. package/lib/module/utils/DrawerGestureContext.js +1 -1
  27. package/lib/module/utils/DrawerGestureContext.js.map +1 -1
  28. package/lib/module/utils/DrawerProgressContext.js +1 -1
  29. package/lib/module/utils/DrawerProgressContext.js.map +1 -1
  30. package/lib/module/utils/useDrawerProgress.js +2 -2
  31. package/lib/module/utils/useDrawerProgress.js.map +1 -1
  32. package/lib/module/views/Drawer.js +2 -2
  33. package/lib/module/views/Drawer.js.map +1 -1
  34. package/lib/module/views/GestureHandler.android.js.map +1 -1
  35. package/lib/module/views/GestureHandler.ios.js.map +1 -1
  36. package/lib/module/views/GestureHandler.js.map +1 -1
  37. package/lib/module/views/GestureHandlerNative.js +1 -1
  38. package/lib/module/views/GestureHandlerNative.js.map +1 -1
  39. package/lib/module/views/legacy/Drawer.js +229 -196
  40. package/lib/module/views/legacy/Drawer.js.map +1 -1
  41. package/lib/module/views/legacy/Overlay.js +1 -2
  42. package/lib/module/views/legacy/Overlay.js.map +1 -1
  43. package/lib/module/views/modern/Drawer.js +29 -8
  44. package/lib/module/views/modern/Drawer.js.map +1 -1
  45. package/lib/module/views/modern/Overlay.js +1 -2
  46. package/lib/module/views/modern/Overlay.js.map +1 -1
  47. package/lib/typescript/src/index.d.ts +4 -4
  48. package/lib/typescript/src/index.d.ts.map +1 -1
  49. package/lib/typescript/src/types.d.ts +20 -0
  50. package/lib/typescript/src/types.d.ts.map +1 -1
  51. package/lib/typescript/src/utils/DrawerGestureContext.d.ts +1 -2
  52. package/lib/typescript/src/utils/DrawerGestureContext.d.ts.map +1 -1
  53. package/lib/typescript/src/utils/DrawerProgressContext.d.ts +1 -2
  54. package/lib/typescript/src/utils/DrawerProgressContext.d.ts.map +1 -1
  55. package/lib/typescript/src/utils/useDrawerProgress.d.ts +1 -1
  56. package/lib/typescript/src/utils/useDrawerProgress.d.ts.map +1 -1
  57. package/lib/typescript/src/views/Drawer.d.ts +1 -1
  58. package/lib/typescript/src/views/Drawer.d.ts.map +1 -1
  59. package/lib/typescript/src/views/legacy/Drawer.d.ts +1 -1
  60. package/lib/typescript/src/views/legacy/Drawer.d.ts.map +1 -1
  61. package/lib/typescript/src/views/legacy/Overlay.d.ts +1 -2
  62. package/lib/typescript/src/views/legacy/Overlay.d.ts.map +1 -1
  63. package/lib/typescript/src/views/modern/Drawer.d.ts +1 -1
  64. package/lib/typescript/src/views/modern/Drawer.d.ts.map +1 -1
  65. package/lib/typescript/src/views/modern/Overlay.d.ts +1 -2
  66. package/lib/typescript/src/views/modern/Overlay.d.ts.map +1 -1
  67. package/package.json +6 -3
  68. package/src/index.tsx +4 -4
  69. package/src/types.tsx +25 -0
  70. package/src/utils/DrawerGestureContext.tsx +2 -1
  71. package/src/utils/DrawerProgressContext.tsx +1 -1
  72. package/src/utils/useDrawerProgress.tsx +2 -2
  73. package/src/views/Drawer.tsx +4 -4
  74. package/src/views/GestureHandlerNative.tsx +1 -1
  75. package/src/views/legacy/Drawer.tsx +24 -3
  76. package/src/views/legacy/Overlay.tsx +1 -3
  77. package/src/views/modern/Drawer.tsx +55 -16
  78. package/src/views/modern/Overlay.tsx +1 -3
@@ -17,6 +17,7 @@ import Animated, {
17
17
  useSharedValue,
18
18
  withSpring,
19
19
  } from 'react-native-reanimated';
20
+ import useLatestCallback from 'use-latest-callback';
20
21
 
21
22
  import {
22
23
  DEFAULT_DRAWER_WIDTH,
@@ -25,13 +26,13 @@ import {
25
26
  SWIPE_MIN_VELOCITY,
26
27
  } from '../../constants';
27
28
  import type { DrawerProps } from '../../types';
28
- import DrawerProgressContext from '../../utils/DrawerProgressContext';
29
+ import { DrawerProgressContext } from '../../utils/DrawerProgressContext';
29
30
  import {
30
31
  GestureState,
31
32
  PanGestureHandler,
32
33
  PanGestureHandlerGestureEvent,
33
34
  } from '../GestureHandler';
34
- import Overlay from './Overlay';
35
+ import { Overlay } from './Overlay';
35
36
 
36
37
  const minmax = (value: number, start: number, end: number) => {
37
38
  'worklet';
@@ -43,7 +44,7 @@ type Props = DrawerProps & {
43
44
  layout: { width: number };
44
45
  };
45
46
 
46
- export default function Drawer({
47
+ export function Drawer({
47
48
  layout,
48
49
  drawerPosition,
49
50
  drawerStyle,
@@ -53,6 +54,11 @@ export default function Drawer({
53
54
  keyboardDismissMode,
54
55
  onClose,
55
56
  onOpen,
57
+ onGestureStart,
58
+ onGestureCancel,
59
+ onGestureEnd,
60
+ onTransitionStart,
61
+ onTransitionEnd,
56
62
  open,
57
63
  overlayStyle,
58
64
  overlayAccessibilityLabel,
@@ -132,13 +138,15 @@ export default function Drawer({
132
138
  }
133
139
  };
134
140
 
135
- const onGestureStart = () => {
141
+ const onGestureBegin = () => {
142
+ onGestureStart?.();
136
143
  startInteraction();
137
144
  hideKeyboard();
138
145
  hideStatusBar(true);
139
146
  };
140
147
 
141
148
  const onGestureFinish = () => {
149
+ onGestureEnd?.();
142
150
  endInteraction();
143
151
  };
144
152
 
@@ -155,23 +163,42 @@ export default function Drawer({
155
163
  const translationX = useSharedValue(getDrawerTranslationX(open));
156
164
  const gestureState = useSharedValue<GestureState>(GestureState.UNDETERMINED);
157
165
 
166
+ const handleAnimationStart = useLatestCallback((open: boolean) => {
167
+ onTransitionStart?.(!open);
168
+ });
169
+
170
+ const handleAnimationEnd = useLatestCallback(
171
+ (open: boolean, finished?: boolean) => {
172
+ if (!finished) return;
173
+ onTransitionEnd?.(!open);
174
+ }
175
+ );
176
+
158
177
  const toggleDrawer = React.useCallback(
159
178
  (open: boolean, velocity?: number) => {
160
179
  'worklet';
161
180
 
162
181
  const translateX = getDrawerTranslationX(open);
163
182
 
183
+ if (velocity === undefined) {
184
+ runOnJS(handleAnimationStart)(open);
185
+ }
186
+
164
187
  touchStartX.value = 0;
165
188
  touchX.value = 0;
166
- translationX.value = withSpring(translateX, {
167
- velocity,
168
- stiffness: 1000,
169
- damping: 500,
170
- mass: 3,
171
- overshootClamping: true,
172
- restDisplacementThreshold: 0.01,
173
- restSpeedThreshold: 0.01,
174
- });
189
+ translationX.value = withSpring(
190
+ translateX,
191
+ {
192
+ velocity,
193
+ stiffness: 1000,
194
+ damping: 500,
195
+ mass: 3,
196
+ overshootClamping: true,
197
+ restDisplacementThreshold: 0.01,
198
+ restSpeedThreshold: 0.01,
199
+ },
200
+ (finished) => runOnJS(handleAnimationEnd)(open, finished)
201
+ );
175
202
 
176
203
  if (open) {
177
204
  runOnJS(onOpen)();
@@ -179,7 +206,16 @@ export default function Drawer({
179
206
  runOnJS(onClose)();
180
207
  }
181
208
  },
182
- [getDrawerTranslationX, onClose, onOpen, touchStartX, touchX, translationX]
209
+ [
210
+ getDrawerTranslationX,
211
+ handleAnimationEnd,
212
+ handleAnimationStart,
213
+ onClose,
214
+ onOpen,
215
+ touchStartX,
216
+ touchX,
217
+ translationX,
218
+ ]
183
219
  );
184
220
 
185
221
  React.useEffect(() => toggleDrawer(open), [open, toggleDrawer]);
@@ -194,17 +230,20 @@ export default function Drawer({
194
230
  gestureState.value = event.state;
195
231
  touchStartX.value = event.x;
196
232
  },
233
+ onCancel: () => {
234
+ runOnJS(() => onGestureCancel?.())();
235
+ },
197
236
  onActive: (event, ctx) => {
198
237
  touchX.value = event.x;
199
238
  translationX.value = ctx.startX + event.translationX;
200
239
  gestureState.value = event.state;
201
240
 
202
241
  // onStart will _always_ be called, even when the activation
203
- // criteria isn't met yet. This makes sure onGestureStart is only
242
+ // criteria isn't met yet. This makes sure onGestureBegin is only
204
243
  // called when the criteria is really met.
205
244
  if (!ctx.hasCalledOnStart) {
206
245
  ctx.hasCalledOnStart = true;
207
- runOnJS(onGestureStart)();
246
+ runOnJS(onGestureBegin)();
208
247
  }
209
248
  },
210
249
  onEnd: (event) => {
@@ -13,7 +13,7 @@ type Props = React.ComponentProps<typeof Animated.View> & {
13
13
  accessibilityLabel?: string;
14
14
  };
15
15
 
16
- const Overlay = React.forwardRef(function Overlay(
16
+ export const Overlay = React.forwardRef(function Overlay(
17
17
  {
18
18
  progress,
19
19
  onPress,
@@ -78,5 +78,3 @@ const styles = StyleSheet.create({
78
78
  pointerEvents: 'auto',
79
79
  },
80
80
  });
81
-
82
- export default Overlay;