react-native-drawer-layout 3.1.0 → 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 (81) hide show
  1. package/README.md +2 -254
  2. package/lib/commonjs/index.js +8 -9
  3. package/lib/commonjs/index.js.map +1 -1
  4. package/lib/commonjs/utils/DrawerGestureContext.js +3 -3
  5. package/lib/commonjs/utils/DrawerGestureContext.js.map +1 -1
  6. package/lib/commonjs/utils/DrawerProgressContext.js +3 -3
  7. package/lib/commonjs/utils/DrawerProgressContext.js.map +1 -1
  8. package/lib/commonjs/utils/useDrawerProgress.js +3 -4
  9. package/lib/commonjs/utils/useDrawerProgress.js.map +1 -1
  10. package/lib/commonjs/views/Drawer.js +2 -2
  11. package/lib/commonjs/views/Drawer.js.map +1 -1
  12. package/lib/commonjs/views/GestureHandler.android.js.map +1 -1
  13. package/lib/commonjs/views/GestureHandler.ios.js.map +1 -1
  14. package/lib/commonjs/views/GestureHandler.js.map +1 -1
  15. package/lib/commonjs/views/GestureHandlerNative.js +2 -3
  16. package/lib/commonjs/views/GestureHandlerNative.js.map +1 -1
  17. package/lib/commonjs/views/legacy/Drawer.js +232 -199
  18. package/lib/commonjs/views/legacy/Drawer.js.map +1 -1
  19. package/lib/commonjs/views/legacy/Overlay.js +2 -3
  20. package/lib/commonjs/views/legacy/Overlay.js.map +1 -1
  21. package/lib/commonjs/views/modern/Drawer.js +31 -10
  22. package/lib/commonjs/views/modern/Drawer.js.map +1 -1
  23. package/lib/commonjs/views/modern/Overlay.js +2 -3
  24. package/lib/commonjs/views/modern/Overlay.js.map +1 -1
  25. package/lib/module/index.js +4 -4
  26. package/lib/module/index.js.map +1 -1
  27. package/lib/module/utils/DrawerGestureContext.js +1 -1
  28. package/lib/module/utils/DrawerGestureContext.js.map +1 -1
  29. package/lib/module/utils/DrawerProgressContext.js +1 -1
  30. package/lib/module/utils/DrawerProgressContext.js.map +1 -1
  31. package/lib/module/utils/useDrawerProgress.js +2 -2
  32. package/lib/module/utils/useDrawerProgress.js.map +1 -1
  33. package/lib/module/views/Drawer.js +2 -2
  34. package/lib/module/views/Drawer.js.map +1 -1
  35. package/lib/module/views/GestureHandler.android.js.map +1 -1
  36. package/lib/module/views/GestureHandler.ios.js.map +1 -1
  37. package/lib/module/views/GestureHandler.js.map +1 -1
  38. package/lib/module/views/GestureHandlerNative.js +1 -1
  39. package/lib/module/views/GestureHandlerNative.js.map +1 -1
  40. package/lib/module/views/legacy/Drawer.js +229 -196
  41. package/lib/module/views/legacy/Drawer.js.map +1 -1
  42. package/lib/module/views/legacy/Overlay.js +1 -2
  43. package/lib/module/views/legacy/Overlay.js.map +1 -1
  44. package/lib/module/views/modern/Drawer.js +29 -8
  45. package/lib/module/views/modern/Drawer.js.map +1 -1
  46. package/lib/module/views/modern/Overlay.js +1 -2
  47. package/lib/module/views/modern/Overlay.js.map +1 -1
  48. package/lib/typescript/src/index.d.ts +4 -4
  49. package/lib/typescript/src/index.d.ts.map +1 -1
  50. package/lib/typescript/src/types.d.ts +20 -0
  51. package/lib/typescript/src/types.d.ts.map +1 -1
  52. package/lib/typescript/src/utils/DrawerGestureContext.d.ts +1 -2
  53. package/lib/typescript/src/utils/DrawerGestureContext.d.ts.map +1 -1
  54. package/lib/typescript/src/utils/DrawerProgressContext.d.ts +1 -2
  55. package/lib/typescript/src/utils/DrawerProgressContext.d.ts.map +1 -1
  56. package/lib/typescript/src/utils/useDrawerProgress.d.ts +1 -1
  57. package/lib/typescript/src/utils/useDrawerProgress.d.ts.map +1 -1
  58. package/lib/typescript/src/views/Drawer.d.ts +1 -2
  59. package/lib/typescript/src/views/Drawer.d.ts.map +1 -1
  60. package/lib/typescript/src/views/GestureHandlerNative.d.ts +0 -1
  61. package/lib/typescript/src/views/GestureHandlerNative.d.ts.map +1 -1
  62. package/lib/typescript/src/views/legacy/Drawer.d.ts +1 -1
  63. package/lib/typescript/src/views/legacy/Drawer.d.ts.map +1 -1
  64. package/lib/typescript/src/views/legacy/Overlay.d.ts +20 -5
  65. package/lib/typescript/src/views/legacy/Overlay.d.ts.map +1 -1
  66. package/lib/typescript/src/views/modern/Drawer.d.ts +1 -2
  67. package/lib/typescript/src/views/modern/Drawer.d.ts.map +1 -1
  68. package/lib/typescript/src/views/modern/Overlay.d.ts +20 -5
  69. package/lib/typescript/src/views/modern/Overlay.d.ts.map +1 -1
  70. package/package.json +9 -6
  71. package/src/index.tsx +4 -4
  72. package/src/types.tsx +25 -0
  73. package/src/utils/DrawerGestureContext.tsx +2 -1
  74. package/src/utils/DrawerProgressContext.tsx +1 -1
  75. package/src/utils/useDrawerProgress.tsx +2 -2
  76. package/src/views/Drawer.tsx +4 -4
  77. package/src/views/GestureHandlerNative.tsx +1 -1
  78. package/src/views/legacy/Drawer.tsx +24 -3
  79. package/src/views/legacy/Overlay.tsx +1 -3
  80. package/src/views/modern/Drawer.tsx +55 -16
  81. package/src/views/modern/Overlay.tsx +1 -3
@@ -50,7 +50,7 @@ const getDefaultDrawerWidth = ({
50
50
  return Math.min(smallerAxisSize - appBarHeight, maxWidth);
51
51
  };
52
52
 
53
- export default function Drawer({
53
+ export function Drawer({
54
54
  // Reanimated 2 is not configured
55
55
  // @ts-expect-error: the type definitions are incomplete
56
56
  useLegacyImplementation = !Reanimated.isConfigured?.(),
@@ -80,10 +80,10 @@ export default function Drawer({
80
80
  );
81
81
  }
82
82
 
83
- const Drawer: typeof import('./modern/Drawer').default =
83
+ const Drawer: typeof import('./modern/Drawer').Drawer =
84
84
  useLegacyImplementation
85
- ? require('./legacy/Drawer').default
86
- : require('./modern/Drawer').default;
85
+ ? require('./legacy/Drawer').Drawer
86
+ : require('./modern/Drawer').Drawer;
87
87
 
88
88
  const windowDimensions = useWindowDimensions();
89
89
  const layout = customLayout ?? windowDimensions;
@@ -4,7 +4,7 @@ import {
4
4
  PanGestureHandlerProperties,
5
5
  } from 'react-native-gesture-handler';
6
6
 
7
- import DrawerGestureContext from '../utils/DrawerGestureContext';
7
+ import { DrawerGestureContext } from '../utils/DrawerGestureContext';
8
8
 
9
9
  export function PanGestureHandler(props: PanGestureHandlerProperties) {
10
10
  const gestureRef = React.useRef<PanGestureHandlerNative>(null);
@@ -18,9 +18,9 @@ import {
18
18
  SWIPE_MIN_VELOCITY,
19
19
  } from '../../constants';
20
20
  import type { DrawerProps } from '../../types';
21
- import DrawerProgressContext from '../../utils/DrawerProgressContext';
21
+ import { DrawerProgressContext } from '../../utils/DrawerProgressContext';
22
22
  import { GestureState, PanGestureHandler } from '../GestureHandler';
23
- import Overlay from './Overlay';
23
+ import { Overlay } from './Overlay';
24
24
 
25
25
  const {
26
26
  Clock,
@@ -76,7 +76,7 @@ type Props = DrawerProps & {
76
76
  layout: { width: number };
77
77
  };
78
78
 
79
- export default class Drawer extends React.Component<Props> {
79
+ export class Drawer extends React.Component<Props> {
80
80
  componentDidUpdate(prevProps: Props) {
81
81
  const {
82
82
  open,
@@ -284,6 +284,14 @@ export default class Drawer extends React.Component<Props> {
284
284
  set(this.manuallyTriggerSpring, FALSE),
285
285
  ]),
286
286
  spring(this.clock, state, { ...SPRING_CONFIG, toValue }),
287
+ onChange(
288
+ state.finished,
289
+ cond(
290
+ state.finished,
291
+ call([this.isOpen], (open) => this.props.onTransitionEnd?.(!open)),
292
+ call([this.isOpen], (open) => this.props.onTransitionStart?.(!open))
293
+ )
294
+ ),
287
295
  cond(state.finished, [
288
296
  // Reset gesture and velocity from previous gesture
289
297
  set(this.touchX, 0),
@@ -370,6 +378,18 @@ export default class Drawer extends React.Component<Props> {
370
378
  call([], this.handleStartInteraction)
371
379
  )
372
380
  ),
381
+ onChange(
382
+ this.gestureState,
383
+ cond(eq(this.gestureState, GestureState.END), [
384
+ call([], () => this.props.onGestureEnd?.()),
385
+ ])
386
+ ),
387
+ onChange(
388
+ this.gestureState,
389
+ cond(eq(this.gestureState, GestureState.CANCELLED), [
390
+ call([], () => this.props.onGestureCancel?.()),
391
+ ])
392
+ ),
373
393
  cond(
374
394
  eq(this.gestureState, GestureState.ACTIVE),
375
395
  [
@@ -378,6 +398,7 @@ export default class Drawer extends React.Component<Props> {
378
398
  set(this.isSwiping, TRUE),
379
399
  // Also update the drag offset to the last position
380
400
  set(this.offsetX, this.position),
401
+ call([], () => this.props.onGestureStart?.()),
381
402
  ]),
382
403
  // Update position with previous offset + gesture distance
383
404
  set(
@@ -21,7 +21,7 @@ type Props = React.ComponentProps<typeof Animated.View> & {
21
21
  accessibilityLabel?: string;
22
22
  };
23
23
 
24
- const Overlay = React.forwardRef(function Overlay(
24
+ export const Overlay = React.forwardRef(function Overlay(
25
25
  {
26
26
  progress,
27
27
  onPress,
@@ -83,5 +83,3 @@ const styles = StyleSheet.create({
83
83
  flex: 1,
84
84
  },
85
85
  });
86
-
87
- export default Overlay;
@@ -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;