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.
- package/README.md +2 -254
- package/lib/commonjs/index.js +8 -9
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/utils/DrawerGestureContext.js +3 -3
- package/lib/commonjs/utils/DrawerGestureContext.js.map +1 -1
- package/lib/commonjs/utils/DrawerProgressContext.js +3 -3
- package/lib/commonjs/utils/DrawerProgressContext.js.map +1 -1
- package/lib/commonjs/utils/useDrawerProgress.js +3 -4
- package/lib/commonjs/utils/useDrawerProgress.js.map +1 -1
- package/lib/commonjs/views/Drawer.js +2 -2
- package/lib/commonjs/views/Drawer.js.map +1 -1
- package/lib/commonjs/views/GestureHandler.android.js.map +1 -1
- package/lib/commonjs/views/GestureHandler.ios.js.map +1 -1
- package/lib/commonjs/views/GestureHandler.js.map +1 -1
- package/lib/commonjs/views/GestureHandlerNative.js +2 -3
- package/lib/commonjs/views/GestureHandlerNative.js.map +1 -1
- package/lib/commonjs/views/legacy/Drawer.js +232 -199
- package/lib/commonjs/views/legacy/Drawer.js.map +1 -1
- package/lib/commonjs/views/legacy/Overlay.js +2 -3
- package/lib/commonjs/views/legacy/Overlay.js.map +1 -1
- package/lib/commonjs/views/modern/Drawer.js +31 -10
- package/lib/commonjs/views/modern/Drawer.js.map +1 -1
- package/lib/commonjs/views/modern/Overlay.js +2 -3
- package/lib/commonjs/views/modern/Overlay.js.map +1 -1
- package/lib/module/index.js +4 -4
- package/lib/module/index.js.map +1 -1
- package/lib/module/utils/DrawerGestureContext.js +1 -1
- package/lib/module/utils/DrawerGestureContext.js.map +1 -1
- package/lib/module/utils/DrawerProgressContext.js +1 -1
- package/lib/module/utils/DrawerProgressContext.js.map +1 -1
- package/lib/module/utils/useDrawerProgress.js +2 -2
- package/lib/module/utils/useDrawerProgress.js.map +1 -1
- package/lib/module/views/Drawer.js +2 -2
- package/lib/module/views/Drawer.js.map +1 -1
- package/lib/module/views/GestureHandler.android.js.map +1 -1
- package/lib/module/views/GestureHandler.ios.js.map +1 -1
- package/lib/module/views/GestureHandler.js.map +1 -1
- package/lib/module/views/GestureHandlerNative.js +1 -1
- package/lib/module/views/GestureHandlerNative.js.map +1 -1
- package/lib/module/views/legacy/Drawer.js +229 -196
- package/lib/module/views/legacy/Drawer.js.map +1 -1
- package/lib/module/views/legacy/Overlay.js +1 -2
- package/lib/module/views/legacy/Overlay.js.map +1 -1
- package/lib/module/views/modern/Drawer.js +29 -8
- package/lib/module/views/modern/Drawer.js.map +1 -1
- package/lib/module/views/modern/Overlay.js +1 -2
- package/lib/module/views/modern/Overlay.js.map +1 -1
- package/lib/typescript/src/index.d.ts +4 -4
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts +20 -0
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/lib/typescript/src/utils/DrawerGestureContext.d.ts +1 -2
- package/lib/typescript/src/utils/DrawerGestureContext.d.ts.map +1 -1
- package/lib/typescript/src/utils/DrawerProgressContext.d.ts +1 -2
- package/lib/typescript/src/utils/DrawerProgressContext.d.ts.map +1 -1
- package/lib/typescript/src/utils/useDrawerProgress.d.ts +1 -1
- package/lib/typescript/src/utils/useDrawerProgress.d.ts.map +1 -1
- package/lib/typescript/src/views/Drawer.d.ts +1 -2
- package/lib/typescript/src/views/Drawer.d.ts.map +1 -1
- package/lib/typescript/src/views/GestureHandlerNative.d.ts +0 -1
- package/lib/typescript/src/views/GestureHandlerNative.d.ts.map +1 -1
- package/lib/typescript/src/views/legacy/Drawer.d.ts +1 -1
- package/lib/typescript/src/views/legacy/Drawer.d.ts.map +1 -1
- package/lib/typescript/src/views/legacy/Overlay.d.ts +20 -5
- package/lib/typescript/src/views/legacy/Overlay.d.ts.map +1 -1
- package/lib/typescript/src/views/modern/Drawer.d.ts +1 -2
- package/lib/typescript/src/views/modern/Drawer.d.ts.map +1 -1
- package/lib/typescript/src/views/modern/Overlay.d.ts +20 -5
- package/lib/typescript/src/views/modern/Overlay.d.ts.map +1 -1
- package/package.json +9 -6
- package/src/index.tsx +4 -4
- package/src/types.tsx +25 -0
- package/src/utils/DrawerGestureContext.tsx +2 -1
- package/src/utils/DrawerProgressContext.tsx +1 -1
- package/src/utils/useDrawerProgress.tsx +2 -2
- package/src/views/Drawer.tsx +4 -4
- package/src/views/GestureHandlerNative.tsx +1 -1
- package/src/views/legacy/Drawer.tsx +24 -3
- package/src/views/legacy/Overlay.tsx +1 -3
- package/src/views/modern/Drawer.tsx +55 -16
- package/src/views/modern/Overlay.tsx +1 -3
package/src/views/Drawer.tsx
CHANGED
|
@@ -50,7 +50,7 @@ const getDefaultDrawerWidth = ({
|
|
|
50
50
|
return Math.min(smallerAxisSize - appBarHeight, maxWidth);
|
|
51
51
|
};
|
|
52
52
|
|
|
53
|
-
export
|
|
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').
|
|
83
|
+
const Drawer: typeof import('./modern/Drawer').Drawer =
|
|
84
84
|
useLegacyImplementation
|
|
85
|
-
? require('./legacy/Drawer').
|
|
86
|
-
: require('./modern/Drawer').
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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
|
-
[
|
|
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
|
|
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(
|
|
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;
|