@rn-tools/navigation 2.2.6 → 2.3.0
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/package.json +2 -3
- package/{README.md → readme.md} +0 -10
- package/src/stack.tsx +10 -16
- package/src/tabs.tsx +0 -5
- package/src/utils.ts +3 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rn-tools/navigation",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"main": "./src/index.ts",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"files": [
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"@typescript-eslint/parser": "^6.8.0",
|
|
23
23
|
"babel-preset-expo": "~11.0.0",
|
|
24
24
|
"eslint": "^8.56.0",
|
|
25
|
-
"expo": "
|
|
25
|
+
"expo": "~52.0.0",
|
|
26
26
|
"jest": "^29.7.0",
|
|
27
27
|
"jest-expo": "^51.0.2",
|
|
28
28
|
"lint-staged": "^15.2.0",
|
|
@@ -33,7 +33,6 @@
|
|
|
33
33
|
"peerDependencies": {
|
|
34
34
|
"react": "*",
|
|
35
35
|
"react-native": "*",
|
|
36
|
-
"react-native-safe-area-context": "*",
|
|
37
36
|
"react-native-screens": "*"
|
|
38
37
|
},
|
|
39
38
|
"dependencies": {
|
package/{README.md → readme.md}
RENAMED
|
@@ -29,12 +29,6 @@ A set of useful navigation components for React Native. Built with `react-native
|
|
|
29
29
|
yarn expo install @rn-tools/navigation react-native-screens
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
**Note:** It's recommended that you install and wrap your app in a `SafeAreaProvider` to ensure components are rendered correctly based on the device's insets:
|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
yarn expo install react-native-safe-area-context
|
|
36
|
-
```
|
|
37
|
-
|
|
38
32
|
## Basic Usage
|
|
39
33
|
|
|
40
34
|
For basic usage, the exported `Stack.Navigator` and `Tabs.Navigator` will get you up and running quickly.
|
|
@@ -117,14 +111,10 @@ import { Tabs, navigation, Stack } from "@rn-tools/navigation";
|
|
|
117
111
|
import * as React from "react";
|
|
118
112
|
import { View, Text, Button } from "react-native";
|
|
119
113
|
|
|
120
|
-
// It's recommended to wrap your App in a SafeAreaProvider once
|
|
121
|
-
import { SafeAreaProvider } from "react-native-safe-area-context";
|
|
122
114
|
|
|
123
115
|
export function BasicTabs() {
|
|
124
116
|
return (
|
|
125
|
-
<SafeAreaProvider>
|
|
126
117
|
<Stack.Navigator rootScreen={<MyTabs />} />
|
|
127
|
-
</SafeAreaProvider>
|
|
128
118
|
);
|
|
129
119
|
}
|
|
130
120
|
|
package/src/stack.tsx
CHANGED
|
@@ -31,7 +31,7 @@ import {
|
|
|
31
31
|
import { DEFAULT_SLOT_NAME } from "./navigation-reducer";
|
|
32
32
|
import { useNavigationDispatch, useNavigationState } from "./navigation-store";
|
|
33
33
|
import type { StackItem } from "./types";
|
|
34
|
-
import { generateStackId
|
|
34
|
+
import { generateStackId } from "./utils";
|
|
35
35
|
|
|
36
36
|
let StackIdContext = React.createContext<string>("");
|
|
37
37
|
let ScreenIdContext = React.createContext<string>("");
|
|
@@ -39,7 +39,7 @@ let ScreenIdContext = React.createContext<string>("");
|
|
|
39
39
|
// Component returned from `react-native-screens` references `react-navigation` data structures in recent updates
|
|
40
40
|
// This is a workaround to make it work with our custom navigation
|
|
41
41
|
let RNScreenStack = React.memo(function RNScreenStack(
|
|
42
|
-
props: RNScreenStackProps
|
|
42
|
+
props: RNScreenStackProps,
|
|
43
43
|
) {
|
|
44
44
|
let { children, gestureDetectorBridge, ...rest } = props;
|
|
45
45
|
let ref = React.useRef(null);
|
|
@@ -64,7 +64,7 @@ export type StackRootProps = {
|
|
|
64
64
|
|
|
65
65
|
let useStackInternal = (stackId = "") => {
|
|
66
66
|
let stack: StackItem | undefined = useNavigationState(
|
|
67
|
-
(state) => state.stacks.lookup[stackId]
|
|
67
|
+
(state) => state.stacks.lookup[stackId],
|
|
68
68
|
);
|
|
69
69
|
return stack;
|
|
70
70
|
};
|
|
@@ -132,7 +132,7 @@ export type StackScreensProps = RNScreenStackProps;
|
|
|
132
132
|
function StackScreens({ style: styleProp, ...props }: StackScreensProps) {
|
|
133
133
|
let style = React.useMemo(
|
|
134
134
|
() => styleProp || StyleSheet.absoluteFill,
|
|
135
|
-
[styleProp]
|
|
135
|
+
[styleProp],
|
|
136
136
|
);
|
|
137
137
|
|
|
138
138
|
return <RNScreenStack {...props} style={style} />;
|
|
@@ -144,8 +144,8 @@ let defaultScreenStyle: ViewStyle = {
|
|
|
144
144
|
};
|
|
145
145
|
|
|
146
146
|
export type StackScreenProps = RNScreenProps & {
|
|
147
|
-
header?: React.ReactElement<StackScreenHeaderProps
|
|
148
|
-
}
|
|
147
|
+
header?: React.ReactElement<StackScreenHeaderProps>;
|
|
148
|
+
};
|
|
149
149
|
|
|
150
150
|
let HeaderHeightContext = React.createContext<number>(0);
|
|
151
151
|
|
|
@@ -171,7 +171,7 @@ let StackScreen = React.memo(function StackScreen({
|
|
|
171
171
|
dispatch({ type: "POP_SCREEN_BY_KEY", key: screenId });
|
|
172
172
|
onDismissedProp?.(e);
|
|
173
173
|
},
|
|
174
|
-
[onDismissedProp, dispatch, screenId]
|
|
174
|
+
[onDismissedProp, dispatch, screenId],
|
|
175
175
|
);
|
|
176
176
|
|
|
177
177
|
React.useEffect(() => {
|
|
@@ -185,10 +185,6 @@ let StackScreen = React.memo(function StackScreen({
|
|
|
185
185
|
}
|
|
186
186
|
|
|
187
187
|
BackHandler.addEventListener("hardwareBackPress", backHandler);
|
|
188
|
-
|
|
189
|
-
return () => {
|
|
190
|
-
BackHandler.removeEventListener("hardwareBackPress", backHandler);
|
|
191
|
-
};
|
|
192
188
|
}, [gestureEnabled, stack, screenId, isActive, dispatch]);
|
|
193
189
|
|
|
194
190
|
let parentHeaderHeight = React.useContext(HeaderHeightContext);
|
|
@@ -202,7 +198,7 @@ let StackScreen = React.memo(function StackScreen({
|
|
|
202
198
|
setHeaderHeight(e.nativeEvent.headerHeight);
|
|
203
199
|
onHeaderHeightChangeProp?.(e);
|
|
204
200
|
},
|
|
205
|
-
[onHeaderHeightChangeProp]
|
|
201
|
+
[onHeaderHeightChangeProp],
|
|
206
202
|
);
|
|
207
203
|
|
|
208
204
|
let style = React.useMemo(
|
|
@@ -211,16 +207,14 @@ let StackScreen = React.memo(function StackScreen({
|
|
|
211
207
|
{ paddingTop: headerHeight || parentHeaderHeight },
|
|
212
208
|
styleProp,
|
|
213
209
|
],
|
|
214
|
-
[styleProp, headerHeight, parentHeaderHeight]
|
|
210
|
+
[styleProp, headerHeight, parentHeaderHeight],
|
|
215
211
|
);
|
|
216
212
|
|
|
217
213
|
return (
|
|
218
214
|
<HeaderHeightContext.Provider value={headerHeight}>
|
|
219
|
-
{/* @ts-expect-error - Ref typings in RNScreens */}
|
|
220
215
|
<RNScreen
|
|
221
216
|
{...props}
|
|
222
217
|
style={style}
|
|
223
|
-
activityState={isActive ? 2 : 0}
|
|
224
218
|
gestureEnabled={gestureEnabled}
|
|
225
219
|
onDismissed={onDismissed}
|
|
226
220
|
onHeaderHeightChange={onHeaderHeightChange}
|
|
@@ -293,7 +287,7 @@ let StackScreenHeaderRight = React.memo(function StackScreenHeaderRight({
|
|
|
293
287
|
let ScreenStackHeaderBackButtonImage = React.memo(
|
|
294
288
|
function ScreenStackHeaderBackButtonImage(props: ImageProps) {
|
|
295
289
|
return <RNScreenStackHeaderBackButtonImage {...props} />;
|
|
296
|
-
}
|
|
290
|
+
},
|
|
297
291
|
);
|
|
298
292
|
|
|
299
293
|
export type StackNavigatorProps = Omit<StackRootProps, "children"> & {
|
package/src/tabs.tsx
CHANGED
|
@@ -141,10 +141,6 @@ let TabsScreen = React.memo(function TabsScreen({
|
|
|
141
141
|
}
|
|
142
142
|
|
|
143
143
|
BackHandler.addEventListener("hardwareBackPress", backHandler);
|
|
144
|
-
|
|
145
|
-
return () => {
|
|
146
|
-
BackHandler.removeEventListener("hardwareBackPress", backHandler);
|
|
147
|
-
};
|
|
148
144
|
}, [tabId, dispatch, getNavigationStore]);
|
|
149
145
|
|
|
150
146
|
let style = React.useMemo(
|
|
@@ -153,7 +149,6 @@ let TabsScreen = React.memo(function TabsScreen({
|
|
|
153
149
|
);
|
|
154
150
|
|
|
155
151
|
return (
|
|
156
|
-
// @ts-expect-error - Ref typings in RNScreens
|
|
157
152
|
<RNScreen
|
|
158
153
|
active={isActive ? 1 : 0}
|
|
159
154
|
activityState={isActive ? 2 : 0}
|
package/src/utils.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Platform } from 'react-native';
|
|
2
|
-
import { useSafeAreaInsets, type EdgeInsets } from 'react-native-safe-area-context'
|
|
3
2
|
|
|
4
3
|
export let generateStackId = createIdGenerator("stack");
|
|
5
4
|
export let generateScreenId = createIdGenerator("screen");
|
|
@@ -19,7 +18,7 @@ export let serializeTabIndexKey = (tabId: string, index: number) =>
|
|
|
19
18
|
|
|
20
19
|
|
|
21
20
|
|
|
22
|
-
let baseInsets
|
|
21
|
+
let baseInsets = {
|
|
23
22
|
top: Platform.OS === "ios" ? 59 : 49,
|
|
24
23
|
bottom: Platform.OS === "ios" ? 34 : 0,
|
|
25
24
|
right: 0,
|
|
@@ -32,9 +31,9 @@ export function useSafeAreaInsetsSafe() {
|
|
|
32
31
|
try {
|
|
33
32
|
// Linter thinks this is conditional but it seems fine
|
|
34
33
|
// eslint-disable-next-line
|
|
35
|
-
insets =
|
|
34
|
+
insets = baseInsets;
|
|
36
35
|
} catch (error) {
|
|
37
|
-
console.warn("`react-native-safe-area-context` missing - Please install and wrap your app in a SafeAreaProvider"
|
|
36
|
+
console.warn("`react-native-safe-area-context` missing - Please install and wrap your app in a SafeAreaProvider");
|
|
38
37
|
}
|
|
39
38
|
|
|
40
39
|
return insets;
|