@react-navigation/drawer 6.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/lib/commonjs/index.js +104 -0
  4. package/lib/commonjs/index.js.map +1 -0
  5. package/lib/commonjs/navigators/createDrawerNavigator.js +95 -0
  6. package/lib/commonjs/navigators/createDrawerNavigator.js.map +1 -0
  7. package/lib/commonjs/types.js +6 -0
  8. package/lib/commonjs/types.js.map +1 -0
  9. package/lib/commonjs/utils/DrawerGestureContext.js +17 -0
  10. package/lib/commonjs/utils/DrawerGestureContext.js.map +1 -0
  11. package/lib/commonjs/utils/DrawerPositionContext.js +17 -0
  12. package/lib/commonjs/utils/DrawerPositionContext.js.map +1 -0
  13. package/lib/commonjs/utils/DrawerProgressContext.js +17 -0
  14. package/lib/commonjs/utils/DrawerProgressContext.js.map +1 -0
  15. package/lib/commonjs/utils/DrawerStatusContext.js +17 -0
  16. package/lib/commonjs/utils/DrawerStatusContext.js.map +1 -0
  17. package/lib/commonjs/utils/getDrawerStatusFromState.js +18 -0
  18. package/lib/commonjs/utils/getDrawerStatusFromState.js.map +1 -0
  19. package/lib/commonjs/utils/useDrawerProgress.js +27 -0
  20. package/lib/commonjs/utils/useDrawerProgress.js.map +1 -0
  21. package/lib/commonjs/utils/useDrawerStatus.js +31 -0
  22. package/lib/commonjs/utils/useDrawerStatus.js.map +1 -0
  23. package/lib/commonjs/views/DrawerContent.js +42 -0
  24. package/lib/commonjs/views/DrawerContent.js.map +1 -0
  25. package/lib/commonjs/views/DrawerContentScrollView.js +53 -0
  26. package/lib/commonjs/views/DrawerContentScrollView.js.map +1 -0
  27. package/lib/commonjs/views/DrawerItem.js +152 -0
  28. package/lib/commonjs/views/DrawerItem.js.map +1 -0
  29. package/lib/commonjs/views/DrawerItemList.js +70 -0
  30. package/lib/commonjs/views/DrawerItemList.js.map +1 -0
  31. package/lib/commonjs/views/DrawerToggleButton.js +64 -0
  32. package/lib/commonjs/views/DrawerToggleButton.js.map +1 -0
  33. package/lib/commonjs/views/DrawerView.js +282 -0
  34. package/lib/commonjs/views/DrawerView.js.map +1 -0
  35. package/lib/commonjs/views/GestureHandler.android.js +19 -0
  36. package/lib/commonjs/views/GestureHandler.android.js.map +1 -0
  37. package/lib/commonjs/views/GestureHandler.ios.js +19 -0
  38. package/lib/commonjs/views/GestureHandler.ios.js.map +1 -0
  39. package/lib/commonjs/views/GestureHandler.js +35 -0
  40. package/lib/commonjs/views/GestureHandler.js.map +1 -0
  41. package/lib/commonjs/views/GestureHandlerNative.js +50 -0
  42. package/lib/commonjs/views/GestureHandlerNative.js.map +1 -0
  43. package/lib/commonjs/views/ScreenFallback.js +62 -0
  44. package/lib/commonjs/views/ScreenFallback.js.map +1 -0
  45. package/lib/commonjs/views/assets/toggle-drawer-icon.png +0 -0
  46. package/lib/commonjs/views/assets/toggle-drawer-icon@1.5x.android.png +0 -0
  47. package/lib/commonjs/views/assets/toggle-drawer-icon@1.5x.ios.png +0 -0
  48. package/lib/commonjs/views/assets/toggle-drawer-icon@1x.android.png +0 -0
  49. package/lib/commonjs/views/assets/toggle-drawer-icon@1x.ios.png +0 -0
  50. package/lib/commonjs/views/assets/toggle-drawer-icon@2x.android.png +0 -0
  51. package/lib/commonjs/views/assets/toggle-drawer-icon@2x.ios.png +0 -0
  52. package/lib/commonjs/views/assets/toggle-drawer-icon@3x.android.png +0 -0
  53. package/lib/commonjs/views/assets/toggle-drawer-icon@3x.ios.png +0 -0
  54. package/lib/commonjs/views/assets/toggle-drawer-icon@4x.android.png +0 -0
  55. package/lib/commonjs/views/assets/toggle-drawer-icon@4x.ios.png +0 -0
  56. package/lib/commonjs/views/legacy/Drawer.js +455 -0
  57. package/lib/commonjs/views/legacy/Drawer.js.map +1 -0
  58. package/lib/commonjs/views/legacy/Overlay.js +79 -0
  59. package/lib/commonjs/views/legacy/Overlay.js.map +1 -0
  60. package/lib/commonjs/views/modern/Drawer.js +293 -0
  61. package/lib/commonjs/views/modern/Drawer.js.map +1 -0
  62. package/lib/commonjs/views/modern/Overlay.js +65 -0
  63. package/lib/commonjs/views/modern/Overlay.js.map +1 -0
  64. package/lib/module/index.js +27 -0
  65. package/lib/module/index.js.map +1 -0
  66. package/lib/module/navigators/createDrawerNavigator.js +77 -0
  67. package/lib/module/navigators/createDrawerNavigator.js.map +1 -0
  68. package/lib/module/types.js +2 -0
  69. package/lib/module/types.js.map +1 -0
  70. package/lib/module/utils/DrawerGestureContext.js +3 -0
  71. package/lib/module/utils/DrawerGestureContext.js.map +1 -0
  72. package/lib/module/utils/DrawerPositionContext.js +3 -0
  73. package/lib/module/utils/DrawerPositionContext.js.map +1 -0
  74. package/lib/module/utils/DrawerProgressContext.js +3 -0
  75. package/lib/module/utils/DrawerProgressContext.js.map +1 -0
  76. package/lib/module/utils/DrawerStatusContext.js +4 -0
  77. package/lib/module/utils/DrawerStatusContext.js.map +1 -0
  78. package/lib/module/utils/getDrawerStatusFromState.js +11 -0
  79. package/lib/module/utils/getDrawerStatusFromState.js.map +1 -0
  80. package/lib/module/utils/useDrawerProgress.js +12 -0
  81. package/lib/module/utils/useDrawerProgress.js.map +1 -0
  82. package/lib/module/utils/useDrawerStatus.js +17 -0
  83. package/lib/module/utils/useDrawerStatus.js.map +1 -0
  84. package/lib/module/views/DrawerContent.js +26 -0
  85. package/lib/module/views/DrawerContent.js.map +1 -0
  86. package/lib/module/views/DrawerContentScrollView.js +34 -0
  87. package/lib/module/views/DrawerContentScrollView.js.map +1 -0
  88. package/lib/module/views/DrawerItem.js +132 -0
  89. package/lib/module/views/DrawerItem.js.map +1 -0
  90. package/lib/module/views/DrawerItemList.js +55 -0
  91. package/lib/module/views/DrawerItemList.js.map +1 -0
  92. package/lib/module/views/DrawerToggleButton.js +48 -0
  93. package/lib/module/views/DrawerToggleButton.js.map +1 -0
  94. package/lib/module/views/DrawerView.js +256 -0
  95. package/lib/module/views/DrawerView.js.map +1 -0
  96. package/lib/module/views/GestureHandler.android.js +2 -0
  97. package/lib/module/views/GestureHandler.android.js.map +1 -0
  98. package/lib/module/views/GestureHandler.ios.js +2 -0
  99. package/lib/module/views/GestureHandler.ios.js.map +1 -0
  100. package/lib/module/views/GestureHandler.js +19 -0
  101. package/lib/module/views/GestureHandler.js.map +1 -0
  102. package/lib/module/views/GestureHandlerNative.js +11 -0
  103. package/lib/module/views/GestureHandlerNative.js.map +1 -0
  104. package/lib/module/views/ScreenFallback.js +44 -0
  105. package/lib/module/views/ScreenFallback.js.map +1 -0
  106. package/lib/module/views/assets/toggle-drawer-icon.png +0 -0
  107. package/lib/module/views/assets/toggle-drawer-icon@1.5x.android.png +0 -0
  108. package/lib/module/views/assets/toggle-drawer-icon@1.5x.ios.png +0 -0
  109. package/lib/module/views/assets/toggle-drawer-icon@1x.android.png +0 -0
  110. package/lib/module/views/assets/toggle-drawer-icon@1x.ios.png +0 -0
  111. package/lib/module/views/assets/toggle-drawer-icon@2x.android.png +0 -0
  112. package/lib/module/views/assets/toggle-drawer-icon@2x.ios.png +0 -0
  113. package/lib/module/views/assets/toggle-drawer-icon@3x.android.png +0 -0
  114. package/lib/module/views/assets/toggle-drawer-icon@3x.ios.png +0 -0
  115. package/lib/module/views/assets/toggle-drawer-icon@4x.android.png +0 -0
  116. package/lib/module/views/assets/toggle-drawer-icon@4x.ios.png +0 -0
  117. package/lib/module/views/legacy/Drawer.js +430 -0
  118. package/lib/module/views/legacy/Drawer.js.map +1 -0
  119. package/lib/module/views/legacy/Overlay.js +59 -0
  120. package/lib/module/views/legacy/Overlay.js.map +1 -0
  121. package/lib/module/views/modern/Drawer.js +272 -0
  122. package/lib/module/views/modern/Drawer.js.map +1 -0
  123. package/lib/module/views/modern/Overlay.js +47 -0
  124. package/lib/module/views/modern/Overlay.js.map +1 -0
  125. package/lib/typescript/src/index.d.ts +25 -0
  126. package/lib/typescript/src/navigators/createDrawerNavigator.d.ts +7 -0
  127. package/lib/typescript/src/types.d.ts +235 -0
  128. package/lib/typescript/src/utils/DrawerGestureContext.d.ts +3 -0
  129. package/lib/typescript/src/utils/DrawerPositionContext.d.ts +3 -0
  130. package/lib/typescript/src/utils/DrawerProgressContext.d.ts +4 -0
  131. package/lib/typescript/src/utils/DrawerStatusContext.d.ts +3 -0
  132. package/lib/typescript/src/utils/getDrawerStatusFromState.d.ts +2 -0
  133. package/lib/typescript/src/utils/useDrawerProgress.d.ts +2 -0
  134. package/lib/typescript/src/utils/useDrawerStatus.d.ts +5 -0
  135. package/lib/typescript/src/views/DrawerContent.d.ts +3 -0
  136. package/lib/typescript/src/views/DrawerContentScrollView.d.ts +6 -0
  137. package/lib/typescript/src/views/DrawerItem.d.ts +74 -0
  138. package/lib/typescript/src/views/DrawerItemList.d.ts +13 -0
  139. package/lib/typescript/src/views/DrawerToggleButton.d.ts +9 -0
  140. package/lib/typescript/src/views/DrawerView.d.ts +10 -0
  141. package/lib/typescript/src/views/GestureHandler.android.d.ts +1 -0
  142. package/lib/typescript/src/views/GestureHandler.d.ts +14 -0
  143. package/lib/typescript/src/views/GestureHandler.ios.d.ts +1 -0
  144. package/lib/typescript/src/views/GestureHandlerNative.d.ts +4 -0
  145. package/lib/typescript/src/views/ScreenFallback.d.ts +14 -0
  146. package/lib/typescript/src/views/legacy/Drawer.d.ts +44 -0
  147. package/lib/typescript/src/views/legacy/Overlay.d.ts +68 -0
  148. package/lib/typescript/src/views/modern/Drawer.d.ts +3 -0
  149. package/lib/typescript/src/views/modern/Overlay.d.ts +68 -0
  150. package/package.json +87 -0
  151. package/src/index.tsx +34 -0
  152. package/src/navigators/createDrawerNavigator.tsx +134 -0
  153. package/src/types.tsx +300 -0
  154. package/src/utils/DrawerGestureContext.tsx +3 -0
  155. package/src/utils/DrawerPositionContext.tsx +3 -0
  156. package/src/utils/DrawerProgressContext.tsx +6 -0
  157. package/src/utils/DrawerStatusContext.tsx +6 -0
  158. package/src/utils/getDrawerStatusFromState.tsx +20 -0
  159. package/src/utils/useDrawerProgress.tsx +18 -0
  160. package/src/utils/useDrawerStatus.tsx +19 -0
  161. package/src/views/DrawerContent.tsx +27 -0
  162. package/src/views/DrawerContentScrollView.tsx +52 -0
  163. package/src/views/DrawerItem.tsx +227 -0
  164. package/src/views/DrawerItemList.tsx +80 -0
  165. package/src/views/DrawerToggleButton.tsx +54 -0
  166. package/src/views/DrawerView.tsx +313 -0
  167. package/src/views/GestureHandler.android.tsx +1 -0
  168. package/src/views/GestureHandler.ios.tsx +1 -0
  169. package/src/views/GestureHandler.tsx +29 -0
  170. package/src/views/GestureHandlerNative.tsx +24 -0
  171. package/src/views/ScreenFallback.tsx +48 -0
  172. package/src/views/assets/toggle-drawer-icon.png +0 -0
  173. package/src/views/assets/toggle-drawer-icon@1.5x.android.png +0 -0
  174. package/src/views/assets/toggle-drawer-icon@1.5x.ios.png +0 -0
  175. package/src/views/assets/toggle-drawer-icon@1x.android.png +0 -0
  176. package/src/views/assets/toggle-drawer-icon@1x.ios.png +0 -0
  177. package/src/views/assets/toggle-drawer-icon@2x.android.png +0 -0
  178. package/src/views/assets/toggle-drawer-icon@2x.ios.png +0 -0
  179. package/src/views/assets/toggle-drawer-icon@3x.android.png +0 -0
  180. package/src/views/assets/toggle-drawer-icon@3x.ios.png +0 -0
  181. package/src/views/assets/toggle-drawer-icon@4x.android.png +0 -0
  182. package/src/views/assets/toggle-drawer-icon@4x.ios.png +0 -0
  183. package/src/views/legacy/Drawer.tsx +659 -0
  184. package/src/views/legacy/Overlay.tsx +74 -0
  185. package/src/views/modern/Drawer.tsx +385 -0
  186. package/src/views/modern/Overlay.tsx +56 -0
@@ -0,0 +1,313 @@
1
+ import {
2
+ getHeaderTitle,
3
+ Header,
4
+ SafeAreaProviderCompat,
5
+ Screen,
6
+ } from '@react-navigation/elements';
7
+ import {
8
+ DrawerActions,
9
+ DrawerNavigationState,
10
+ ParamListBase,
11
+ useTheme,
12
+ } from '@react-navigation/native';
13
+ import * as React from 'react';
14
+ import {
15
+ BackHandler,
16
+ I18nManager,
17
+ Platform,
18
+ StyleSheet,
19
+ View,
20
+ } from 'react-native';
21
+ import Animated from 'react-native-reanimated';
22
+ import { useSafeAreaFrame } from 'react-native-safe-area-context';
23
+
24
+ import type {
25
+ DrawerContentComponentProps,
26
+ DrawerDescriptorMap,
27
+ DrawerHeaderProps,
28
+ DrawerNavigationConfig,
29
+ DrawerNavigationHelpers,
30
+ DrawerNavigationProp,
31
+ DrawerProps,
32
+ } from '../types';
33
+ import DrawerPositionContext from '../utils/DrawerPositionContext';
34
+ import DrawerStatusContext from '../utils/DrawerStatusContext';
35
+ import getDrawerStatusFromState from '../utils/getDrawerStatusFromState';
36
+ import DrawerContent from './DrawerContent';
37
+ import DrawerToggleButton from './DrawerToggleButton';
38
+ import { GestureHandlerRootView } from './GestureHandler';
39
+ import { MaybeScreen, MaybeScreenContainer } from './ScreenFallback';
40
+
41
+ type Props = DrawerNavigationConfig & {
42
+ state: DrawerNavigationState<ParamListBase>;
43
+ navigation: DrawerNavigationHelpers;
44
+ descriptors: DrawerDescriptorMap;
45
+ };
46
+
47
+ const getDefaultDrawerWidth = ({
48
+ height,
49
+ width,
50
+ }: {
51
+ height: number;
52
+ width: number;
53
+ }) => {
54
+ /*
55
+ * Default drawer width is screen width - header height
56
+ * with a max width of 280 on mobile and 320 on tablet
57
+ * https://material.io/components/navigation-drawer
58
+ */
59
+ const smallerAxisSize = Math.min(height, width);
60
+ const isLandscape = width > height;
61
+ const isTablet = smallerAxisSize >= 600;
62
+ const appBarHeight = Platform.OS === 'ios' ? (isLandscape ? 32 : 44) : 56;
63
+ const maxWidth = isTablet ? 320 : 280;
64
+
65
+ return Math.min(smallerAxisSize - appBarHeight, maxWidth);
66
+ };
67
+
68
+ const GestureHandlerWrapper = GestureHandlerRootView ?? View;
69
+
70
+ function DrawerViewBase({
71
+ state,
72
+ navigation,
73
+ descriptors,
74
+ drawerContent = (props: DrawerContentComponentProps) => (
75
+ <DrawerContent {...props} />
76
+ ),
77
+ detachInactiveScreens = Platform.OS === 'web' ||
78
+ Platform.OS === 'android' ||
79
+ Platform.OS === 'ios',
80
+ // Running in chrome debugger
81
+ // @ts-expect-error
82
+ useLegacyImplementation = !global.nativeCallSyncHook ||
83
+ // Reanimated 2 is not configured
84
+ // @ts-expect-error: the type definitions are incomplete
85
+ !Animated.isConfigured?.(),
86
+ }: Props) {
87
+ const Drawer: React.ComponentType<DrawerProps> = useLegacyImplementation
88
+ ? require('./legacy/Drawer').default
89
+ : require('./modern/Drawer').default;
90
+
91
+ const focusedRouteKey = state.routes[state.index].key;
92
+ const {
93
+ drawerHideStatusBarOnOpen = false,
94
+ drawerPosition = I18nManager.isRTL ? 'right' : 'left',
95
+ drawerStatusBarAnimation = 'slide',
96
+ drawerStyle,
97
+ drawerType = Platform.select({ ios: 'slide', default: 'front' }),
98
+ gestureHandlerProps,
99
+ keyboardDismissMode = 'on-drag',
100
+ overlayColor = 'rgba(0, 0, 0, 0.5)',
101
+ swipeEdgeWidth = 32,
102
+ swipeEnabled = Platform.OS !== 'web' &&
103
+ Platform.OS !== 'windows' &&
104
+ Platform.OS !== 'macos',
105
+ swipeMinDistance = 60,
106
+ } = descriptors[focusedRouteKey].options;
107
+
108
+ const [loaded, setLoaded] = React.useState([focusedRouteKey]);
109
+
110
+ if (!loaded.includes(focusedRouteKey)) {
111
+ setLoaded([...loaded, focusedRouteKey]);
112
+ }
113
+
114
+ const dimensions = useSafeAreaFrame();
115
+
116
+ const { colors } = useTheme();
117
+
118
+ const drawerStatus = getDrawerStatusFromState(state);
119
+
120
+ const handleDrawerOpen = React.useCallback(() => {
121
+ navigation.dispatch({
122
+ ...DrawerActions.openDrawer(),
123
+ target: state.key,
124
+ });
125
+ }, [navigation, state.key]);
126
+
127
+ const handleDrawerClose = React.useCallback(() => {
128
+ navigation.dispatch({
129
+ ...DrawerActions.closeDrawer(),
130
+ target: state.key,
131
+ });
132
+ }, [navigation, state.key]);
133
+
134
+ React.useEffect(() => {
135
+ if (drawerStatus !== 'open' || drawerType === 'permanent') {
136
+ return;
137
+ }
138
+
139
+ const handleClose = () => {
140
+ // We shouldn't handle the back button if the parent screen isn't focused
141
+ // This will avoid the drawer overriding event listeners from a focused screen
142
+ if (!navigation.isFocused()) {
143
+ return false;
144
+ }
145
+
146
+ handleDrawerClose();
147
+
148
+ return true;
149
+ };
150
+
151
+ const handleEscape = (e: KeyboardEvent) => {
152
+ if (e.key === 'Escape') {
153
+ handleClose();
154
+ }
155
+ };
156
+
157
+ // We only add the listeners when drawer opens
158
+ // This way we can make sure that the listener is added as late as possible
159
+ // This will make sure that our handler will run first when back button is pressed
160
+ const subscription = BackHandler.addEventListener(
161
+ 'hardwareBackPress',
162
+ handleClose
163
+ );
164
+
165
+ if (Platform.OS === 'web') {
166
+ document?.body?.addEventListener?.('keyup', handleEscape);
167
+ }
168
+
169
+ return () => {
170
+ subscription.remove();
171
+
172
+ if (Platform.OS === 'web') {
173
+ document?.body?.removeEventListener?.('keyup', handleEscape);
174
+ }
175
+ };
176
+ }, [drawerStatus, drawerType, handleDrawerClose, navigation]);
177
+
178
+ const renderDrawerContent = () => {
179
+ return (
180
+ <DrawerPositionContext.Provider value={drawerPosition}>
181
+ {drawerContent({
182
+ state: state,
183
+ navigation: navigation,
184
+ descriptors: descriptors,
185
+ })}
186
+ </DrawerPositionContext.Provider>
187
+ );
188
+ };
189
+
190
+ const renderSceneContent = () => {
191
+ return (
192
+ <MaybeScreenContainer
193
+ enabled={detachInactiveScreens}
194
+ style={styles.content}
195
+ >
196
+ {state.routes.map((route, index) => {
197
+ const descriptor = descriptors[route.key];
198
+ const { lazy = true, unmountOnBlur } = descriptor.options;
199
+ const isFocused = state.index === index;
200
+
201
+ if (unmountOnBlur && !isFocused) {
202
+ return null;
203
+ }
204
+
205
+ if (lazy && !loaded.includes(route.key) && !isFocused) {
206
+ // Don't render a lazy screen if we've never navigated to it
207
+ return null;
208
+ }
209
+
210
+ const {
211
+ header = ({ layout, options }: DrawerHeaderProps) => (
212
+ <Header
213
+ {...options}
214
+ layout={layout}
215
+ title={getHeaderTitle(options, route.name)}
216
+ headerLeft={
217
+ options.headerLeft ??
218
+ ((props) => <DrawerToggleButton {...props} />)
219
+ }
220
+ />
221
+ ),
222
+ sceneContainerStyle,
223
+ } = descriptor.options;
224
+
225
+ return (
226
+ <MaybeScreen
227
+ key={route.key}
228
+ style={[StyleSheet.absoluteFill, { zIndex: isFocused ? 0 : -1 }]}
229
+ visible={isFocused}
230
+ enabled={detachInactiveScreens}
231
+ >
232
+ <Screen
233
+ focused={isFocused}
234
+ route={descriptor.route}
235
+ navigation={descriptor.navigation}
236
+ headerShown={descriptor.options.headerShown}
237
+ headerTransparent={descriptor.options.headerTransparent}
238
+ headerStatusBarHeight={descriptor.options.headerStatusBarHeight}
239
+ header={header({
240
+ layout: dimensions,
241
+ route: descriptor.route,
242
+ navigation:
243
+ descriptor.navigation as DrawerNavigationProp<ParamListBase>,
244
+ options: descriptor.options,
245
+ })}
246
+ style={sceneContainerStyle}
247
+ >
248
+ {descriptor.render()}
249
+ </Screen>
250
+ </MaybeScreen>
251
+ );
252
+ })}
253
+ </MaybeScreenContainer>
254
+ );
255
+ };
256
+
257
+ return (
258
+ <DrawerStatusContext.Provider value={drawerStatus}>
259
+ <Drawer
260
+ open={drawerStatus !== 'closed'}
261
+ onOpen={handleDrawerOpen}
262
+ onClose={handleDrawerClose}
263
+ gestureHandlerProps={gestureHandlerProps}
264
+ swipeEnabled={swipeEnabled}
265
+ swipeEdgeWidth={swipeEdgeWidth}
266
+ swipeVelocityThreshold={500}
267
+ swipeDistanceThreshold={swipeMinDistance}
268
+ hideStatusBarOnOpen={drawerHideStatusBarOnOpen}
269
+ statusBarAnimation={drawerStatusBarAnimation}
270
+ keyboardDismissMode={keyboardDismissMode}
271
+ drawerType={drawerType}
272
+ drawerPosition={drawerPosition}
273
+ drawerStyle={[
274
+ {
275
+ width: getDefaultDrawerWidth(dimensions),
276
+ backgroundColor: colors.card,
277
+ },
278
+ drawerType === 'permanent' &&
279
+ (drawerPosition === 'left'
280
+ ? {
281
+ borderRightColor: colors.border,
282
+ borderRightWidth: StyleSheet.hairlineWidth,
283
+ }
284
+ : {
285
+ borderLeftColor: colors.border,
286
+ borderLeftWidth: StyleSheet.hairlineWidth,
287
+ }),
288
+ drawerStyle,
289
+ ]}
290
+ overlayStyle={{ backgroundColor: overlayColor }}
291
+ renderDrawerContent={renderDrawerContent}
292
+ renderSceneContent={renderSceneContent}
293
+ dimensions={dimensions}
294
+ />
295
+ </DrawerStatusContext.Provider>
296
+ );
297
+ }
298
+
299
+ export default function DrawerView({ navigation, ...rest }: Props) {
300
+ return (
301
+ <SafeAreaProviderCompat>
302
+ <GestureHandlerWrapper style={styles.content}>
303
+ <DrawerViewBase navigation={navigation} {...rest} />
304
+ </GestureHandlerWrapper>
305
+ </SafeAreaProviderCompat>
306
+ );
307
+ }
308
+
309
+ const styles = StyleSheet.create({
310
+ content: {
311
+ flex: 1,
312
+ },
313
+ });
@@ -0,0 +1 @@
1
+ export * from './GestureHandlerNative';
@@ -0,0 +1 @@
1
+ export * from './GestureHandlerNative';
@@ -0,0 +1,29 @@
1
+ import * as React from 'react';
2
+ import { View } from 'react-native';
3
+ import type {
4
+ PanGestureHandlerProperties,
5
+ TapGestureHandlerProperties,
6
+ } from 'react-native-gesture-handler';
7
+
8
+ const Dummy: any = ({ children }: { children: React.ReactNode }) => (
9
+ <>{children}</>
10
+ );
11
+
12
+ export const PanGestureHandler =
13
+ Dummy as React.ComponentType<PanGestureHandlerProperties>;
14
+
15
+ export const TapGestureHandler =
16
+ Dummy as React.ComponentType<TapGestureHandlerProperties>;
17
+
18
+ export const GestureHandlerRootView = View;
19
+
20
+ export const GestureState = {
21
+ UNDETERMINED: 0,
22
+ FAILED: 1,
23
+ BEGAN: 2,
24
+ CANCELLED: 3,
25
+ ACTIVE: 4,
26
+ END: 5,
27
+ };
28
+
29
+ export type { PanGestureHandlerGestureEvent } from 'react-native-gesture-handler';
@@ -0,0 +1,24 @@
1
+ import * as React from 'react';
2
+ import {
3
+ PanGestureHandler as PanGestureHandlerNative,
4
+ PanGestureHandlerProperties,
5
+ } from 'react-native-gesture-handler';
6
+
7
+ import DrawerGestureContext from '../utils/DrawerGestureContext';
8
+
9
+ export function PanGestureHandler(props: PanGestureHandlerProperties) {
10
+ const gestureRef = React.useRef<PanGestureHandlerNative>(null);
11
+
12
+ return (
13
+ <DrawerGestureContext.Provider value={gestureRef}>
14
+ <PanGestureHandlerNative {...props} />
15
+ </DrawerGestureContext.Provider>
16
+ );
17
+ }
18
+
19
+ export {
20
+ GestureHandlerRootView,
21
+ State as GestureState,
22
+ PanGestureHandlerGestureEvent,
23
+ TapGestureHandler,
24
+ } from 'react-native-gesture-handler';
@@ -0,0 +1,48 @@
1
+ import { ResourceSavingView } from '@react-navigation/elements';
2
+ import * as React from 'react';
3
+ import { StyleProp, View, ViewProps, ViewStyle } from 'react-native';
4
+
5
+ type Props = {
6
+ visible: boolean;
7
+ children: React.ReactNode;
8
+ enabled: boolean;
9
+ style?: StyleProp<ViewStyle>;
10
+ };
11
+
12
+ let Screens: typeof import('react-native-screens') | undefined;
13
+
14
+ try {
15
+ Screens = require('react-native-screens');
16
+ } catch (e) {
17
+ // Ignore
18
+ }
19
+
20
+ export const MaybeScreenContainer = ({
21
+ enabled,
22
+ ...rest
23
+ }: ViewProps & {
24
+ enabled: boolean;
25
+ children: React.ReactNode;
26
+ }) => {
27
+ if (Screens?.screensEnabled?.()) {
28
+ return <Screens.ScreenContainer enabled={enabled} {...rest} />;
29
+ }
30
+
31
+ return <View {...rest} />;
32
+ };
33
+
34
+ export function MaybeScreen({ visible, children, ...rest }: Props) {
35
+ if (Screens?.screensEnabled?.()) {
36
+ return (
37
+ <Screens.Screen activityState={visible ? 2 : 0} {...rest}>
38
+ {children}
39
+ </Screens.Screen>
40
+ );
41
+ }
42
+
43
+ return (
44
+ <ResourceSavingView visible={visible} {...rest}>
45
+ {children}
46
+ </ResourceSavingView>
47
+ );
48
+ }