react-native-gesture-handler 2.20.2 → 2.21.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/RNGestureHandler.podspec +9 -0
- package/ReanimatedDrawerLayout/package.json +6 -0
- package/android/build.gradle +19 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +6 -2
- package/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt +53 -21
- package/apple/RNGestureHandlerPointerTracker.m +4 -2
- package/lib/commonjs/RNGestureHandlerModule.web.js +15 -2
- package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/commonjs/components/Pressable/Pressable.js +2 -6
- package/lib/commonjs/components/Pressable/Pressable.js.map +1 -1
- package/lib/commonjs/components/ReanimatedDrawerLayout.js +389 -0
- package/lib/commonjs/components/ReanimatedDrawerLayout.js.map +1 -0
- package/lib/commonjs/components/ReanimatedSwipeable.js +117 -148
- package/lib/commonjs/components/ReanimatedSwipeable.js.map +1 -1
- package/lib/commonjs/findNodeHandle.js +12 -0
- package/lib/commonjs/findNodeHandle.js.map +1 -0
- package/lib/commonjs/findNodeHandle.web.js +40 -0
- package/lib/commonjs/findNodeHandle.web.js.map +1 -0
- package/lib/commonjs/handlers/createHandler.js +4 -2
- package/lib/commonjs/handlers/createHandler.js.map +1 -1
- package/lib/commonjs/handlers/gestures/GestureDetector/Wrap.web.js +51 -0
- package/lib/commonjs/handlers/gestures/GestureDetector/Wrap.web.js.map +1 -0
- package/lib/commonjs/handlers/gestures/GestureDetector/index.js +3 -1
- package/lib/commonjs/handlers/gestures/GestureDetector/index.js.map +1 -1
- package/lib/commonjs/handlers/gestures/GestureDetector/useDetectorUpdater.js +5 -3
- package/lib/commonjs/handlers/gestures/GestureDetector/useDetectorUpdater.js.map +1 -1
- package/lib/commonjs/handlers/gestures/GestureDetector/useViewRefHandler.js +4 -2
- package/lib/commonjs/handlers/gestures/GestureDetector/useViewRefHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/GestureHandler.js +4 -0
- package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/PanGestureHandler.js +59 -0
- package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
- package/lib/commonjs/web/interfaces.js +10 -1
- package/lib/commonjs/web/interfaces.js.map +1 -1
- package/lib/commonjs/web/tools/EventManager.js +6 -0
- package/lib/commonjs/web/tools/EventManager.js.map +1 -1
- package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +1 -3
- package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -1
- package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js +5 -2
- package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js.map +1 -1
- package/lib/commonjs/web/tools/KeyboardEventManager.js +2 -2
- package/lib/commonjs/web/tools/KeyboardEventManager.js.map +1 -1
- package/lib/commonjs/web/tools/PointerTracker.js +6 -30
- package/lib/commonjs/web/tools/PointerTracker.js.map +1 -1
- package/lib/commonjs/web/tools/WheelEventManager.js +74 -0
- package/lib/commonjs/web/tools/WheelEventManager.js.map +1 -0
- package/lib/commonjs/web/utils.js +16 -0
- package/lib/commonjs/web/utils.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.web.js +16 -3
- package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/module/components/Pressable/Pressable.js +2 -6
- package/lib/module/components/Pressable/Pressable.js.map +1 -1
- package/lib/module/components/ReanimatedDrawerLayout.js +365 -0
- package/lib/module/components/ReanimatedDrawerLayout.js.map +1 -0
- package/lib/module/components/ReanimatedSwipeable.js +119 -145
- package/lib/module/components/ReanimatedSwipeable.js.map +1 -1
- package/lib/module/findNodeHandle.js +3 -0
- package/lib/module/findNodeHandle.js.map +1 -0
- package/lib/module/findNodeHandle.web.js +32 -0
- package/lib/module/findNodeHandle.web.js.map +1 -0
- package/lib/module/handlers/createHandler.js +2 -1
- package/lib/module/handlers/createHandler.js.map +1 -1
- package/lib/module/handlers/gestures/GestureDetector/Wrap.web.js +34 -0
- package/lib/module/handlers/gestures/GestureDetector/Wrap.web.js.map +1 -0
- package/lib/module/handlers/gestures/GestureDetector/index.js +2 -1
- package/lib/module/handlers/gestures/GestureDetector/index.js.map +1 -1
- package/lib/module/handlers/gestures/GestureDetector/useDetectorUpdater.js +2 -2
- package/lib/module/handlers/gestures/GestureDetector/useDetectorUpdater.js.map +1 -1
- package/lib/module/handlers/gestures/GestureDetector/useViewRefHandler.js +1 -1
- package/lib/module/handlers/gestures/GestureDetector/useViewRefHandler.js.map +1 -1
- package/lib/module/web/handlers/GestureHandler.js +4 -0
- package/lib/module/web/handlers/GestureHandler.js.map +1 -1
- package/lib/module/web/handlers/PanGestureHandler.js +58 -0
- package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
- package/lib/module/web/interfaces.js +8 -0
- package/lib/module/web/interfaces.js.map +1 -1
- package/lib/module/web/tools/EventManager.js +6 -0
- package/lib/module/web/tools/EventManager.js.map +1 -1
- package/lib/module/web/tools/GestureHandlerOrchestrator.js +1 -3
- package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -1
- package/lib/module/web/tools/GestureHandlerWebDelegate.js +3 -1
- package/lib/module/web/tools/GestureHandlerWebDelegate.js.map +1 -1
- package/lib/module/web/tools/KeyboardEventManager.js +2 -2
- package/lib/module/web/tools/KeyboardEventManager.js.map +1 -1
- package/lib/module/web/tools/PointerTracker.js +6 -30
- package/lib/module/web/tools/PointerTracker.js.map +1 -1
- package/lib/module/web/tools/WheelEventManager.js +60 -0
- package/lib/module/web/tools/WheelEventManager.js.map +1 -0
- package/lib/module/web/utils.js +15 -0
- package/lib/module/web/utils.js.map +1 -1
- package/lib/typescript/components/ReanimatedDrawerLayout.d.ts +162 -0
- package/lib/typescript/components/ReanimatedSwipeable.d.ts +22 -16
- package/lib/typescript/findNodeHandle.d.ts +2 -0
- package/lib/typescript/findNodeHandle.web.d.ts +2 -0
- package/lib/typescript/handlers/gestures/GestureDetector/Wrap.web.d.ts +7 -0
- package/lib/typescript/web/handlers/GestureHandler.d.ts +2 -1
- package/lib/typescript/web/handlers/PanGestureHandler.d.ts +5 -0
- package/lib/typescript/web/interfaces.d.ts +16 -0
- package/lib/typescript/web/tools/EventManager.d.ts +2 -0
- package/lib/typescript/web/tools/PointerTracker.d.ts +2 -8
- package/lib/typescript/web/tools/WheelEventManager.d.ts +11 -0
- package/lib/typescript/web/utils.d.ts +2 -1
- package/package.json +3 -2
- package/src/RNGestureHandlerModule.web.ts +23 -4
- package/src/components/Pressable/Pressable.tsx +2 -6
- package/src/components/ReanimatedDrawerLayout.tsx +741 -0
- package/src/components/ReanimatedSwipeable.tsx +361 -305
- package/src/findNodeHandle.ts +3 -0
- package/src/findNodeHandle.web.ts +35 -0
- package/src/handlers/createHandler.tsx +2 -1
- package/src/handlers/gestures/GestureDetector/Wrap.web.tsx +44 -0
- package/src/handlers/gestures/GestureDetector/index.tsx +2 -1
- package/src/handlers/gestures/GestureDetector/useDetectorUpdater.ts +1 -1
- package/src/handlers/gestures/GestureDetector/useViewRefHandler.ts +1 -1
- package/src/web/handlers/GestureHandler.ts +5 -1
- package/src/web/handlers/PanGestureHandler.ts +69 -1
- package/src/web/interfaces.ts +17 -0
- package/src/web/tools/EventManager.ts +4 -0
- package/src/web/tools/GestureHandlerOrchestrator.ts +1 -7
- package/src/web/tools/GestureHandlerWebDelegate.ts +3 -1
- package/src/web/tools/KeyboardEventManager.ts +2 -2
- package/src/web/tools/PointerTracker.ts +6 -28
- package/src/web/tools/WheelEventManager.ts +48 -0
- 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"]}
|