react-native-gesture-handler 2.20.2 → 2.21.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (123) hide show
  1. package/RNGestureHandler.podspec +9 -0
  2. package/android/build.gradle +19 -0
  3. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +6 -2
  4. package/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt +53 -21
  5. package/apple/RNGestureHandlerPointerTracker.m +4 -2
  6. package/lib/commonjs/RNGestureHandlerModule.web.js +15 -2
  7. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
  8. package/lib/commonjs/components/Pressable/Pressable.js +2 -6
  9. package/lib/commonjs/components/Pressable/Pressable.js.map +1 -1
  10. package/lib/commonjs/components/ReanimatedDrawerLayout.js +389 -0
  11. package/lib/commonjs/components/ReanimatedDrawerLayout.js.map +1 -0
  12. package/lib/commonjs/components/ReanimatedSwipeable.js +117 -148
  13. package/lib/commonjs/components/ReanimatedSwipeable.js.map +1 -1
  14. package/lib/commonjs/findNodeHandle.js +12 -0
  15. package/lib/commonjs/findNodeHandle.js.map +1 -0
  16. package/lib/commonjs/findNodeHandle.web.js +40 -0
  17. package/lib/commonjs/findNodeHandle.web.js.map +1 -0
  18. package/lib/commonjs/handlers/createHandler.js +4 -2
  19. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  20. package/lib/commonjs/handlers/gestures/GestureDetector/Wrap.web.js +51 -0
  21. package/lib/commonjs/handlers/gestures/GestureDetector/Wrap.web.js.map +1 -0
  22. package/lib/commonjs/handlers/gestures/GestureDetector/index.js +3 -1
  23. package/lib/commonjs/handlers/gestures/GestureDetector/index.js.map +1 -1
  24. package/lib/commonjs/handlers/gestures/GestureDetector/useDetectorUpdater.js +5 -3
  25. package/lib/commonjs/handlers/gestures/GestureDetector/useDetectorUpdater.js.map +1 -1
  26. package/lib/commonjs/handlers/gestures/GestureDetector/useViewRefHandler.js +4 -2
  27. package/lib/commonjs/handlers/gestures/GestureDetector/useViewRefHandler.js.map +1 -1
  28. package/lib/commonjs/web/handlers/GestureHandler.js +4 -0
  29. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  30. package/lib/commonjs/web/handlers/PanGestureHandler.js +59 -0
  31. package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
  32. package/lib/commonjs/web/interfaces.js +10 -1
  33. package/lib/commonjs/web/interfaces.js.map +1 -1
  34. package/lib/commonjs/web/tools/EventManager.js +6 -0
  35. package/lib/commonjs/web/tools/EventManager.js.map +1 -1
  36. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +1 -3
  37. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  38. package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js +5 -2
  39. package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js.map +1 -1
  40. package/lib/commonjs/web/tools/KeyboardEventManager.js +2 -2
  41. package/lib/commonjs/web/tools/KeyboardEventManager.js.map +1 -1
  42. package/lib/commonjs/web/tools/PointerTracker.js +6 -30
  43. package/lib/commonjs/web/tools/PointerTracker.js.map +1 -1
  44. package/lib/commonjs/web/tools/WheelEventManager.js +74 -0
  45. package/lib/commonjs/web/tools/WheelEventManager.js.map +1 -0
  46. package/lib/commonjs/web/utils.js +16 -0
  47. package/lib/commonjs/web/utils.js.map +1 -1
  48. package/lib/module/RNGestureHandlerModule.web.js +16 -3
  49. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  50. package/lib/module/components/Pressable/Pressable.js +2 -6
  51. package/lib/module/components/Pressable/Pressable.js.map +1 -1
  52. package/lib/module/components/ReanimatedDrawerLayout.js +365 -0
  53. package/lib/module/components/ReanimatedDrawerLayout.js.map +1 -0
  54. package/lib/module/components/ReanimatedSwipeable.js +119 -145
  55. package/lib/module/components/ReanimatedSwipeable.js.map +1 -1
  56. package/lib/module/findNodeHandle.js +3 -0
  57. package/lib/module/findNodeHandle.js.map +1 -0
  58. package/lib/module/findNodeHandle.web.js +32 -0
  59. package/lib/module/findNodeHandle.web.js.map +1 -0
  60. package/lib/module/handlers/createHandler.js +2 -1
  61. package/lib/module/handlers/createHandler.js.map +1 -1
  62. package/lib/module/handlers/gestures/GestureDetector/Wrap.web.js +34 -0
  63. package/lib/module/handlers/gestures/GestureDetector/Wrap.web.js.map +1 -0
  64. package/lib/module/handlers/gestures/GestureDetector/index.js +2 -1
  65. package/lib/module/handlers/gestures/GestureDetector/index.js.map +1 -1
  66. package/lib/module/handlers/gestures/GestureDetector/useDetectorUpdater.js +2 -2
  67. package/lib/module/handlers/gestures/GestureDetector/useDetectorUpdater.js.map +1 -1
  68. package/lib/module/handlers/gestures/GestureDetector/useViewRefHandler.js +1 -1
  69. package/lib/module/handlers/gestures/GestureDetector/useViewRefHandler.js.map +1 -1
  70. package/lib/module/web/handlers/GestureHandler.js +4 -0
  71. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  72. package/lib/module/web/handlers/PanGestureHandler.js +58 -0
  73. package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
  74. package/lib/module/web/interfaces.js +8 -0
  75. package/lib/module/web/interfaces.js.map +1 -1
  76. package/lib/module/web/tools/EventManager.js +6 -0
  77. package/lib/module/web/tools/EventManager.js.map +1 -1
  78. package/lib/module/web/tools/GestureHandlerOrchestrator.js +1 -3
  79. package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  80. package/lib/module/web/tools/GestureHandlerWebDelegate.js +3 -1
  81. package/lib/module/web/tools/GestureHandlerWebDelegate.js.map +1 -1
  82. package/lib/module/web/tools/KeyboardEventManager.js +2 -2
  83. package/lib/module/web/tools/KeyboardEventManager.js.map +1 -1
  84. package/lib/module/web/tools/PointerTracker.js +6 -30
  85. package/lib/module/web/tools/PointerTracker.js.map +1 -1
  86. package/lib/module/web/tools/WheelEventManager.js +60 -0
  87. package/lib/module/web/tools/WheelEventManager.js.map +1 -0
  88. package/lib/module/web/utils.js +15 -0
  89. package/lib/module/web/utils.js.map +1 -1
  90. package/lib/typescript/components/ReanimatedDrawerLayout.d.ts +162 -0
  91. package/lib/typescript/components/ReanimatedSwipeable.d.ts +22 -16
  92. package/lib/typescript/findNodeHandle.d.ts +2 -0
  93. package/lib/typescript/findNodeHandle.web.d.ts +2 -0
  94. package/lib/typescript/handlers/gestures/GestureDetector/Wrap.web.d.ts +7 -0
  95. package/lib/typescript/web/handlers/GestureHandler.d.ts +2 -1
  96. package/lib/typescript/web/handlers/PanGestureHandler.d.ts +5 -0
  97. package/lib/typescript/web/interfaces.d.ts +16 -0
  98. package/lib/typescript/web/tools/EventManager.d.ts +2 -0
  99. package/lib/typescript/web/tools/PointerTracker.d.ts +2 -8
  100. package/lib/typescript/web/tools/WheelEventManager.d.ts +11 -0
  101. package/lib/typescript/web/utils.d.ts +2 -1
  102. package/package.json +2 -2
  103. package/src/RNGestureHandlerModule.web.ts +23 -4
  104. package/src/components/Pressable/Pressable.tsx +2 -6
  105. package/src/components/ReanimatedDrawerLayout.tsx +741 -0
  106. package/src/components/ReanimatedSwipeable.tsx +361 -305
  107. package/src/findNodeHandle.ts +3 -0
  108. package/src/findNodeHandle.web.ts +35 -0
  109. package/src/handlers/createHandler.tsx +2 -1
  110. package/src/handlers/gestures/GestureDetector/Wrap.web.tsx +44 -0
  111. package/src/handlers/gestures/GestureDetector/index.tsx +2 -1
  112. package/src/handlers/gestures/GestureDetector/useDetectorUpdater.ts +1 -1
  113. package/src/handlers/gestures/GestureDetector/useViewRefHandler.ts +1 -1
  114. package/src/web/handlers/GestureHandler.ts +5 -1
  115. package/src/web/handlers/PanGestureHandler.ts +69 -1
  116. package/src/web/interfaces.ts +17 -0
  117. package/src/web/tools/EventManager.ts +4 -0
  118. package/src/web/tools/GestureHandlerOrchestrator.ts +1 -7
  119. package/src/web/tools/GestureHandlerWebDelegate.ts +3 -1
  120. package/src/web/tools/KeyboardEventManager.ts +2 -2
  121. package/src/web/tools/PointerTracker.ts +6 -28
  122. package/src/web/tools/WheelEventManager.ts +48 -0
  123. package/src/web/utils.ts +47 -1
@@ -0,0 +1,389 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.DrawerKeyboardDismissMode = exports.DrawerLockMode = exports.DrawerType = exports.DrawerState = exports.DrawerPosition = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _reactNative = require("react-native");
11
+
12
+ var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated"));
13
+
14
+ var _gestureObjects = require("../handlers/gestures/gestureObjects");
15
+
16
+ var _GestureDetector = require("../handlers/gestures/GestureDetector");
17
+
18
+ var _gestureHandlerCommon = require("../handlers/gestureHandlerCommon");
19
+
20
+ function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
21
+
22
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
23
+
24
+ // This component is based on RN's DrawerLayoutAndroid API
25
+ // It's cross-compatible with all platforms despite
26
+ // `DrawerLayoutAndroid` only being available on android
27
+ const DRAG_TOSS = 0.05;
28
+ let DrawerPosition;
29
+ exports.DrawerPosition = DrawerPosition;
30
+
31
+ (function (DrawerPosition) {
32
+ DrawerPosition[DrawerPosition["LEFT"] = 0] = "LEFT";
33
+ DrawerPosition[DrawerPosition["RIGHT"] = 1] = "RIGHT";
34
+ })(DrawerPosition || (exports.DrawerPosition = DrawerPosition = {}));
35
+
36
+ let DrawerState;
37
+ exports.DrawerState = DrawerState;
38
+
39
+ (function (DrawerState) {
40
+ DrawerState[DrawerState["IDLE"] = 0] = "IDLE";
41
+ DrawerState[DrawerState["DRAGGING"] = 1] = "DRAGGING";
42
+ DrawerState[DrawerState["SETTLING"] = 2] = "SETTLING";
43
+ })(DrawerState || (exports.DrawerState = DrawerState = {}));
44
+
45
+ let DrawerType;
46
+ exports.DrawerType = DrawerType;
47
+
48
+ (function (DrawerType) {
49
+ DrawerType[DrawerType["FRONT"] = 0] = "FRONT";
50
+ DrawerType[DrawerType["BACK"] = 1] = "BACK";
51
+ DrawerType[DrawerType["SLIDE"] = 2] = "SLIDE";
52
+ })(DrawerType || (exports.DrawerType = DrawerType = {}));
53
+
54
+ let DrawerLockMode;
55
+ exports.DrawerLockMode = DrawerLockMode;
56
+
57
+ (function (DrawerLockMode) {
58
+ DrawerLockMode[DrawerLockMode["UNLOCKED"] = 0] = "UNLOCKED";
59
+ DrawerLockMode[DrawerLockMode["LOCKED_CLOSED"] = 1] = "LOCKED_CLOSED";
60
+ DrawerLockMode[DrawerLockMode["LOCKED_OPEN"] = 2] = "LOCKED_OPEN";
61
+ })(DrawerLockMode || (exports.DrawerLockMode = DrawerLockMode = {}));
62
+
63
+ let DrawerKeyboardDismissMode;
64
+ exports.DrawerKeyboardDismissMode = DrawerKeyboardDismissMode;
65
+
66
+ (function (DrawerKeyboardDismissMode) {
67
+ DrawerKeyboardDismissMode[DrawerKeyboardDismissMode["NONE"] = 0] = "NONE";
68
+ DrawerKeyboardDismissMode[DrawerKeyboardDismissMode["ON_DRAG"] = 1] = "ON_DRAG";
69
+ })(DrawerKeyboardDismissMode || (exports.DrawerKeyboardDismissMode = DrawerKeyboardDismissMode = {}));
70
+
71
+ const defaultProps = {
72
+ drawerWidth: 200,
73
+ drawerPosition: DrawerPosition.LEFT,
74
+ drawerType: DrawerType.FRONT,
75
+ edgeWidth: 20,
76
+ minSwipeDistance: 3,
77
+ overlayColor: 'rgba(0, 0, 0, 0.7)',
78
+ drawerLockMode: DrawerLockMode.UNLOCKED,
79
+ enableTrackpadTwoFingerGesture: false,
80
+ activeCursor: 'auto',
81
+ mouseButton: _gestureHandlerCommon.MouseButton.LEFT,
82
+ statusBarAnimation: 'slide'
83
+ };
84
+ const DrawerLayout = /*#__PURE__*/(0, _react.forwardRef)(function DrawerLayout(props, ref) {
85
+ const [containerWidth, setContainerWidth] = (0, _react.useState)(0);
86
+ const [drawerState, setDrawerState] = (0, _react.useState)(DrawerState.IDLE);
87
+ const [drawerOpened, setDrawerOpened] = (0, _react.useState)(false);
88
+ const {
89
+ drawerPosition = defaultProps.drawerPosition,
90
+ drawerWidth = defaultProps.drawerWidth,
91
+ drawerType = defaultProps.drawerType,
92
+ drawerBackgroundColor,
93
+ drawerContainerStyle,
94
+ contentContainerStyle,
95
+ minSwipeDistance = defaultProps.minSwipeDistance,
96
+ edgeWidth = defaultProps.edgeWidth,
97
+ drawerLockMode = defaultProps.drawerLockMode,
98
+ overlayColor = defaultProps.overlayColor,
99
+ enableTrackpadTwoFingerGesture = defaultProps.enableTrackpadTwoFingerGesture,
100
+ activeCursor = defaultProps.activeCursor,
101
+ mouseButton = defaultProps.mouseButton,
102
+ statusBarAnimation = defaultProps.statusBarAnimation,
103
+ hideStatusBar,
104
+ keyboardDismissMode,
105
+ userSelect,
106
+ enableContextMenu,
107
+ renderNavigationView,
108
+ onDrawerSlide,
109
+ onDrawerClose,
110
+ onDrawerOpen,
111
+ onDrawerStateChanged
112
+ } = props;
113
+ const isFromLeft = drawerPosition === DrawerPosition.LEFT;
114
+ const sideCorrection = isFromLeft ? 1 : -1; // While closing the drawer when user starts gesture in the greyed out part of the window,
115
+ // we want the drawer to follow only once the finger reaches the edge of the drawer.
116
+ // See the diagram for reference. * = starting finger position, < = current finger position
117
+ // 1) +---------------+ 2) +---------------+ 3) +---------------+ 4) +---------------+
118
+ // |XXXXXXXX|......| |XXXXXXXX|......| |XXXXXXXX|......| |XXXXX|.........|
119
+ // |XXXXXXXX|......| |XXXXXXXX|......| |XXXXXXXX|......| |XXXXX|.........|
120
+ // |XXXXXXXX|..<*..| |XXXXXXXX|.<-*..| |XXXXXXXX|<--*..| |XXXXX|<-----*..|
121
+ // |XXXXXXXX|......| |XXXXXXXX|......| |XXXXXXXX|......| |XXXXX|.........|
122
+ // |XXXXXXXX|......| |XXXXXXXX|......| |XXXXXXXX|......| |XXXXX|.........|
123
+ // +---------------+ +---------------+ +---------------+ +---------------+
124
+
125
+ const openValue = (0, _reactNativeReanimated.useSharedValue)(0);
126
+ (0, _reactNativeReanimated.useDerivedValue)(() => {
127
+ onDrawerSlide && (0, _reactNativeReanimated.runOnJS)(onDrawerSlide)(openValue.value);
128
+ }, []);
129
+ const isDrawerOpen = (0, _reactNativeReanimated.useSharedValue)(false);
130
+
131
+ const handleContainerLayout = ({
132
+ nativeEvent
133
+ }) => {
134
+ setContainerWidth(nativeEvent.layout.width);
135
+ };
136
+
137
+ const emitStateChanged = (0, _react.useCallback)((newState, drawerWillShow) => {
138
+ 'worklet';
139
+
140
+ var _runOnJS;
141
+
142
+ onDrawerStateChanged && ((_runOnJS = (0, _reactNativeReanimated.runOnJS)(onDrawerStateChanged)) === null || _runOnJS === void 0 ? void 0 : _runOnJS(newState, drawerWillShow));
143
+ }, [onDrawerStateChanged]);
144
+ const drawerAnimatedProps = (0, _reactNativeReanimated.useAnimatedProps)(() => ({
145
+ accessibilityViewIsModal: isDrawerOpen.value
146
+ }));
147
+ const overlayAnimatedProps = (0, _reactNativeReanimated.useAnimatedProps)(() => ({
148
+ pointerEvents: isDrawerOpen.value ? 'auto' : 'none'
149
+ })); // While the drawer is hidden, it's hitSlop overflows onto the main view by edgeWidth
150
+ // This way it can be swiped open even when it's hidden
151
+
152
+ const [edgeHitSlop, setEdgeHitSlop] = (0, _react.useState)(isFromLeft ? {
153
+ left: 0,
154
+ width: edgeWidth
155
+ } : {
156
+ right: 0,
157
+ width: edgeWidth
158
+ }); // gestureOrientation is 1 if the gesture is expected to move from left to right and -1 otherwise
159
+
160
+ const gestureOrientation = (0, _react.useMemo)(() => sideCorrection * (drawerOpened ? -1 : 1), [sideCorrection, drawerOpened]);
161
+ (0, _react.useEffect)(() => {
162
+ setEdgeHitSlop(isFromLeft ? {
163
+ left: 0,
164
+ width: edgeWidth
165
+ } : {
166
+ right: 0,
167
+ width: edgeWidth
168
+ });
169
+ }, [isFromLeft, edgeWidth]);
170
+ const animateDrawer = (0, _react.useCallback)((toValue, initialVelocity, animationSpeed) => {
171
+ 'worklet';
172
+
173
+ const willShow = toValue !== 0;
174
+ isDrawerOpen.value = willShow;
175
+ emitStateChanged(DrawerState.SETTLING, willShow);
176
+ (0, _reactNativeReanimated.runOnJS)(setDrawerState)(DrawerState.SETTLING);
177
+
178
+ if (hideStatusBar) {
179
+ (0, _reactNativeReanimated.runOnJS)(_reactNative.StatusBar.setHidden)(willShow, statusBarAnimation);
180
+ }
181
+
182
+ const normalizedToValue = (0, _reactNativeReanimated.interpolate)(toValue, [0, drawerWidth], [0, 1], _reactNativeReanimated.Extrapolation.CLAMP);
183
+ const normalizedInitialVelocity = (0, _reactNativeReanimated.interpolate)(initialVelocity, [0, drawerWidth], [0, 1], _reactNativeReanimated.Extrapolation.CLAMP);
184
+ openValue.value = (0, _reactNativeReanimated.withSpring)(normalizedToValue, {
185
+ overshootClamping: true,
186
+ velocity: normalizedInitialVelocity,
187
+ mass: animationSpeed ? 1 / animationSpeed : 1,
188
+ damping: 40,
189
+ stiffness: 500
190
+ }, finished => {
191
+ if (finished) {
192
+ emitStateChanged(DrawerState.IDLE, willShow);
193
+ (0, _reactNativeReanimated.runOnJS)(setDrawerOpened)(willShow);
194
+ (0, _reactNativeReanimated.runOnJS)(setDrawerState)(DrawerState.IDLE);
195
+
196
+ if (willShow) {
197
+ var _runOnJS2;
198
+
199
+ onDrawerOpen && ((_runOnJS2 = (0, _reactNativeReanimated.runOnJS)(onDrawerOpen)) === null || _runOnJS2 === void 0 ? void 0 : _runOnJS2());
200
+ } else {
201
+ var _runOnJS3;
202
+
203
+ onDrawerClose && ((_runOnJS3 = (0, _reactNativeReanimated.runOnJS)(onDrawerClose)) === null || _runOnJS3 === void 0 ? void 0 : _runOnJS3());
204
+ }
205
+ }
206
+ });
207
+ }, [openValue, emitStateChanged, isDrawerOpen, hideStatusBar, onDrawerClose, onDrawerOpen, drawerWidth, statusBarAnimation]);
208
+ const handleRelease = (0, _react.useCallback)(event => {
209
+ 'worklet';
210
+
211
+ let {
212
+ translationX: dragX,
213
+ velocityX,
214
+ x: touchX
215
+ } = event;
216
+
217
+ if (drawerPosition !== DrawerPosition.LEFT) {
218
+ // See description in _updateAnimatedEvent about why events are flipped
219
+ // for right-side drawer
220
+ dragX = -dragX;
221
+ touchX = containerWidth - touchX;
222
+ velocityX = -velocityX;
223
+ }
224
+
225
+ const gestureStartX = touchX - dragX;
226
+ let dragOffsetBasedOnStart = 0;
227
+
228
+ if (drawerType === DrawerType.FRONT) {
229
+ dragOffsetBasedOnStart = gestureStartX > drawerWidth ? gestureStartX - drawerWidth : 0;
230
+ }
231
+
232
+ const startOffsetX = dragX + dragOffsetBasedOnStart + (isDrawerOpen.value ? drawerWidth : 0);
233
+ const projOffsetX = startOffsetX + DRAG_TOSS * velocityX;
234
+ const shouldOpen = projOffsetX > drawerWidth / 2;
235
+
236
+ if (shouldOpen) {
237
+ animateDrawer(drawerWidth, velocityX);
238
+ } else {
239
+ animateDrawer(0, velocityX);
240
+ }
241
+ }, [animateDrawer, containerWidth, drawerPosition, drawerType, drawerWidth, isDrawerOpen]);
242
+ const openDrawer = (0, _react.useCallback)((options = {}) => {
243
+ 'worklet';
244
+
245
+ var _options$initialVeloc;
246
+
247
+ animateDrawer(drawerWidth, (_options$initialVeloc = options.initialVelocity) !== null && _options$initialVeloc !== void 0 ? _options$initialVeloc : 0, options.animationSpeed);
248
+ }, [animateDrawer, drawerWidth]);
249
+ const closeDrawer = (0, _react.useCallback)((options = {}) => {
250
+ 'worklet';
251
+
252
+ var _options$initialVeloc2;
253
+
254
+ animateDrawer(0, (_options$initialVeloc2 = options.initialVelocity) !== null && _options$initialVeloc2 !== void 0 ? _options$initialVeloc2 : 0, options.animationSpeed);
255
+ }, [animateDrawer]);
256
+ const overlayDismissGesture = (0, _react.useMemo)(() => _gestureObjects.GestureObjects.Tap().maxDistance(25).onEnd(() => {
257
+ if (isDrawerOpen.value && drawerLockMode !== DrawerLockMode.LOCKED_OPEN) {
258
+ closeDrawer();
259
+ }
260
+ }), [closeDrawer, isDrawerOpen, drawerLockMode]);
261
+ const overlayAnimatedStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => ({
262
+ opacity: openValue.value,
263
+ backgroundColor: overlayColor
264
+ }));
265
+ const fillHitSlop = (0, _react.useMemo)(() => isFromLeft ? {
266
+ left: drawerWidth
267
+ } : {
268
+ right: drawerWidth
269
+ }, [drawerWidth, isFromLeft]);
270
+ const panGesture = (0, _react.useMemo)(() => {
271
+ return _gestureObjects.GestureObjects.Pan().activeCursor(activeCursor).mouseButton(mouseButton).hitSlop(drawerOpened ? fillHitSlop : edgeHitSlop).minDistance(drawerOpened ? 100 : 0).activeOffsetX(gestureOrientation * minSwipeDistance).failOffsetY([-15, 15]).simultaneousWithExternalGesture(overlayDismissGesture).enableTrackpadTwoFingerGesture(enableTrackpadTwoFingerGesture).enabled(drawerState !== DrawerState.SETTLING && (drawerOpened ? drawerLockMode !== DrawerLockMode.LOCKED_OPEN : drawerLockMode !== DrawerLockMode.LOCKED_CLOSED)).onStart(() => {
272
+ emitStateChanged(DrawerState.DRAGGING, false);
273
+ (0, _reactNativeReanimated.runOnJS)(setDrawerState)(DrawerState.DRAGGING);
274
+
275
+ if (keyboardDismissMode === DrawerKeyboardDismissMode.ON_DRAG) {
276
+ (0, _reactNativeReanimated.runOnJS)(_reactNative.Keyboard.dismiss)();
277
+ }
278
+
279
+ if (hideStatusBar) {
280
+ (0, _reactNativeReanimated.runOnJS)(_reactNative.StatusBar.setHidden)(true, statusBarAnimation);
281
+ }
282
+ }).onUpdate(event => {
283
+ const startedOutsideTranslation = isFromLeft ? (0, _reactNativeReanimated.interpolate)(event.x, [0, drawerWidth, drawerWidth + 1], [0, drawerWidth, drawerWidth]) : (0, _reactNativeReanimated.interpolate)(event.x - containerWidth, [-drawerWidth - 1, -drawerWidth, 0], [drawerWidth, drawerWidth, 0]);
284
+ const startedInsideTranslation = sideCorrection * (event.translationX + (drawerOpened ? drawerWidth * -gestureOrientation : 0));
285
+ const adjustedTranslation = Math.max(drawerOpened ? startedOutsideTranslation : 0, startedInsideTranslation);
286
+ openValue.value = (0, _reactNativeReanimated.interpolate)(adjustedTranslation, [-drawerWidth, 0, drawerWidth], [1, 0, 1], _reactNativeReanimated.Extrapolation.CLAMP);
287
+ }).onEnd(handleRelease);
288
+ }, [drawerLockMode, openValue, drawerWidth, emitStateChanged, gestureOrientation, handleRelease, edgeHitSlop, fillHitSlop, minSwipeDistance, hideStatusBar, keyboardDismissMode, overlayDismissGesture, drawerOpened, isFromLeft, containerWidth, sideCorrection, drawerState, activeCursor, enableTrackpadTwoFingerGesture, mouseButton, statusBarAnimation]); // When using RTL, row and row-reverse flex directions are flipped.
289
+
290
+ const reverseContentDirection = _reactNative.I18nManager.isRTL ? isFromLeft : !isFromLeft;
291
+ const dynamicDrawerStyles = {
292
+ backgroundColor: drawerBackgroundColor,
293
+ width: drawerWidth
294
+ };
295
+ const containerStyles = (0, _reactNativeReanimated.useAnimatedStyle)(() => {
296
+ if (drawerType === DrawerType.FRONT) {
297
+ return {};
298
+ }
299
+
300
+ return {
301
+ transform: [{
302
+ translateX: (0, _reactNativeReanimated.interpolate)(openValue.value, [0, 1], [0, drawerWidth * sideCorrection], _reactNativeReanimated.Extrapolation.CLAMP)
303
+ }]
304
+ };
305
+ });
306
+ const drawerAnimatedStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => {
307
+ const closedDrawerOffset = drawerWidth * -sideCorrection;
308
+ const isBack = drawerType === DrawerType.BACK;
309
+ const isIdle = drawerState === DrawerState.IDLE;
310
+
311
+ if (isBack) {
312
+ return {
313
+ transform: [{
314
+ translateX: 0
315
+ }],
316
+ flexDirection: reverseContentDirection ? 'row-reverse' : 'row'
317
+ };
318
+ }
319
+
320
+ let translateX = 0;
321
+
322
+ if (isIdle) {
323
+ translateX = drawerOpened ? 0 : closedDrawerOffset;
324
+ } else {
325
+ translateX = (0, _reactNativeReanimated.interpolate)(openValue.value, [0, 1], [closedDrawerOffset, 0], _reactNativeReanimated.Extrapolation.CLAMP);
326
+ }
327
+
328
+ return {
329
+ transform: [{
330
+ translateX
331
+ }],
332
+ flexDirection: reverseContentDirection ? 'row-reverse' : 'row'
333
+ };
334
+ });
335
+ const containerAnimatedProps = (0, _reactNativeReanimated.useAnimatedProps)(() => ({
336
+ importantForAccessibility: _reactNative.Platform.OS === 'android' ? isDrawerOpen.value ? 'no-hide-descendants' : 'yes' : undefined
337
+ }));
338
+ const children = typeof props.children === 'function' ? props.children(openValue) // renderer function
339
+ : props.children;
340
+ (0, _react.useImperativeHandle)(ref, () => ({
341
+ openDrawer,
342
+ closeDrawer
343
+ }), [openDrawer, closeDrawer]);
344
+ return /*#__PURE__*/_react.default.createElement(_GestureDetector.GestureDetector, {
345
+ gesture: panGesture,
346
+ userSelect: userSelect,
347
+ enableContextMenu: enableContextMenu
348
+ }, /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
349
+ style: styles.main,
350
+ onLayout: handleContainerLayout
351
+ }, /*#__PURE__*/_react.default.createElement(_GestureDetector.GestureDetector, {
352
+ gesture: overlayDismissGesture
353
+ }, /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
354
+ style: [drawerType === DrawerType.FRONT ? styles.containerOnBack : styles.containerInFront, containerStyles, contentContainerStyle],
355
+ animatedProps: containerAnimatedProps
356
+ }, children, /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
357
+ animatedProps: overlayAnimatedProps,
358
+ style: [styles.overlay, overlayAnimatedStyle]
359
+ }))), /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
360
+ pointerEvents: "box-none",
361
+ animatedProps: drawerAnimatedProps,
362
+ style: [styles.drawerContainer, drawerAnimatedStyle, drawerContainerStyle]
363
+ }, /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
364
+ style: dynamicDrawerStyles
365
+ }, renderNavigationView(openValue)))));
366
+ });
367
+ var _default = DrawerLayout;
368
+ exports.default = _default;
369
+
370
+ const styles = _reactNative.StyleSheet.create({
371
+ drawerContainer: { ..._reactNative.StyleSheet.absoluteFillObject,
372
+ zIndex: 1001,
373
+ flexDirection: 'row'
374
+ },
375
+ containerInFront: { ..._reactNative.StyleSheet.absoluteFillObject,
376
+ zIndex: 1002
377
+ },
378
+ containerOnBack: { ..._reactNative.StyleSheet.absoluteFillObject
379
+ },
380
+ main: {
381
+ flex: 1,
382
+ zIndex: 0,
383
+ overflow: 'hidden'
384
+ },
385
+ overlay: { ..._reactNative.StyleSheet.absoluteFillObject,
386
+ zIndex: 1000
387
+ }
388
+ });
389
+ //# sourceMappingURL=ReanimatedDrawerLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ReanimatedDrawerLayout.tsx"],"names":["DRAG_TOSS","DrawerPosition","DrawerState","DrawerType","DrawerLockMode","DrawerKeyboardDismissMode","defaultProps","drawerWidth","drawerPosition","LEFT","drawerType","FRONT","edgeWidth","minSwipeDistance","overlayColor","drawerLockMode","UNLOCKED","enableTrackpadTwoFingerGesture","activeCursor","mouseButton","MouseButton","statusBarAnimation","DrawerLayout","props","ref","containerWidth","setContainerWidth","drawerState","setDrawerState","IDLE","drawerOpened","setDrawerOpened","drawerBackgroundColor","drawerContainerStyle","contentContainerStyle","hideStatusBar","keyboardDismissMode","userSelect","enableContextMenu","renderNavigationView","onDrawerSlide","onDrawerClose","onDrawerOpen","onDrawerStateChanged","isFromLeft","sideCorrection","openValue","value","isDrawerOpen","handleContainerLayout","nativeEvent","layout","width","emitStateChanged","newState","drawerWillShow","drawerAnimatedProps","accessibilityViewIsModal","overlayAnimatedProps","pointerEvents","edgeHitSlop","setEdgeHitSlop","left","right","gestureOrientation","animateDrawer","toValue","initialVelocity","animationSpeed","willShow","SETTLING","StatusBar","setHidden","normalizedToValue","Extrapolation","CLAMP","normalizedInitialVelocity","overshootClamping","velocity","mass","damping","stiffness","finished","handleRelease","event","translationX","dragX","velocityX","x","touchX","gestureStartX","dragOffsetBasedOnStart","startOffsetX","projOffsetX","shouldOpen","openDrawer","options","closeDrawer","overlayDismissGesture","Gesture","Tap","maxDistance","onEnd","LOCKED_OPEN","overlayAnimatedStyle","opacity","backgroundColor","fillHitSlop","panGesture","Pan","hitSlop","minDistance","activeOffsetX","failOffsetY","simultaneousWithExternalGesture","enabled","LOCKED_CLOSED","onStart","DRAGGING","ON_DRAG","Keyboard","dismiss","onUpdate","startedOutsideTranslation","startedInsideTranslation","adjustedTranslation","Math","max","reverseContentDirection","I18nManager","isRTL","dynamicDrawerStyles","containerStyles","transform","translateX","drawerAnimatedStyle","closedDrawerOffset","isBack","BACK","isIdle","flexDirection","containerAnimatedProps","importantForAccessibility","Platform","OS","undefined","children","styles","main","containerOnBack","containerInFront","overlay","drawerContainer","StyleSheet","create","absoluteFillObject","zIndex","flex","overflow"],"mappings":"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","sourcesContent":["// This component is based on RN's DrawerLayoutAndroid API\n// It's cross-compatible with all platforms despite\n// `DrawerLayoutAndroid` only being available on android\n\nimport React, {\n ReactNode,\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n} from 'react';\n\nimport {\n StyleSheet,\n Keyboard,\n StatusBar,\n I18nManager,\n StatusBarAnimation,\n StyleProp,\n ViewStyle,\n LayoutChangeEvent,\n Platform,\n} from 'react-native';\n\nimport Animated, {\n Extrapolation,\n SharedValue,\n interpolate,\n runOnJS,\n useAnimatedProps,\n useAnimatedStyle,\n useDerivedValue,\n useSharedValue,\n withSpring,\n} from 'react-native-reanimated';\n\nimport { GestureObjects as Gesture } from '../handlers/gestures/gestureObjects';\nimport { GestureDetector } from '../handlers/gestures/GestureDetector';\nimport {\n UserSelect,\n ActiveCursor,\n MouseButton,\n HitSlop,\n GestureStateChangeEvent,\n} from '../handlers/gestureHandlerCommon';\nimport { PanGestureHandlerEventPayload } from '../handlers/GestureHandlerEventPayload';\n\nconst DRAG_TOSS = 0.05;\n\nexport enum DrawerPosition {\n LEFT,\n RIGHT,\n}\n\nexport enum DrawerState {\n IDLE,\n DRAGGING,\n SETTLING,\n}\n\nexport enum DrawerType {\n FRONT,\n BACK,\n SLIDE,\n}\n\nexport enum DrawerLockMode {\n UNLOCKED,\n LOCKED_CLOSED,\n LOCKED_OPEN,\n}\n\nexport enum DrawerKeyboardDismissMode {\n NONE,\n ON_DRAG,\n}\n\nexport interface DrawerLayoutProps {\n /**\n * This attribute is present in the native android implementation already and is one\n * of the required params. The gesture handler version of DrawerLayout makes it\n * possible for the function passed as `renderNavigationView` to take an\n * Animated value as a parameter that indicates the progress of drawer\n * opening/closing animation (progress value is 0 when closed and 1 when\n * opened). This can be used by the drawer component to animated its children\n * while the drawer is opening or closing.\n */\n renderNavigationView: (\n progressAnimatedValue: SharedValue<number>\n ) => ReactNode;\n\n /**\n * Determines the side from which the drawer will open.\n */\n drawerPosition?: DrawerPosition;\n\n /**\n * Width of the drawer.\n */\n drawerWidth?: number;\n\n /**\n * Background color of the drawer.\n */\n drawerBackgroundColor?: string;\n\n /**\n * Specifies the lock mode of the drawer.\n * Programatic opening/closing isn't affected by the lock mode. Defaults to `UNLOCKED`.\n * - `UNLOCKED` - the drawer will respond to gestures.\n * - `LOCKED_CLOSED` - the drawer will move freely until it settles in a closed position, then the gestures will be disabled.\n * - `LOCKED_OPEN` - the drawer will move freely until it settles in an opened position, then the gestures will be disabled.\n */\n drawerLockMode?: DrawerLockMode;\n\n /**\n * Determines if system keyboard should be closed upon dragging the drawer.\n */\n keyboardDismissMode?: DrawerKeyboardDismissMode;\n\n /**\n * Called when the drawer is closed.\n */\n onDrawerClose?: () => void;\n\n /**\n * Called when the drawer is opened.\n */\n onDrawerOpen?: () => void;\n\n /**\n * Called when the status of the drawer changes.\n */\n onDrawerStateChanged?: (\n newState: DrawerState,\n drawerWillShow: boolean\n ) => void;\n\n /**\n * Type of animation that will play when opening the drawer.\n */\n drawerType?: DrawerType;\n\n /**\n * Defines how far from the edge of the content view the gesture should\n * activate.\n */\n edgeWidth?: number;\n\n /**\n * Minimal distance to swipe before the drawer starts moving.\n */\n minSwipeDistance?: number;\n\n /**\n * When set to true Drawer component will use\n * {@link https://reactnative.dev/docs/statusbar StatusBar} API to hide the OS\n * status bar whenever the drawer is pulled or when its in an \"open\" state.\n */\n hideStatusBar?: boolean;\n\n /**\n * @default 'slide'\n *\n * Can be used when hideStatusBar is set to true and will select the animation\n * used for hiding/showing the status bar. See\n * {@link https://reactnative.dev/docs/statusbar StatusBar} documentation for\n * more details\n */\n statusBarAnimation?: StatusBarAnimation;\n\n /**\n * @default 'rgba(0, 0, 0, 0.7)'\n *\n * Color of the background overlay.\n * Animated from `0%` to `100%` as the drawer opens.\n */\n overlayColor?: string;\n\n /**\n * Style wrapping the content.\n */\n contentContainerStyle?: StyleProp<ViewStyle>;\n\n /**\n * Style wrapping the drawer.\n */\n drawerContainerStyle?: StyleProp<ViewStyle>;\n\n /**\n * Enables two-finger gestures on supported devices, for example iPads with\n * trackpads. If not enabled the gesture will require click + drag, with\n * `enableTrackpadTwoFingerGesture` swiping with two fingers will also trigger\n * the gesture.\n */\n enableTrackpadTwoFingerGesture?: boolean;\n\n onDrawerSlide?: (position: number) => void;\n\n // Implicit `children` prop has been removed in @types/react^18.0.\n /**\n * Elements that will be rendered inside the content view.\n */\n children?: ReactNode | ((openValue?: SharedValue<number>) => ReactNode);\n\n /**\n * @default 'none'\n * Sets whether the text inside both the drawer and the context window can be selected.\n * Values: 'none' | 'text' | 'auto'\n */\n userSelect?: UserSelect;\n\n /**\n * @default 'auto'\n * Sets the displayed cursor pictogram when the drawer is being dragged.\n * Values: see CSS cursor values\n */\n activeCursor?: ActiveCursor;\n\n /**\n * @default 'MouseButton.LEFT'\n * Allows to choose which mouse button should underlying pan handler react to.\n */\n mouseButton?: MouseButton;\n\n /**\n * @default 'false if MouseButton.RIGHT is specified'\n * Allows to enable/disable context menu.\n */\n enableContextMenu?: boolean;\n}\n\nexport type DrawerMovementOption = {\n initialVelocity?: number;\n animationSpeed?: number;\n};\n\nexport interface DrawerLayoutMethods {\n openDrawer: (options?: DrawerMovementOption) => void;\n closeDrawer: (options?: DrawerMovementOption) => void;\n}\n\nconst defaultProps = {\n drawerWidth: 200,\n drawerPosition: DrawerPosition.LEFT,\n drawerType: DrawerType.FRONT,\n edgeWidth: 20,\n minSwipeDistance: 3,\n overlayColor: 'rgba(0, 0, 0, 0.7)',\n drawerLockMode: DrawerLockMode.UNLOCKED,\n enableTrackpadTwoFingerGesture: false,\n activeCursor: 'auto' as ActiveCursor,\n mouseButton: MouseButton.LEFT,\n statusBarAnimation: 'slide' as StatusBarAnimation,\n};\n\nconst DrawerLayout = forwardRef<DrawerLayoutMethods, DrawerLayoutProps>(\n function DrawerLayout(props: DrawerLayoutProps, ref) {\n const [containerWidth, setContainerWidth] = useState(0);\n const [drawerState, setDrawerState] = useState<DrawerState>(\n DrawerState.IDLE\n );\n const [drawerOpened, setDrawerOpened] = useState(false);\n\n const {\n drawerPosition = defaultProps.drawerPosition,\n drawerWidth = defaultProps.drawerWidth,\n drawerType = defaultProps.drawerType,\n drawerBackgroundColor,\n drawerContainerStyle,\n contentContainerStyle,\n minSwipeDistance = defaultProps.minSwipeDistance,\n edgeWidth = defaultProps.edgeWidth,\n drawerLockMode = defaultProps.drawerLockMode,\n overlayColor = defaultProps.overlayColor,\n enableTrackpadTwoFingerGesture = defaultProps.enableTrackpadTwoFingerGesture,\n activeCursor = defaultProps.activeCursor,\n mouseButton = defaultProps.mouseButton,\n statusBarAnimation = defaultProps.statusBarAnimation,\n hideStatusBar,\n keyboardDismissMode,\n userSelect,\n enableContextMenu,\n renderNavigationView,\n onDrawerSlide,\n onDrawerClose,\n onDrawerOpen,\n onDrawerStateChanged,\n } = props;\n\n const isFromLeft = drawerPosition === DrawerPosition.LEFT;\n\n const sideCorrection = isFromLeft ? 1 : -1;\n\n // While closing the drawer when user starts gesture in the greyed out part of the window,\n // we want the drawer to follow only once the finger reaches the edge of the drawer.\n // See the diagram for reference. * = starting finger position, < = current finger position\n // 1) +---------------+ 2) +---------------+ 3) +---------------+ 4) +---------------+\n // |XXXXXXXX|......| |XXXXXXXX|......| |XXXXXXXX|......| |XXXXX|.........|\n // |XXXXXXXX|......| |XXXXXXXX|......| |XXXXXXXX|......| |XXXXX|.........|\n // |XXXXXXXX|..<*..| |XXXXXXXX|.<-*..| |XXXXXXXX|<--*..| |XXXXX|<-----*..|\n // |XXXXXXXX|......| |XXXXXXXX|......| |XXXXXXXX|......| |XXXXX|.........|\n // |XXXXXXXX|......| |XXXXXXXX|......| |XXXXXXXX|......| |XXXXX|.........|\n // +---------------+ +---------------+ +---------------+ +---------------+\n\n const openValue = useSharedValue<number>(0);\n\n useDerivedValue(() => {\n onDrawerSlide && runOnJS(onDrawerSlide)(openValue.value);\n }, []);\n\n const isDrawerOpen = useSharedValue(false);\n\n const handleContainerLayout = ({ nativeEvent }: LayoutChangeEvent) => {\n setContainerWidth(nativeEvent.layout.width);\n };\n\n const emitStateChanged = useCallback(\n (newState: DrawerState, drawerWillShow: boolean) => {\n 'worklet';\n onDrawerStateChanged &&\n runOnJS(onDrawerStateChanged)?.(newState, drawerWillShow);\n },\n [onDrawerStateChanged]\n );\n\n const drawerAnimatedProps = useAnimatedProps(() => ({\n accessibilityViewIsModal: isDrawerOpen.value,\n }));\n\n const overlayAnimatedProps = useAnimatedProps(() => ({\n pointerEvents: isDrawerOpen.value ? ('auto' as const) : ('none' as const),\n }));\n\n // While the drawer is hidden, it's hitSlop overflows onto the main view by edgeWidth\n // This way it can be swiped open even when it's hidden\n const [edgeHitSlop, setEdgeHitSlop] = useState<HitSlop>(\n isFromLeft\n ? { left: 0, width: edgeWidth }\n : { right: 0, width: edgeWidth }\n );\n\n // gestureOrientation is 1 if the gesture is expected to move from left to right and -1 otherwise\n const gestureOrientation = useMemo(\n () => sideCorrection * (drawerOpened ? -1 : 1),\n [sideCorrection, drawerOpened]\n );\n\n useEffect(() => {\n setEdgeHitSlop(\n isFromLeft\n ? { left: 0, width: edgeWidth }\n : { right: 0, width: edgeWidth }\n );\n }, [isFromLeft, edgeWidth]);\n\n const animateDrawer = useCallback(\n (toValue: number, initialVelocity: number, animationSpeed?: number) => {\n 'worklet';\n const willShow = toValue !== 0;\n isDrawerOpen.value = willShow;\n\n emitStateChanged(DrawerState.SETTLING, willShow);\n runOnJS(setDrawerState)(DrawerState.SETTLING);\n\n if (hideStatusBar) {\n runOnJS(StatusBar.setHidden)(willShow, statusBarAnimation);\n }\n\n const normalizedToValue = interpolate(\n toValue,\n [0, drawerWidth],\n [0, 1],\n Extrapolation.CLAMP\n );\n\n const normalizedInitialVelocity = interpolate(\n initialVelocity,\n [0, drawerWidth],\n [0, 1],\n Extrapolation.CLAMP\n );\n\n openValue.value = withSpring(\n normalizedToValue,\n {\n overshootClamping: true,\n velocity: normalizedInitialVelocity,\n mass: animationSpeed ? 1 / animationSpeed : 1,\n damping: 40,\n stiffness: 500,\n },\n (finished) => {\n if (finished) {\n emitStateChanged(DrawerState.IDLE, willShow);\n runOnJS(setDrawerOpened)(willShow);\n runOnJS(setDrawerState)(DrawerState.IDLE);\n if (willShow) {\n onDrawerOpen && runOnJS(onDrawerOpen)?.();\n } else {\n onDrawerClose && runOnJS(onDrawerClose)?.();\n }\n }\n }\n );\n },\n [\n openValue,\n emitStateChanged,\n isDrawerOpen,\n hideStatusBar,\n onDrawerClose,\n onDrawerOpen,\n drawerWidth,\n statusBarAnimation,\n ]\n );\n\n const handleRelease = useCallback(\n (event: GestureStateChangeEvent<PanGestureHandlerEventPayload>) => {\n 'worklet';\n let { translationX: dragX, velocityX, x: touchX } = event;\n\n if (drawerPosition !== DrawerPosition.LEFT) {\n // See description in _updateAnimatedEvent about why events are flipped\n // for right-side drawer\n dragX = -dragX;\n touchX = containerWidth - touchX;\n velocityX = -velocityX;\n }\n\n const gestureStartX = touchX - dragX;\n let dragOffsetBasedOnStart = 0;\n\n if (drawerType === DrawerType.FRONT) {\n dragOffsetBasedOnStart =\n gestureStartX > drawerWidth ? gestureStartX - drawerWidth : 0;\n }\n\n const startOffsetX =\n dragX +\n dragOffsetBasedOnStart +\n (isDrawerOpen.value ? drawerWidth : 0);\n\n const projOffsetX = startOffsetX + DRAG_TOSS * velocityX;\n\n const shouldOpen = projOffsetX > drawerWidth / 2;\n\n if (shouldOpen) {\n animateDrawer(drawerWidth, velocityX);\n } else {\n animateDrawer(0, velocityX);\n }\n },\n [\n animateDrawer,\n containerWidth,\n drawerPosition,\n drawerType,\n drawerWidth,\n isDrawerOpen,\n ]\n );\n\n const openDrawer = useCallback(\n (options: DrawerMovementOption = {}) => {\n 'worklet';\n animateDrawer(\n drawerWidth,\n options.initialVelocity ?? 0,\n options.animationSpeed\n );\n },\n [animateDrawer, drawerWidth]\n );\n\n const closeDrawer = useCallback(\n (options: DrawerMovementOption = {}) => {\n 'worklet';\n animateDrawer(0, options.initialVelocity ?? 0, options.animationSpeed);\n },\n [animateDrawer]\n );\n\n const overlayDismissGesture = useMemo(\n () =>\n Gesture.Tap()\n .maxDistance(25)\n .onEnd(() => {\n if (\n isDrawerOpen.value &&\n drawerLockMode !== DrawerLockMode.LOCKED_OPEN\n ) {\n closeDrawer();\n }\n }),\n [closeDrawer, isDrawerOpen, drawerLockMode]\n );\n\n const overlayAnimatedStyle = useAnimatedStyle(() => ({\n opacity: openValue.value,\n backgroundColor: overlayColor,\n }));\n\n const fillHitSlop = useMemo(\n () => (isFromLeft ? { left: drawerWidth } : { right: drawerWidth }),\n [drawerWidth, isFromLeft]\n );\n\n const panGesture = useMemo(() => {\n return Gesture.Pan()\n .activeCursor(activeCursor)\n .mouseButton(mouseButton)\n .hitSlop(drawerOpened ? fillHitSlop : edgeHitSlop)\n .minDistance(drawerOpened ? 100 : 0)\n .activeOffsetX(gestureOrientation * minSwipeDistance)\n .failOffsetY([-15, 15])\n .simultaneousWithExternalGesture(overlayDismissGesture)\n .enableTrackpadTwoFingerGesture(enableTrackpadTwoFingerGesture)\n .enabled(\n drawerState !== DrawerState.SETTLING &&\n (drawerOpened\n ? drawerLockMode !== DrawerLockMode.LOCKED_OPEN\n : drawerLockMode !== DrawerLockMode.LOCKED_CLOSED)\n )\n .onStart(() => {\n emitStateChanged(DrawerState.DRAGGING, false);\n runOnJS(setDrawerState)(DrawerState.DRAGGING);\n if (keyboardDismissMode === DrawerKeyboardDismissMode.ON_DRAG) {\n runOnJS(Keyboard.dismiss)();\n }\n if (hideStatusBar) {\n runOnJS(StatusBar.setHidden)(true, statusBarAnimation);\n }\n })\n .onUpdate((event) => {\n const startedOutsideTranslation = isFromLeft\n ? interpolate(\n event.x,\n [0, drawerWidth, drawerWidth + 1],\n [0, drawerWidth, drawerWidth]\n )\n : interpolate(\n event.x - containerWidth,\n [-drawerWidth - 1, -drawerWidth, 0],\n [drawerWidth, drawerWidth, 0]\n );\n\n const startedInsideTranslation =\n sideCorrection *\n (event.translationX +\n (drawerOpened ? drawerWidth * -gestureOrientation : 0));\n\n const adjustedTranslation = Math.max(\n drawerOpened ? startedOutsideTranslation : 0,\n startedInsideTranslation\n );\n\n openValue.value = interpolate(\n adjustedTranslation,\n [-drawerWidth, 0, drawerWidth],\n [1, 0, 1],\n Extrapolation.CLAMP\n );\n })\n .onEnd(handleRelease);\n }, [\n drawerLockMode,\n openValue,\n drawerWidth,\n emitStateChanged,\n gestureOrientation,\n handleRelease,\n edgeHitSlop,\n fillHitSlop,\n minSwipeDistance,\n hideStatusBar,\n keyboardDismissMode,\n overlayDismissGesture,\n drawerOpened,\n isFromLeft,\n containerWidth,\n sideCorrection,\n drawerState,\n activeCursor,\n enableTrackpadTwoFingerGesture,\n mouseButton,\n statusBarAnimation,\n ]);\n\n // When using RTL, row and row-reverse flex directions are flipped.\n const reverseContentDirection = I18nManager.isRTL\n ? isFromLeft\n : !isFromLeft;\n\n const dynamicDrawerStyles = {\n backgroundColor: drawerBackgroundColor,\n width: drawerWidth,\n };\n\n const containerStyles = useAnimatedStyle(() => {\n if (drawerType === DrawerType.FRONT) {\n return {};\n }\n\n return {\n transform: [\n {\n translateX: interpolate(\n openValue.value,\n [0, 1],\n [0, drawerWidth * sideCorrection],\n Extrapolation.CLAMP\n ),\n },\n ],\n };\n });\n\n const drawerAnimatedStyle = useAnimatedStyle(() => {\n const closedDrawerOffset = drawerWidth * -sideCorrection;\n const isBack = drawerType === DrawerType.BACK;\n const isIdle = drawerState === DrawerState.IDLE;\n\n if (isBack) {\n return {\n transform: [{ translateX: 0 }],\n flexDirection: reverseContentDirection ? 'row-reverse' : 'row',\n };\n }\n\n let translateX = 0;\n\n if (isIdle) {\n translateX = drawerOpened ? 0 : closedDrawerOffset;\n } else {\n translateX = interpolate(\n openValue.value,\n [0, 1],\n [closedDrawerOffset, 0],\n Extrapolation.CLAMP\n );\n }\n\n return {\n transform: [{ translateX }],\n flexDirection: reverseContentDirection ? 'row-reverse' : 'row',\n };\n });\n\n const containerAnimatedProps = useAnimatedProps(() => ({\n importantForAccessibility:\n Platform.OS === 'android'\n ? isDrawerOpen.value\n ? ('no-hide-descendants' as const)\n : ('yes' as const)\n : undefined,\n }));\n\n const children =\n typeof props.children === 'function'\n ? props.children(openValue) // renderer function\n : props.children;\n\n useImperativeHandle(\n ref,\n () => ({\n openDrawer,\n closeDrawer,\n }),\n [openDrawer, closeDrawer]\n );\n\n return (\n <GestureDetector\n gesture={panGesture}\n userSelect={userSelect}\n enableContextMenu={enableContextMenu}>\n <Animated.View style={styles.main} onLayout={handleContainerLayout}>\n <GestureDetector gesture={overlayDismissGesture}>\n <Animated.View\n style={[\n drawerType === DrawerType.FRONT\n ? styles.containerOnBack\n : styles.containerInFront,\n containerStyles,\n contentContainerStyle,\n ]}\n animatedProps={containerAnimatedProps}>\n {children}\n <Animated.View\n animatedProps={overlayAnimatedProps}\n style={[styles.overlay, overlayAnimatedStyle]}\n />\n </Animated.View>\n </GestureDetector>\n <Animated.View\n pointerEvents=\"box-none\"\n animatedProps={drawerAnimatedProps}\n style={[\n styles.drawerContainer,\n drawerAnimatedStyle,\n drawerContainerStyle,\n ]}>\n <Animated.View style={dynamicDrawerStyles}>\n {renderNavigationView(openValue)}\n </Animated.View>\n </Animated.View>\n </Animated.View>\n </GestureDetector>\n );\n }\n);\n\nexport default DrawerLayout;\n\nconst styles = StyleSheet.create({\n drawerContainer: {\n ...StyleSheet.absoluteFillObject,\n zIndex: 1001,\n flexDirection: 'row',\n },\n containerInFront: {\n ...StyleSheet.absoluteFillObject,\n zIndex: 1002,\n },\n containerOnBack: {\n ...StyleSheet.absoluteFillObject,\n },\n main: {\n flex: 1,\n zIndex: 0,\n overflow: 'hidden',\n },\n overlay: {\n ...StyleSheet.absoluteFillObject,\n zIndex: 1000,\n },\n});\n"]}