expo-router 4.0.0-preview.11 → 4.0.0-preview.13
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/build/ExpoRoot.js +2 -2
- package/build/ExpoRoot.js.map +1 -1
- package/build/exports.d.ts +1 -1
- package/build/exports.d.ts.map +1 -1
- package/build/exports.js +24 -2
- package/build/exports.js.map +1 -1
- package/build/fast-refresh.d.ts.map +1 -1
- package/build/fast-refresh.js.map +1 -1
- package/build/getRoutesCore.d.ts +1 -0
- package/build/getRoutesCore.d.ts.map +1 -1
- package/build/getRoutesCore.js +3 -1
- package/build/getRoutesCore.js.map +1 -1
- package/build/global-state/router-store.d.ts.map +1 -1
- package/build/global-state/router-store.js +1 -2
- package/build/global-state/router-store.js.map +1 -1
- package/build/head/url.d.ts +1 -0
- package/build/head/url.d.ts.map +1 -1
- package/build/head/url.js +21 -4
- package/build/head/url.js.map +1 -1
- package/build/hooks.d.ts +90 -38
- package/build/hooks.d.ts.map +1 -1
- package/build/hooks.js +46 -39
- package/build/hooks.js.map +1 -1
- package/build/imperative-api.d.ts +58 -15
- package/build/imperative-api.d.ts.map +1 -1
- package/build/imperative-api.js.map +1 -1
- package/build/layouts/Drawer.d.ts +2 -142
- package/build/layouts/Drawer.d.ts.map +1 -1
- package/build/layouts/Drawer.js +8 -5
- package/build/layouts/Drawer.js.map +1 -1
- package/build/layouts/DrawerClient.d.ts +144 -0
- package/build/layouts/DrawerClient.d.ts.map +1 -0
- package/build/layouts/DrawerClient.js +10 -0
- package/build/layouts/DrawerClient.js.map +1 -0
- package/build/layouts/Stack.d.ts +2 -126
- package/build/layouts/Stack.d.ts.map +1 -1
- package/build/layouts/Stack.js +8 -6
- package/build/layouts/Stack.js.map +1 -1
- package/build/layouts/StackClient.d.ts +128 -0
- package/build/layouts/StackClient.d.ts.map +1 -0
- package/build/layouts/StackClient.js +10 -0
- package/build/layouts/StackClient.js.map +1 -0
- package/build/layouts/Tabs.d.ts +2 -134
- package/build/layouts/Tabs.d.ts.map +1 -1
- package/build/layouts/Tabs.js +5 -37
- package/build/layouts/Tabs.js.map +1 -1
- package/build/layouts/TabsClient.d.ts +136 -0
- package/build/layouts/TabsClient.d.ts.map +1 -0
- package/build/layouts/TabsClient.js +44 -0
- package/build/layouts/TabsClient.js.map +1 -0
- package/build/layouts/withLayoutContext.d.ts +4 -1
- package/build/layouts/withLayoutContext.d.ts.map +1 -1
- package/build/layouts/withLayoutContext.js +4 -1
- package/build/layouts/withLayoutContext.js.map +1 -1
- package/build/link/Link.d.ts +48 -4
- package/build/link/Link.d.ts.map +1 -1
- package/build/link/Link.js +47 -3
- package/build/link/Link.js.map +1 -1
- package/build/link/href.d.ts +1 -1
- package/build/link/href.d.ts.map +1 -1
- package/build/link/href.js.map +1 -1
- package/build/link/useLinkHooks.d.ts +122 -29
- package/build/link/useLinkHooks.d.ts.map +1 -1
- package/build/link/useLinkHooks.js.map +1 -1
- package/build/renderRootComponent.d.ts.map +1 -1
- package/build/renderRootComponent.js +1 -2
- package/build/renderRootComponent.js.map +1 -1
- package/build/rsc/exports.d.ts +3 -1
- package/build/rsc/exports.d.ts.map +1 -1
- package/build/rsc/exports.js +3 -1
- package/build/rsc/exports.js.map +1 -1
- package/build/rsc/middleware.d.ts +1 -1
- package/build/rsc/middleware.d.ts.map +1 -1
- package/build/rsc/middleware.js +2 -1
- package/build/rsc/middleware.js.map +1 -1
- package/build/rsc/router/client.d.ts +2 -2
- package/build/rsc/router/client.d.ts.map +1 -1
- package/build/rsc/router/client.js.map +1 -1
- package/build/rsc/router/host.d.ts.map +1 -1
- package/build/rsc/router/host.js +20 -15
- package/build/rsc/router/host.js.map +1 -1
- package/build/rsc/rsc-renderer.d.ts +1 -1
- package/build/rsc/rsc-renderer.d.ts.map +1 -1
- package/build/rsc/rsc-renderer.js +1 -1
- package/build/rsc/rsc-renderer.js.map +1 -1
- package/build/rsc/server.d.ts +3 -0
- package/build/rsc/server.d.ts.map +1 -1
- package/build/rsc/server.js +19 -1
- package/build/rsc/server.js.map +1 -1
- package/build/testing-library/context-stubs.d.ts.map +1 -1
- package/build/testing-library/context-stubs.js +3 -1
- package/build/testing-library/context-stubs.js.map +1 -1
- package/build/testing-library/mocks.js +14 -13
- package/build/testing-library/mocks.js.map +1 -1
- package/build/typed-routes/generate.d.ts +5 -1
- package/build/typed-routes/generate.d.ts.map +1 -1
- package/build/typed-routes/generate.js +129 -64
- package/build/typed-routes/generate.js.map +1 -1
- package/build/typed-routes/index.d.ts +5 -0
- package/build/typed-routes/index.d.ts.map +1 -1
- package/build/typed-routes/index.js +8 -3
- package/build/typed-routes/index.js.map +1 -1
- package/build/typed-routes/testSetup.d.ts +1 -1
- package/build/typed-routes/testSetup.d.ts.map +1 -1
- package/build/typed-routes/testSetup.js +29 -17
- package/build/typed-routes/testSetup.js.map +1 -1
- package/build/typed-routes/types.d.ts +43 -145
- package/build/typed-routes/types.d.ts.map +1 -1
- package/build/typed-routes/types.js.map +1 -1
- package/build/types.d.ts +33 -0
- package/build/types.d.ts.map +1 -1
- package/build/types.js.map +1 -1
- package/build/ui/TabContext.d.ts +158 -1
- package/build/ui/TabContext.d.ts.map +1 -1
- package/build/ui/TabContext.js +25 -1
- package/build/ui/TabContext.js.map +1 -1
- package/build/ui/TabList.d.ts +17 -1
- package/build/ui/TabList.d.ts.map +1 -1
- package/build/ui/TabList.js +16 -0
- package/build/ui/TabList.js.map +1 -1
- package/build/ui/TabSlot.d.ts +55 -5
- package/build/ui/TabSlot.d.ts.map +1 -1
- package/build/ui/TabSlot.js +38 -14
- package/build/ui/TabSlot.js.map +1 -1
- package/build/ui/TabTrigger.d.ts +65 -70
- package/build/ui/TabTrigger.d.ts.map +1 -1
- package/build/ui/TabTrigger.js +25 -1
- package/build/ui/TabTrigger.js.map +1 -1
- package/build/ui/Tabs.d.ts +89 -132
- package/build/ui/Tabs.d.ts.map +1 -1
- package/build/ui/Tabs.js +53 -8
- package/build/ui/Tabs.js.map +1 -1
- package/build/ui/common.d.ts +3 -3
- package/build/ui/common.d.ts.map +1 -1
- package/build/ui/common.js.map +1 -1
- package/build/useFocusEffect.d.ts +15 -6
- package/build/useFocusEffect.d.ts.map +1 -1
- package/build/useFocusEffect.js +15 -6
- package/build/useFocusEffect.js.map +1 -1
- package/build/useNavigation.d.ts +11 -5
- package/build/useNavigation.d.ts.map +1 -1
- package/build/useNavigation.js +11 -5
- package/build/useNavigation.js.map +1 -1
- package/build/utils/splash.d.ts +6 -0
- package/build/utils/splash.d.ts.map +1 -0
- package/build/utils/splash.js +51 -0
- package/build/utils/splash.js.map +1 -0
- package/build/views/Navigator.d.ts +6 -5
- package/build/views/Navigator.d.ts.map +1 -1
- package/build/views/Navigator.js +6 -5
- package/build/views/Navigator.js.map +1 -1
- package/build/views/Splash.d.ts +1 -1
- package/build/views/Splash.d.ts.map +1 -1
- package/build/views/Splash.js +3 -13
- package/build/views/Splash.js.map +1 -1
- package/build/views/Try.d.ts +1 -1
- package/build/views/Try.d.ts.map +1 -1
- package/build/views/Try.js +1 -1
- package/build/views/Try.js.map +1 -1
- package/entry-classic.js +0 -6
- package/package.json +3 -5
- package/plugin/build/index.d.ts +2 -0
- package/plugin/options.json +74 -73
- package/rsc/entry.js +0 -6
- package/rsc/headers.d.ts +3 -0
- package/rsc/headers.js +5 -0
- package/build/rsc/runtime.d.ts +0 -9
- package/build/rsc/runtime.d.ts.map +0 -1
- package/build/rsc/runtime.js +0 -36
- package/build/rsc/runtime.js.map +0 -1
- package/virtual-client-boundaries.js +0 -1
package/build/ui/Tabs.d.ts
CHANGED
|
@@ -1,74 +1,60 @@
|
|
|
1
|
-
import { ParamListBase, TabActionHelpers, TabNavigationState } from '@react-navigation/native';
|
|
1
|
+
import { DefaultNavigatorOptions, ParamListBase, TabActionHelpers, TabNavigationState, TabRouterOptions } from '@react-navigation/native';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
3
|
import { ViewProps } from 'react-native';
|
|
4
|
-
import {
|
|
5
|
-
import { ExpoTabRouterOptions } from './TabRouter';
|
|
4
|
+
import { ExpoTabsScreenOptions, TabNavigationEventMap, TabsContextValue } from './TabContext';
|
|
6
5
|
import { ScreenTrigger } from './common';
|
|
7
6
|
export * from './TabContext';
|
|
8
7
|
export * from './TabList';
|
|
9
8
|
export * from './TabSlot';
|
|
10
9
|
export * from './TabTrigger';
|
|
11
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Options to provide to the Tab Router.
|
|
12
|
+
*/
|
|
13
|
+
export type UseTabsOptions = Omit<DefaultNavigatorOptions<ParamListBase, any, TabNavigationState<any>, ExpoTabsScreenOptions, TabNavigationEventMap, any>, 'children'> & {
|
|
14
|
+
backBehavior?: TabRouterOptions['backBehavior'];
|
|
15
|
+
};
|
|
12
16
|
export type TabsProps = ViewProps & {
|
|
17
|
+
/** Forward props to child component and removes the extra `<View>`. Useful for custom wrappers. */
|
|
13
18
|
asChild?: boolean;
|
|
14
19
|
options?: UseTabsOptions;
|
|
15
20
|
};
|
|
16
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Root component for the headless tabs.
|
|
23
|
+
*
|
|
24
|
+
* @see [`useTabsWithChildren`](#usetabswithchildrenoptions) for a hook version of this component.
|
|
25
|
+
* @example
|
|
26
|
+
* ```tsx
|
|
27
|
+
* <Tabs>
|
|
28
|
+
* <TabSlot />
|
|
29
|
+
* <TabList>
|
|
30
|
+
* <TabTrigger name="home" href="/" />
|
|
31
|
+
* </TabList>
|
|
32
|
+
* </Tabs>
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function Tabs(props: TabsProps): import("react").JSX.Element;
|
|
17
36
|
export type UseTabsWithChildrenOptions = UseTabsOptions & {
|
|
18
37
|
children: ReactNode;
|
|
19
38
|
};
|
|
20
|
-
export type UseTabsWithTriggersOptions
|
|
21
|
-
triggers: ScreenTrigger
|
|
39
|
+
export type UseTabsWithTriggersOptions = UseTabsOptions & {
|
|
40
|
+
triggers: ScreenTrigger[];
|
|
22
41
|
};
|
|
23
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Hook version of `Tabs`. The returned NavigationContent component
|
|
44
|
+
* should be rendered.
|
|
45
|
+
*
|
|
46
|
+
* @see [`Tabs`](#tabs) for the component version of this hook.
|
|
47
|
+
* @example
|
|
48
|
+
* ```tsx
|
|
49
|
+
* export function MyTabs({ children }) {
|
|
50
|
+
* const { NavigationContent } = useTabsWithChildren({ children })
|
|
51
|
+
*
|
|
52
|
+
* return <NavigationContent />
|
|
53
|
+
* }
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare function useTabsWithChildren(options: UseTabsWithChildrenOptions): {
|
|
24
57
|
state: TabNavigationState<any>;
|
|
25
|
-
descriptors: Record<string, import("@react-navigation/native").Descriptor<ExpoTabsScreenOptions, Omit<{
|
|
26
|
-
dispatch(action: Readonly<{
|
|
27
|
-
type: string;
|
|
28
|
-
payload?: object | undefined;
|
|
29
|
-
source?: string | undefined;
|
|
30
|
-
target?: string | undefined;
|
|
31
|
-
}> | ((state: Readonly<TabNavigationState<any>>) => Readonly<{
|
|
32
|
-
type: string;
|
|
33
|
-
payload?: object | undefined;
|
|
34
|
-
source?: string | undefined;
|
|
35
|
-
target?: string | undefined;
|
|
36
|
-
}>)): void;
|
|
37
|
-
navigate<RouteName extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
|
|
38
|
-
navigate<RouteName_1 extends string>(options: {
|
|
39
|
-
name: string;
|
|
40
|
-
params: object | undefined;
|
|
41
|
-
path?: string | undefined;
|
|
42
|
-
merge?: boolean | undefined;
|
|
43
|
-
}): void;
|
|
44
|
-
navigateDeprecated<RouteName_2 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
|
|
45
|
-
navigateDeprecated<RouteName_3 extends string>(options: {
|
|
46
|
-
name: string;
|
|
47
|
-
params: object | undefined;
|
|
48
|
-
merge?: boolean | undefined;
|
|
49
|
-
}): void;
|
|
50
|
-
preload<RouteName_4 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
|
|
51
|
-
reset(state: TabNavigationState<any> | import("@react-navigation/native").PartialState<TabNavigationState<any>>): void;
|
|
52
|
-
goBack(): void;
|
|
53
|
-
isFocused(): boolean;
|
|
54
|
-
canGoBack(): boolean;
|
|
55
|
-
getId(): string | undefined;
|
|
56
|
-
getParent<T = import("@react-navigation/native").NavigationHelpers<ParamListBase, {}> | undefined>(id?: string | undefined): T;
|
|
57
|
-
getState(): TabNavigationState<any>;
|
|
58
|
-
setStateForNextRouteNamesChange(state: TabNavigationState<any> | import("@react-navigation/native").PartialState<TabNavigationState<any>>): void;
|
|
59
|
-
} & import("@react-navigation/native").PrivateValueStore<[ParamListBase, unknown, unknown]>, "getParent"> & {
|
|
60
|
-
getParent<T_1 = import("@react-navigation/native").NavigationProp<ParamListBase, string, undefined, Readonly<{
|
|
61
|
-
key: string;
|
|
62
|
-
index: number;
|
|
63
|
-
routeNames: string[];
|
|
64
|
-
history?: unknown[] | undefined;
|
|
65
|
-
routes: import("@react-navigation/native").NavigationRoute<ParamListBase, string>[];
|
|
66
|
-
type: string;
|
|
67
|
-
stale: false;
|
|
68
|
-
}>, {}, {}> | undefined>(id?: string | undefined): T_1;
|
|
69
|
-
setParams(params: Partial<object | undefined>): void;
|
|
70
|
-
setOptions(options: Partial<ExpoTabsScreenOptions>): void;
|
|
71
|
-
} & import("@react-navigation/native").EventConsumer<TabNavigationEventMap & import("@react-navigation/native").EventMapCore<TabNavigationState<any>>> & import("@react-navigation/native").PrivateValueStore<[ParamListBase, string, TabNavigationEventMap]> & TabActionHelpers<ParamListBase>, import("@react-navigation/native").RouteProp<ParamListBase, string>>>;
|
|
72
58
|
navigation: {
|
|
73
59
|
dispatch(action: Readonly<{
|
|
74
60
|
type: string;
|
|
@@ -89,20 +75,20 @@ export declare function useTabsWithChildren({ children, ...options }: UseTabsWit
|
|
|
89
75
|
source?: string | undefined;
|
|
90
76
|
target?: string | undefined;
|
|
91
77
|
}>)): void;
|
|
92
|
-
navigate<
|
|
93
|
-
navigate<
|
|
78
|
+
navigate<RouteName extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
|
|
79
|
+
navigate<RouteName_1 extends string>(options: {
|
|
94
80
|
name: string;
|
|
95
81
|
params: object | undefined;
|
|
96
82
|
path?: string | undefined;
|
|
97
83
|
merge?: boolean | undefined;
|
|
98
84
|
}): void;
|
|
99
|
-
navigateDeprecated<
|
|
100
|
-
navigateDeprecated<
|
|
85
|
+
navigateDeprecated<RouteName_2 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
|
|
86
|
+
navigateDeprecated<RouteName_3 extends string>(options: {
|
|
101
87
|
name: string;
|
|
102
88
|
params: object | undefined;
|
|
103
89
|
merge?: boolean | undefined;
|
|
104
90
|
}): void;
|
|
105
|
-
preload<
|
|
91
|
+
preload<RouteName_4 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
|
|
106
92
|
reset(state: Readonly<{
|
|
107
93
|
key: string;
|
|
108
94
|
index: number;
|
|
@@ -124,7 +110,7 @@ export declare function useTabsWithChildren({ children, ...options }: UseTabsWit
|
|
|
124
110
|
isFocused(): boolean;
|
|
125
111
|
canGoBack(): boolean;
|
|
126
112
|
getId(): string | undefined;
|
|
127
|
-
getParent<
|
|
113
|
+
getParent<T = import("@react-navigation/native").NavigationHelpers<ParamListBase, {}> | undefined>(id?: string | undefined): T;
|
|
128
114
|
getState(): Readonly<{
|
|
129
115
|
key: string;
|
|
130
116
|
index: number;
|
|
@@ -152,15 +138,9 @@ export declare function useTabsWithChildren({ children, ...options }: UseTabsWit
|
|
|
152
138
|
stale: false;
|
|
153
139
|
}>>): void;
|
|
154
140
|
} & import("@react-navigation/native").PrivateValueStore<[ParamListBase, unknown, unknown]> & import("@react-navigation/native").EventEmitter<TabNavigationEventMap> & {
|
|
155
|
-
setParams<
|
|
141
|
+
setParams<RouteName_5 extends string>(params: Partial<object | undefined>): void;
|
|
156
142
|
} & TabActionHelpers<ParamListBase>;
|
|
157
|
-
|
|
158
|
-
children: ReactNode;
|
|
159
|
-
} & import("react").RefAttributes<unknown>>;
|
|
160
|
-
};
|
|
161
|
-
export declare function useTabsWithTriggers<T extends string | object>({ triggers, ...options }: UseTabsWithTriggersOptions<T>): {
|
|
162
|
-
state: TabNavigationState<any>;
|
|
163
|
-
descriptors: Record<string, import("@react-navigation/native").Descriptor<ExpoTabsScreenOptions, Omit<{
|
|
143
|
+
describe: (route: import("@react-navigation/native").RouteProp<ParamListBase, string>, placeholder: boolean) => import("@react-navigation/native").Descriptor<import("./TabContext").ExpoTabsNavigatorScreenOptions, Omit<{
|
|
164
144
|
dispatch(action: Readonly<{
|
|
165
145
|
type: string;
|
|
166
146
|
payload?: object | undefined;
|
|
@@ -172,20 +152,20 @@ export declare function useTabsWithTriggers<T extends string | object>({ trigger
|
|
|
172
152
|
source?: string | undefined;
|
|
173
153
|
target?: string | undefined;
|
|
174
154
|
}>)): void;
|
|
175
|
-
navigate<
|
|
176
|
-
navigate<
|
|
155
|
+
navigate<RouteName_6 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
|
|
156
|
+
navigate<RouteName_7 extends string>(options: {
|
|
177
157
|
name: string;
|
|
178
158
|
params: object | undefined;
|
|
179
159
|
path?: string | undefined;
|
|
180
160
|
merge?: boolean | undefined;
|
|
181
161
|
}): void;
|
|
182
|
-
navigateDeprecated<
|
|
183
|
-
navigateDeprecated<
|
|
162
|
+
navigateDeprecated<RouteName_8 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
|
|
163
|
+
navigateDeprecated<RouteName_9 extends string>(options: {
|
|
184
164
|
name: string;
|
|
185
165
|
params: object | undefined;
|
|
186
166
|
merge?: boolean | undefined;
|
|
187
167
|
}): void;
|
|
188
|
-
preload<
|
|
168
|
+
preload<RouteName_10 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
|
|
189
169
|
reset(state: TabNavigationState<any> | import("@react-navigation/native").PartialState<TabNavigationState<any>>): void;
|
|
190
170
|
goBack(): void;
|
|
191
171
|
isFocused(): boolean;
|
|
@@ -205,82 +185,44 @@ export declare function useTabsWithTriggers<T extends string | object>({ trigger
|
|
|
205
185
|
stale: false;
|
|
206
186
|
}>, {}, {}> | undefined>(id?: string | undefined): T_2;
|
|
207
187
|
setParams(params: Partial<object | undefined>): void;
|
|
208
|
-
setOptions(options: Partial<
|
|
209
|
-
} & import("@react-navigation/native").EventConsumer<TabNavigationEventMap & import("@react-navigation/native").EventMapCore<TabNavigationState<any>>> & import("@react-navigation/native").PrivateValueStore<[ParamListBase, string, TabNavigationEventMap]> & TabActionHelpers<ParamListBase>, import("@react-navigation/native").RouteProp<ParamListBase, string
|
|
210
|
-
|
|
188
|
+
setOptions(options: Partial<import("./TabContext").ExpoTabsNavigatorScreenOptions>): void;
|
|
189
|
+
} & import("@react-navigation/native").EventConsumer<TabNavigationEventMap & import("@react-navigation/native").EventMapCore<TabNavigationState<any>>> & import("@react-navigation/native").PrivateValueStore<[ParamListBase, string, TabNavigationEventMap]> & TabActionHelpers<ParamListBase>, import("@react-navigation/native").RouteProp<ParamListBase, string>>;
|
|
190
|
+
descriptors: Record<string, import("@react-navigation/native").Descriptor<import("./TabContext").ExpoTabsNavigatorScreenOptions, Omit<{
|
|
211
191
|
dispatch(action: Readonly<{
|
|
212
192
|
type: string;
|
|
213
193
|
payload?: object | undefined;
|
|
214
194
|
source?: string | undefined;
|
|
215
195
|
target?: string | undefined;
|
|
216
|
-
}> | ((state: Readonly<Readonly<{
|
|
217
|
-
key: string;
|
|
218
|
-
index: number;
|
|
219
|
-
routeNames: string[];
|
|
220
|
-
history?: unknown[] | undefined;
|
|
221
|
-
routes: import("@react-navigation/native").NavigationRoute<ParamListBase, string>[];
|
|
222
|
-
type: string;
|
|
223
|
-
stale: false;
|
|
224
|
-
}>>) => Readonly<{
|
|
196
|
+
}> | ((state: Readonly<TabNavigationState<any>>) => Readonly<{
|
|
225
197
|
type: string;
|
|
226
198
|
payload?: object | undefined;
|
|
227
199
|
source?: string | undefined;
|
|
228
200
|
target?: string | undefined;
|
|
229
201
|
}>)): void;
|
|
230
|
-
navigate<
|
|
231
|
-
navigate<
|
|
202
|
+
navigate<RouteName_11 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
|
|
203
|
+
navigate<RouteName_12 extends string>(options: {
|
|
232
204
|
name: string;
|
|
233
205
|
params: object | undefined;
|
|
234
206
|
path?: string | undefined;
|
|
235
207
|
merge?: boolean | undefined;
|
|
236
208
|
}): void;
|
|
237
|
-
navigateDeprecated<
|
|
238
|
-
navigateDeprecated<
|
|
209
|
+
navigateDeprecated<RouteName_13 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
|
|
210
|
+
navigateDeprecated<RouteName_14 extends string>(options: {
|
|
239
211
|
name: string;
|
|
240
212
|
params: object | undefined;
|
|
241
213
|
merge?: boolean | undefined;
|
|
242
214
|
}): void;
|
|
243
|
-
preload<
|
|
244
|
-
reset(state:
|
|
245
|
-
key: string;
|
|
246
|
-
index: number;
|
|
247
|
-
routeNames: string[];
|
|
248
|
-
history?: unknown[] | undefined;
|
|
249
|
-
routes: import("@react-navigation/native").NavigationRoute<ParamListBase, string>[];
|
|
250
|
-
type: string;
|
|
251
|
-
stale: false;
|
|
252
|
-
}> | import("@react-navigation/native").PartialState<Readonly<{
|
|
253
|
-
key: string;
|
|
254
|
-
index: number;
|
|
255
|
-
routeNames: string[];
|
|
256
|
-
history?: unknown[] | undefined;
|
|
257
|
-
routes: import("@react-navigation/native").NavigationRoute<ParamListBase, string>[];
|
|
258
|
-
type: string;
|
|
259
|
-
stale: false;
|
|
260
|
-
}>>): void;
|
|
215
|
+
preload<RouteName_15 extends string>(...args: [screen: string] | [screen: string, params: object | undefined]): void;
|
|
216
|
+
reset(state: TabNavigationState<any> | import("@react-navigation/native").PartialState<TabNavigationState<any>>): void;
|
|
261
217
|
goBack(): void;
|
|
262
218
|
isFocused(): boolean;
|
|
263
219
|
canGoBack(): boolean;
|
|
264
220
|
getId(): string | undefined;
|
|
265
221
|
getParent<T_3 = import("@react-navigation/native").NavigationHelpers<ParamListBase, {}> | undefined>(id?: string | undefined): T_3;
|
|
266
|
-
getState():
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
history?: unknown[] | undefined;
|
|
271
|
-
routes: import("@react-navigation/native").NavigationRoute<ParamListBase, string>[];
|
|
272
|
-
type: string;
|
|
273
|
-
stale: false;
|
|
274
|
-
}>;
|
|
275
|
-
setStateForNextRouteNamesChange(state: Readonly<{
|
|
276
|
-
key: string;
|
|
277
|
-
index: number;
|
|
278
|
-
routeNames: string[];
|
|
279
|
-
history?: unknown[] | undefined;
|
|
280
|
-
routes: import("@react-navigation/native").NavigationRoute<ParamListBase, string>[];
|
|
281
|
-
type: string;
|
|
282
|
-
stale: false;
|
|
283
|
-
}> | import("@react-navigation/native").PartialState<Readonly<{
|
|
222
|
+
getState(): TabNavigationState<any>;
|
|
223
|
+
setStateForNextRouteNamesChange(state: TabNavigationState<any> | import("@react-navigation/native").PartialState<TabNavigationState<any>>): void;
|
|
224
|
+
} & import("@react-navigation/native").PrivateValueStore<[ParamListBase, unknown, unknown]>, "getParent"> & {
|
|
225
|
+
getParent<T_4 = import("@react-navigation/native").NavigationProp<ParamListBase, string, undefined, Readonly<{
|
|
284
226
|
key: string;
|
|
285
227
|
index: number;
|
|
286
228
|
routeNames: string[];
|
|
@@ -288,12 +230,27 @@ export declare function useTabsWithTriggers<T extends string | object>({ trigger
|
|
|
288
230
|
routes: import("@react-navigation/native").NavigationRoute<ParamListBase, string>[];
|
|
289
231
|
type: string;
|
|
290
232
|
stale: false;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
} & TabActionHelpers<ParamListBase
|
|
295
|
-
NavigationContent:
|
|
233
|
+
}>, {}, {}> | undefined>(id?: string | undefined): T_4;
|
|
234
|
+
setParams(params: Partial<object | undefined>): void;
|
|
235
|
+
setOptions(options: Partial<import("./TabContext").ExpoTabsNavigatorScreenOptions>): void;
|
|
236
|
+
} & import("@react-navigation/native").EventConsumer<TabNavigationEventMap & import("@react-navigation/native").EventMapCore<TabNavigationState<any>>> & import("@react-navigation/native").PrivateValueStore<[ParamListBase, string, TabNavigationEventMap]> & TabActionHelpers<ParamListBase>, import("@react-navigation/native").RouteProp<ParamListBase, string>>>;
|
|
237
|
+
NavigationContent: ({ children }: {
|
|
296
238
|
children: ReactNode;
|
|
297
|
-
}
|
|
239
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
298
240
|
};
|
|
241
|
+
/**
|
|
242
|
+
* Alternative hook version of `Tabs` that uses explicit triggers
|
|
243
|
+
* instead of `children`.
|
|
244
|
+
*
|
|
245
|
+
* @see [`Tabs`](#tabs) for the component version of this hook.
|
|
246
|
+
* @example
|
|
247
|
+
* ```tsx
|
|
248
|
+
* export function MyTabs({ children }) {
|
|
249
|
+
* const { NavigationContent } = useTabsWithChildren({ triggers: [] })
|
|
250
|
+
*
|
|
251
|
+
* return <NavigationContent />
|
|
252
|
+
* }
|
|
253
|
+
* ```
|
|
254
|
+
*/
|
|
255
|
+
export declare function useTabsWithTriggers(options: UseTabsWithTriggersOptions): TabsContextValue;
|
|
299
256
|
//# sourceMappingURL=Tabs.d.ts.map
|
package/build/ui/Tabs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../src/ui/Tabs.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../src/ui/Tabs.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EAEvB,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAEjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAKL,SAAS,EAIV,MAAM,OAAO,CAAC;AACf,OAAO,EAAc,SAAS,EAAQ,MAAM,cAAc,CAAC;AAE3D,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EAErB,gBAAgB,EACjB,MAAM,cAAc,CAAC;AAKtB,OAAO,EAAoB,aAAa,EAAqB,MAAM,UAAU,CAAC;AAQ9E,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAE7B;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,IAAI,CAC/B,uBAAuB,CACrB,aAAa,EACb,GAAG,EACH,kBAAkB,CAAC,GAAG,CAAC,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,GAAG,CACJ,EACD,UAAU,CACX,GAAG;IACF,YAAY,CAAC,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG;IAClC,mGAAmG;IACnG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,+BAepC;AAED,MAAM,MAAM,0BAA0B,GAAG,cAAc,GAAG;IACxD,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,cAAc,GAAG;IACxD,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGtE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,gBAAgB,CAiEzF"}
|
package/build/ui/Tabs.js
CHANGED
|
@@ -34,23 +34,68 @@ __exportStar(require("./TabContext"), exports);
|
|
|
34
34
|
__exportStar(require("./TabList"), exports);
|
|
35
35
|
__exportStar(require("./TabSlot"), exports);
|
|
36
36
|
__exportStar(require("./TabTrigger"), exports);
|
|
37
|
-
|
|
37
|
+
/**
|
|
38
|
+
* Root component for the headless tabs.
|
|
39
|
+
*
|
|
40
|
+
* @see [`useTabsWithChildren`](#usetabswithchildrenoptions) for a hook version of this component.
|
|
41
|
+
* @example
|
|
42
|
+
* ```tsx
|
|
43
|
+
* <Tabs>
|
|
44
|
+
* <TabSlot />
|
|
45
|
+
* <TabList>
|
|
46
|
+
* <TabTrigger name="home" href="/" />
|
|
47
|
+
* </TabList>
|
|
48
|
+
* </Tabs>
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
function Tabs(props) {
|
|
52
|
+
const { children, asChild, options, ...rest } = props;
|
|
38
53
|
const Comp = asChild ? common_1.SafeAreaViewSlot : react_native_1.View;
|
|
39
54
|
const { NavigationContent } = useTabsWithChildren({
|
|
40
55
|
// asChild adds an extra layer, so we need to process the child's children
|
|
41
56
|
children: asChild && (0, react_1.isValidElement)(children) ? children.props.children : children,
|
|
42
57
|
...options,
|
|
43
58
|
});
|
|
44
|
-
return (<Comp style={styles.tabsRoot} {...
|
|
59
|
+
return (<Comp style={styles.tabsRoot} {...rest}>
|
|
45
60
|
<NavigationContent>{children}</NavigationContent>
|
|
46
61
|
</Comp>);
|
|
47
62
|
}
|
|
48
63
|
exports.Tabs = Tabs;
|
|
49
|
-
|
|
50
|
-
|
|
64
|
+
/**
|
|
65
|
+
* Hook version of `Tabs`. The returned NavigationContent component
|
|
66
|
+
* should be rendered.
|
|
67
|
+
*
|
|
68
|
+
* @see [`Tabs`](#tabs) for the component version of this hook.
|
|
69
|
+
* @example
|
|
70
|
+
* ```tsx
|
|
71
|
+
* export function MyTabs({ children }) {
|
|
72
|
+
* const { NavigationContent } = useTabsWithChildren({ children })
|
|
73
|
+
*
|
|
74
|
+
* return <NavigationContent />
|
|
75
|
+
* }
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
function useTabsWithChildren(options) {
|
|
79
|
+
const { children, ...rest } = options;
|
|
80
|
+
return useTabsWithTriggers({ triggers: parseTriggersFromChildren(children), ...rest });
|
|
51
81
|
}
|
|
52
82
|
exports.useTabsWithChildren = useTabsWithChildren;
|
|
53
|
-
|
|
83
|
+
/**
|
|
84
|
+
* Alternative hook version of `Tabs` that uses explicit triggers
|
|
85
|
+
* instead of `children`.
|
|
86
|
+
*
|
|
87
|
+
* @see [`Tabs`](#tabs) for the component version of this hook.
|
|
88
|
+
* @example
|
|
89
|
+
* ```tsx
|
|
90
|
+
* export function MyTabs({ children }) {
|
|
91
|
+
* const { NavigationContent } = useTabsWithChildren({ triggers: [] })
|
|
92
|
+
*
|
|
93
|
+
* return <NavigationContent />
|
|
94
|
+
* }
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
function useTabsWithTriggers(options) {
|
|
98
|
+
const { triggers, ...rest } = options;
|
|
54
99
|
// Ensure we extend the parent triggers, so we can trigger them as well
|
|
55
100
|
const parentTriggerMap = (0, react_1.useContext)(TabContext_1.TabTriggerMapContext);
|
|
56
101
|
const routeNode = (0, Route_1.useRouteNode)();
|
|
@@ -64,12 +109,12 @@ function useTabsWithTriggers({ triggers, ...options }) {
|
|
|
64
109
|
const { children, triggerMap } = (0, common_1.triggersToScreens)(triggers, routeNode, linking, initialRouteName, parentTriggerMap, routeInfo, contextKey);
|
|
65
110
|
const navigatorContext = (0, native_1.useNavigationBuilder)(TabRouter_1.ExpoTabRouter, {
|
|
66
111
|
children,
|
|
67
|
-
...
|
|
112
|
+
...rest,
|
|
68
113
|
triggerMap,
|
|
69
114
|
id: contextKey,
|
|
70
115
|
initialRouteName,
|
|
71
116
|
});
|
|
72
|
-
const { state, descriptors, navigation, NavigationContent: RNNavigationContent, } = navigatorContext;
|
|
117
|
+
const { state, descriptors, navigation, describe, NavigationContent: RNNavigationContent, } = navigatorContext;
|
|
73
118
|
const navigatorContextValue = (0, react_1.useMemo)(() => ({
|
|
74
119
|
...navigatorContext,
|
|
75
120
|
contextKey,
|
|
@@ -80,7 +125,7 @@ function useTabsWithTriggers({ triggers, ...options }) {
|
|
|
80
125
|
<RNNavigationContent>{children}</RNNavigationContent>
|
|
81
126
|
</Navigator_1.NavigatorContext.Provider>
|
|
82
127
|
</TabContext_1.TabTriggerMapContext.Provider>));
|
|
83
|
-
return { state, descriptors, navigation, NavigationContent };
|
|
128
|
+
return { state, descriptors, navigation, NavigationContent, describe };
|
|
84
129
|
}
|
|
85
130
|
exports.useTabsWithTriggers = useTabsWithTriggers;
|
|
86
131
|
function parseTriggersFromChildren(children, screenTriggers = [], isInTabList = false) {
|
package/build/ui/Tabs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tabs.js","sourceRoot":"","sources":["../../src/ui/Tabs.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n LinkingContext,\n ParamListBase,\n TabActionHelpers,\n TabNavigationState,\n useNavigationBuilder,\n} from '@react-navigation/native';\nimport {\n Children,\n ComponentProps,\n Fragment,\n ReactElement,\n ReactNode,\n isValidElement,\n useContext,\n useMemo,\n} from 'react';\nimport { StyleSheet, ViewProps, View } from 'react-native';\n\nimport {\n ExpoTabsProps,\n ExpoTabsScreenOptions,\n TabNavigationEventMap,\n TabTriggerMapContext,\n} from './TabContext';\nimport { isTabList } from './TabList';\nimport { ExpoTabRouter, ExpoTabRouterOptions } from './TabRouter';\nimport { isTabSlot } from './TabSlot';\nimport { isTabTrigger } from './TabTrigger';\nimport { SafeAreaViewSlot, ScreenTrigger, triggersToScreens } from './common';\nimport { useComponent } from './useComponent';\nimport { useRouteNode, useContextKey } from '../Route';\nimport { useRouteInfo } from '../hooks';\nimport { resolveHref } from '../link/href';\nimport { shouldLinkExternally } from '../utils/url';\nimport { NavigatorContext, NavigatorContextValue } from '../views/Navigator';\n\nexport * from './TabContext';\nexport * from './TabList';\nexport * from './TabSlot';\nexport * from './TabTrigger';\n\nexport type UseTabsOptions = Omit<ExpoTabsProps, 'children'> &\n Omit<ExpoTabRouterOptions, 'initialRouteName' | 'triggerMap'>;\n\nexport type TabsProps = ViewProps & {\n asChild?: boolean;\n options?: UseTabsOptions;\n};\n\nexport function Tabs({ children, asChild, options, ...props }: TabsProps) {\n const Comp = asChild ? SafeAreaViewSlot : View;\n\n const { NavigationContent } = useTabsWithChildren({\n // asChild adds an extra layer, so we need to process the child's children\n children: asChild && isValidElement(children) ? children.props.children : children,\n ...options,\n });\n\n return (\n <Comp style={styles.tabsRoot} {...props}>\n <NavigationContent>{children}</NavigationContent>\n </Comp>\n );\n}\n\nexport type UseTabsWithChildrenOptions = UseTabsOptions & {\n children: ReactNode;\n};\n\nexport type UseTabsWithTriggersOptions<T extends string | object> = UseTabsOptions & {\n triggers: ScreenTrigger<T>[];\n};\n\nexport function useTabsWithChildren({ children, ...options }: UseTabsWithChildrenOptions) {\n return useTabsWithTriggers({ triggers: parseTriggersFromChildren(children), ...options });\n}\n\nexport function useTabsWithTriggers<T extends string | object>({\n triggers,\n ...options\n}: UseTabsWithTriggersOptions<T>) {\n // Ensure we extend the parent triggers, so we can trigger them as well\n const parentTriggerMap = useContext(TabTriggerMapContext);\n const routeNode = useRouteNode();\n const contextKey = useContextKey();\n const linking = useContext(LinkingContext).options;\n const routeInfo = useRouteInfo();\n\n if (!routeNode || !linking) {\n throw new Error('No RouteNode. This is likely a bug in expo-router.');\n }\n\n const initialRouteName = routeNode.initialRouteName;\n\n const { children, triggerMap } = triggersToScreens(\n triggers,\n routeNode,\n linking,\n initialRouteName,\n parentTriggerMap,\n routeInfo,\n contextKey\n );\n\n const navigatorContext = useNavigationBuilder<\n TabNavigationState<any>,\n ExpoTabRouterOptions,\n TabActionHelpers<ParamListBase>,\n ExpoTabsScreenOptions,\n TabNavigationEventMap\n >(ExpoTabRouter, {\n children,\n ...options,\n triggerMap,\n id: contextKey,\n initialRouteName,\n });\n\n const {\n state,\n descriptors,\n navigation,\n NavigationContent: RNNavigationContent,\n } = navigatorContext;\n\n const navigatorContextValue = useMemo<NavigatorContextValue>(\n () => ({\n ...(navigatorContext as unknown as ReturnType<typeof useNavigationBuilder>),\n contextKey,\n router: ExpoTabRouter,\n }),\n [navigatorContext, contextKey, ExpoTabRouter]\n );\n\n const NavigationContent = useComponent((children: React.ReactNode) => (\n <TabTriggerMapContext.Provider value={triggerMap}>\n <NavigatorContext.Provider value={navigatorContextValue}>\n <RNNavigationContent>{children}</RNNavigationContent>\n </NavigatorContext.Provider>\n </TabTriggerMapContext.Provider>\n ));\n\n return { state, descriptors, navigation, NavigationContent };\n}\n\nfunction parseTriggersFromChildren(\n children: ReactNode,\n screenTriggers: ScreenTrigger<any>[] = [],\n isInTabList = false\n) {\n Children.forEach(children, (child) => {\n if (!child || !isValidElement(child) || isTabSlot(child)) {\n return;\n }\n\n if (isFragment(child) && typeof child.props.children !== 'function') {\n return parseTriggersFromChildren(\n child.props.children,\n screenTriggers,\n isInTabList || isTabList(child)\n );\n }\n\n if (isTabList(child) && typeof child.props.children !== 'function') {\n let children = child.props.children;\n\n // <TabList asChild /> adds an extra layer. We need to parse the child's children\n if (child.props.asChild && isValidElement(children)) {\n children = children.props.children;\n }\n\n return parseTriggersFromChildren(children, screenTriggers, isInTabList || isTabList(child));\n }\n\n // We should only process TabTriggers within the TabList. All other components will be ignored\n if (!isInTabList || !isTabTrigger(child)) {\n return;\n }\n\n const { href, name } = child.props;\n\n if (!href) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(\n `<TabTrigger name={${name}}> does not have a 'href' prop. TabTriggers within a <TabList /> are required to have a href.`\n );\n }\n return;\n }\n\n const resolvedHref = resolveHref(href);\n\n if (shouldLinkExternally(resolvedHref)) {\n return screenTriggers.push({\n type: 'external',\n name,\n href: resolvedHref,\n });\n }\n\n if (!name) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(\n `<TabTrigger> does not have a 'name' prop. TabTriggers within a <TabList /> are required to have a name.`\n );\n }\n return;\n }\n\n return screenTriggers.push({ type: 'internal', href: resolvedHref, name });\n });\n\n return screenTriggers;\n}\n\nfunction isFragment(\n child: ReactElement<any>\n): child is ReactElement<ComponentProps<typeof Fragment>> {\n return child.type === Fragment;\n}\n\nconst styles = StyleSheet.create({\n tabsRoot: {\n flex: 1,\n },\n});\n"]}
|
|
1
|
+
{"version":3,"file":"Tabs.js","sourceRoot":"","sources":["../../src/ui/Tabs.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n DefaultNavigatorOptions,\n LinkingContext,\n ParamListBase,\n TabActionHelpers,\n TabNavigationState,\n TabRouterOptions,\n useNavigationBuilder,\n} from '@react-navigation/native';\nimport {\n Children,\n ComponentProps,\n Fragment,\n ReactElement,\n ReactNode,\n isValidElement,\n useContext,\n useMemo,\n} from 'react';\nimport { StyleSheet, ViewProps, View } from 'react-native';\n\nimport {\n ExpoTabsScreenOptions,\n TabNavigationEventMap,\n TabTriggerMapContext,\n TabsContextValue,\n} from './TabContext';\nimport { isTabList } from './TabList';\nimport { ExpoTabRouter, ExpoTabRouterOptions } from './TabRouter';\nimport { isTabSlot } from './TabSlot';\nimport { isTabTrigger } from './TabTrigger';\nimport { SafeAreaViewSlot, ScreenTrigger, triggersToScreens } from './common';\nimport { useComponent } from './useComponent';\nimport { useRouteNode, useContextKey } from '../Route';\nimport { useRouteInfo } from '../hooks';\nimport { resolveHref } from '../link/href';\nimport { shouldLinkExternally } from '../utils/url';\nimport { NavigatorContext, NavigatorContextValue } from '../views/Navigator';\n\nexport * from './TabContext';\nexport * from './TabList';\nexport * from './TabSlot';\nexport * from './TabTrigger';\n\n/**\n * Options to provide to the Tab Router.\n */\nexport type UseTabsOptions = Omit<\n DefaultNavigatorOptions<\n ParamListBase,\n any,\n TabNavigationState<any>,\n ExpoTabsScreenOptions,\n TabNavigationEventMap,\n any\n >,\n 'children'\n> & {\n backBehavior?: TabRouterOptions['backBehavior'];\n};\n\nexport type TabsProps = ViewProps & {\n /** Forward props to child component and removes the extra `<View>`. Useful for custom wrappers. */\n asChild?: boolean;\n options?: UseTabsOptions;\n};\n\n/**\n * Root component for the headless tabs.\n *\n * @see [`useTabsWithChildren`](#usetabswithchildrenoptions) for a hook version of this component.\n * @example\n * ```tsx\n * <Tabs>\n * <TabSlot />\n * <TabList>\n * <TabTrigger name=\"home\" href=\"/\" />\n * </TabList>\n * </Tabs>\n * ```\n */\nexport function Tabs(props: TabsProps) {\n const { children, asChild, options, ...rest } = props;\n const Comp = asChild ? SafeAreaViewSlot : View;\n\n const { NavigationContent } = useTabsWithChildren({\n // asChild adds an extra layer, so we need to process the child's children\n children: asChild && isValidElement(children) ? children.props.children : children,\n ...options,\n });\n\n return (\n <Comp style={styles.tabsRoot} {...rest}>\n <NavigationContent>{children}</NavigationContent>\n </Comp>\n );\n}\n\nexport type UseTabsWithChildrenOptions = UseTabsOptions & {\n children: ReactNode;\n};\n\nexport type UseTabsWithTriggersOptions = UseTabsOptions & {\n triggers: ScreenTrigger[];\n};\n\n/**\n * Hook version of `Tabs`. The returned NavigationContent component\n * should be rendered.\n *\n * @see [`Tabs`](#tabs) for the component version of this hook.\n * @example\n * ```tsx\n * export function MyTabs({ children }) {\n * const { NavigationContent } = useTabsWithChildren({ children })\n *\n * return <NavigationContent />\n * }\n * ```\n */\nexport function useTabsWithChildren(options: UseTabsWithChildrenOptions) {\n const { children, ...rest } = options;\n return useTabsWithTriggers({ triggers: parseTriggersFromChildren(children), ...rest });\n}\n\n/**\n * Alternative hook version of `Tabs` that uses explicit triggers\n * instead of `children`.\n *\n * @see [`Tabs`](#tabs) for the component version of this hook.\n * @example\n * ```tsx\n * export function MyTabs({ children }) {\n * const { NavigationContent } = useTabsWithChildren({ triggers: [] })\n *\n * return <NavigationContent />\n * }\n * ```\n */\nexport function useTabsWithTriggers(options: UseTabsWithTriggersOptions): TabsContextValue {\n const { triggers, ...rest } = options;\n // Ensure we extend the parent triggers, so we can trigger them as well\n const parentTriggerMap = useContext(TabTriggerMapContext);\n const routeNode = useRouteNode();\n const contextKey = useContextKey();\n const linking = useContext(LinkingContext).options;\n const routeInfo = useRouteInfo();\n\n if (!routeNode || !linking) {\n throw new Error('No RouteNode. This is likely a bug in expo-router.');\n }\n\n const initialRouteName = routeNode.initialRouteName;\n\n const { children, triggerMap } = triggersToScreens(\n triggers,\n routeNode,\n linking,\n initialRouteName,\n parentTriggerMap,\n routeInfo,\n contextKey\n );\n\n const navigatorContext = useNavigationBuilder<\n TabNavigationState<any>,\n ExpoTabRouterOptions,\n TabActionHelpers<ParamListBase>,\n ExpoTabsScreenOptions,\n TabNavigationEventMap\n >(ExpoTabRouter, {\n children,\n ...rest,\n triggerMap,\n id: contextKey,\n initialRouteName,\n });\n\n const {\n state,\n descriptors,\n navigation,\n describe,\n NavigationContent: RNNavigationContent,\n } = navigatorContext;\n\n const navigatorContextValue = useMemo<NavigatorContextValue>(\n () => ({\n ...(navigatorContext as unknown as ReturnType<typeof useNavigationBuilder>),\n contextKey,\n router: ExpoTabRouter,\n }),\n [navigatorContext, contextKey, ExpoTabRouter]\n );\n\n const NavigationContent = useComponent((children: React.ReactNode) => (\n <TabTriggerMapContext.Provider value={triggerMap}>\n <NavigatorContext.Provider value={navigatorContextValue}>\n <RNNavigationContent>{children}</RNNavigationContent>\n </NavigatorContext.Provider>\n </TabTriggerMapContext.Provider>\n )) as TabsContextValue['NavigationContent'];\n\n return { state, descriptors, navigation, NavigationContent, describe };\n}\n\nfunction parseTriggersFromChildren(\n children: ReactNode,\n screenTriggers: ScreenTrigger[] = [],\n isInTabList = false\n) {\n Children.forEach(children, (child) => {\n if (!child || !isValidElement(child) || isTabSlot(child)) {\n return;\n }\n\n if (isFragment(child) && typeof child.props.children !== 'function') {\n return parseTriggersFromChildren(\n child.props.children,\n screenTriggers,\n isInTabList || isTabList(child)\n );\n }\n\n if (isTabList(child) && typeof child.props.children !== 'function') {\n let children = child.props.children;\n\n // <TabList asChild /> adds an extra layer. We need to parse the child's children\n if (child.props.asChild && isValidElement(children)) {\n children = children.props.children;\n }\n\n return parseTriggersFromChildren(children, screenTriggers, isInTabList || isTabList(child));\n }\n\n // We should only process TabTriggers within the TabList. All other components will be ignored\n if (!isInTabList || !isTabTrigger(child)) {\n return;\n }\n\n const { href, name } = child.props;\n\n if (!href) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(\n `<TabTrigger name={${name}}> does not have a 'href' prop. TabTriggers within a <TabList /> are required to have a href.`\n );\n }\n return;\n }\n\n const resolvedHref = resolveHref(href);\n\n if (shouldLinkExternally(resolvedHref)) {\n return screenTriggers.push({\n type: 'external',\n name,\n href: resolvedHref,\n });\n }\n\n if (!name) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(\n `<TabTrigger> does not have a 'name' prop. TabTriggers within a <TabList /> are required to have a name.`\n );\n }\n return;\n }\n\n return screenTriggers.push({ type: 'internal', href: resolvedHref, name });\n });\n\n return screenTriggers;\n}\n\nfunction isFragment(\n child: ReactElement<any>\n): child is ReactElement<ComponentProps<typeof Fragment>> {\n return child.type === Fragment;\n}\n\nconst styles = StyleSheet.create({\n tabsRoot: {\n flex: 1,\n },\n});\n"]}
|
package/build/ui/common.d.ts
CHANGED
|
@@ -7,9 +7,9 @@ import { RouteNode } from '../Route';
|
|
|
7
7
|
import { Href } from '../types';
|
|
8
8
|
export declare const ViewSlot: import("react").ForwardRefExoticComponent<ViewProps & import("react").RefAttributes<View>>;
|
|
9
9
|
export declare const SafeAreaViewSlot: import("react").ForwardRefExoticComponent<ViewProps & import("react").RefAttributes<SafeAreaView>>;
|
|
10
|
-
export type ScreenTrigger
|
|
10
|
+
export type ScreenTrigger = {
|
|
11
11
|
type: 'internal';
|
|
12
|
-
href: Href
|
|
12
|
+
href: Href;
|
|
13
13
|
name: string;
|
|
14
14
|
} | {
|
|
15
15
|
type: 'external';
|
|
@@ -33,7 +33,7 @@ type TriggerConfig = {
|
|
|
33
33
|
export type TriggerMap = Record<string, TriggerConfig & {
|
|
34
34
|
index: number;
|
|
35
35
|
}>;
|
|
36
|
-
export declare function triggersToScreens(triggers: ScreenTrigger
|
|
36
|
+
export declare function triggersToScreens(triggers: ScreenTrigger[], layoutRouteNode: RouteNode, linking: LinkingOptions<ParamListBase>, initialRouteName: undefined | string, parentTriggerMap: TriggerMap, routeInfo: UrlObject, contextKey: string): {
|
|
37
37
|
children: import("react").JSX.Element[];
|
|
38
38
|
triggerMap: TriggerMap;
|
|
39
39
|
};
|
package/build/ui/common.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/ui/common.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC9F,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAIhC,eAAO,MAAM,QAAQ,4FAEpB,CAAC;AAEF,eAAO,MAAM,gBAAgB,oGAE5B,CAAC;AAEF,MAAM,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/ui/common.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC9F,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAIhC,eAAO,MAAM,QAAQ,4FAEpB,CAAC;AAEF,eAAO,MAAM,gBAAgB,oGAE5B,CAAC;AAEF,MAAM,MAAM,aAAa,GACrB;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEN,KAAK,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC;AAC9E,KAAK,aAAa,GACd;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,sBAAsB,CAAC;CAChC,GACD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE3E,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,aAAa,EAAE,EACzB,eAAe,EAAE,SAAS,EAC1B,OAAO,EAAE,cAAc,CAAC,aAAa,CAAC,EACtC,gBAAgB,EAAE,SAAS,GAAG,MAAM,EACpC,gBAAgB,EAAE,UAAU,EAC5B,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,MAAM;;;EAyInB;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,GAAG,SAAS,EAClE,YAAY,CAAC,EAAE,MAAM,GACpB,sBAAsB,CAoCxB"}
|
package/build/ui/common.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/ui/common.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Slot } from '@radix-ui/react-slot';\nimport { LinkingOptions, ParamListBase, PartialRoute, Route } from '@react-navigation/native';\nimport { ViewProps, View, SafeAreaView } from 'react-native';\n\nimport type { ExpoTabActionType } from './TabRouter';\nimport { UrlObject } from '../LocationProvider';\nimport { RouteNode } from '../Route';\nimport { resolveHref, resolveHrefStringWithSegments } from '../link/href';\nimport { sortRoutesWithInitial } from '../sortRoutes';\nimport { Href } from '../types';\nimport { routeToScreen } from '../useScreens';\n\n// Fix the TypeScript types for <Slot />. It complains about the ViewProps[\"style\"]\nexport const ViewSlot = Slot as React.ForwardRefExoticComponent<\n ViewProps & React.RefAttributes<View>\n>;\n\nexport const SafeAreaViewSlot = Slot as React.ForwardRefExoticComponent<\n ViewProps & React.RefAttributes<SafeAreaView>\n>;\n\nexport type ScreenTrigger<T extends string | object> =\n | {\n type: 'internal';\n href: Href<T>;\n name: string;\n }\n | {\n type: 'external';\n name: string;\n href: string;\n };\n\ntype JumpToNavigationAction = Extract<ExpoTabActionType, { type: 'JUMP_TO' }>;\ntype TriggerConfig =\n | {\n type: 'internal';\n name: string;\n href: string;\n routeNode: RouteNode;\n action: JumpToNavigationAction;\n }\n | { type: 'external'; name: string; href: string };\n\nexport type TriggerMap = Record<string, TriggerConfig & { index: number }>;\n\nexport function triggersToScreens(\n triggers: ScreenTrigger<any>[],\n layoutRouteNode: RouteNode,\n linking: LinkingOptions<ParamListBase>,\n initialRouteName: undefined | string,\n parentTriggerMap: TriggerMap,\n routeInfo: UrlObject,\n contextKey: string\n) {\n const configs: TriggerConfig[] = [];\n\n for (const trigger of triggers) {\n if (trigger.name in parentTriggerMap) {\n const parentTrigger = parentTriggerMap[trigger.name];\n throw new Error(\n `Trigger ${JSON.stringify({\n name: trigger.name,\n href: trigger.href,\n })} has the same name as parent trigger ${JSON.stringify({\n name: parentTrigger.name,\n href: parentTrigger.href,\n })}. Triggers must have unique names.`\n );\n }\n\n if (trigger.type === 'external') {\n configs.push(trigger);\n continue;\n }\n\n let resolvedHref = resolveHref(trigger.href);\n\n if (resolvedHref.startsWith('../')) {\n throw new Error('Trigger href cannot link to a parent directory');\n }\n\n const segmentsWithoutGroups = contextKey.split('/').filter((segment) => {\n return !(segment.startsWith('(') && segment.endsWith(')'));\n });\n\n resolvedHref = resolveHrefStringWithSegments(\n resolvedHref,\n {\n ...routeInfo,\n segments: segmentsWithoutGroups,\n },\n true\n );\n\n let state = linking.getStateFromPath?.(resolvedHref, linking.config)?.routes[0];\n\n if (!state) {\n // This shouldn't occur, as you should get the global +not-found\n console.warn(\n `Unable to find screen for trigger ${JSON.stringify(trigger)}. Does this point to a valid screen?`\n );\n continue;\n }\n\n let routeState = state;\n\n // The state object is the current state from the rootNavigator\n // We need to work out the state for just this trigger\n if (layoutRouteNode.route) {\n while (state?.state) {\n const previousState = state;\n if (previousState.name === layoutRouteNode.route) break;\n state = state.state.routes[state.state.index ?? state.state.routes.length - 1];\n }\n routeState = state.state?.routes[state.state.index ?? state.state.routes.length - 1] || state;\n }\n\n const routeNode = layoutRouteNode.children.find((child) => child.route === routeState?.name);\n if (!routeNode) {\n console.warn(\n `Unable to find routeNode for trigger ${JSON.stringify(trigger)}. This might be a bug with Expo Router`\n );\n continue;\n }\n\n if (routeNode.generated && routeNode.internal && routeNode.route.includes('+not-found')) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `Tab trigger '${trigger.name}' has the href '${trigger.href}' which points to a +not-found route.`\n );\n }\n continue;\n }\n\n const duplicateTrigger =\n trigger.type === 'internal' &&\n configs.find((config): config is Extract<TriggerConfig, { type: 'internal' }> => {\n if (config.type === 'external') {\n return false;\n }\n\n return config.routeNode.route === routeNode.route;\n });\n\n if (duplicateTrigger) {\n const duplicateTriggerText = `${JSON.stringify({ name: duplicateTrigger.name, href: duplicateTrigger.href })} and ${JSON.stringify({ name: trigger.name, href: trigger.href })}`;\n\n throw new Error(\n `A navigator cannot contain multiple trigger components that map to the same sub-segment. Consider adding a shared group and assigning a group to each trigger. Conflicting triggers:\\n\\t${duplicateTriggerText}.\\nBoth triggers map to route ${routeNode.route}.`\n );\n }\n\n configs.push({\n ...trigger,\n href: resolvedHref,\n routeNode,\n action: stateToAction(state, layoutRouteNode.route),\n });\n }\n\n const sortFn = sortRoutesWithInitial(initialRouteName);\n\n const sortedConfigs = configs.sort((a, b) => {\n // External routes should be last. They will eventually be dropped\n if (a.type === 'external' && b.type === 'external') {\n return 0;\n } else if (a.type === 'external') {\n return 1;\n } else if (b.type === 'external') {\n return -1;\n }\n\n return sortFn(a.routeNode, b.routeNode);\n });\n\n const children: React.JSX.Element[] = [];\n const triggerMap: TriggerMap = { ...parentTriggerMap };\n\n for (const [index, config] of sortedConfigs.entries()) {\n triggerMap[config.name] = { ...config, index };\n\n if (config.type === 'internal') {\n children.push(routeToScreen(config.routeNode));\n }\n }\n return {\n children,\n triggerMap,\n };\n}\n\nexport function stateToAction(\n state: PartialRoute<Route<string, object | undefined>> | undefined,\n startAtRoute?: string\n): JumpToNavigationAction {\n const rootPayload: any = {};\n let payload = rootPayload;\n\n let foundStartingPoint = !startAtRoute || !state?.state;\n\n while (state) {\n if (foundStartingPoint) {\n if (payload === rootPayload) {\n payload.name = state.name;\n } else {\n payload.screen = state.name;\n }\n payload.params = state.params ? { ...state.params } : {};\n\n state = state.state?.routes[state.state?.routes.length - 1];\n\n if (state) {\n payload.params ??= {};\n payload = payload.params;\n }\n } else {\n if (state.name === startAtRoute) {\n foundStartingPoint = true;\n }\n const nextState = state.state?.routes[state.state?.routes.length - 1];\n if (nextState) {\n state = nextState;\n }\n }\n }\n\n return {\n type: 'JUMP_TO',\n payload: rootPayload,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/ui/common.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Slot } from '@radix-ui/react-slot';\nimport { LinkingOptions, ParamListBase, PartialRoute, Route } from '@react-navigation/native';\nimport { ViewProps, View, SafeAreaView } from 'react-native';\n\nimport type { ExpoTabActionType } from './TabRouter';\nimport { UrlObject } from '../LocationProvider';\nimport { RouteNode } from '../Route';\nimport { resolveHref, resolveHrefStringWithSegments } from '../link/href';\nimport { sortRoutesWithInitial } from '../sortRoutes';\nimport { Href } from '../types';\nimport { routeToScreen } from '../useScreens';\n\n// Fix the TypeScript types for <Slot />. It complains about the ViewProps[\"style\"]\nexport const ViewSlot = Slot as React.ForwardRefExoticComponent<\n ViewProps & React.RefAttributes<View>\n>;\n\nexport const SafeAreaViewSlot = Slot as React.ForwardRefExoticComponent<\n ViewProps & React.RefAttributes<SafeAreaView>\n>;\n\nexport type ScreenTrigger =\n | {\n type: 'internal';\n href: Href;\n name: string;\n }\n | {\n type: 'external';\n name: string;\n href: string;\n };\n\ntype JumpToNavigationAction = Extract<ExpoTabActionType, { type: 'JUMP_TO' }>;\ntype TriggerConfig =\n | {\n type: 'internal';\n name: string;\n href: string;\n routeNode: RouteNode;\n action: JumpToNavigationAction;\n }\n | { type: 'external'; name: string; href: string };\n\nexport type TriggerMap = Record<string, TriggerConfig & { index: number }>;\n\nexport function triggersToScreens(\n triggers: ScreenTrigger[],\n layoutRouteNode: RouteNode,\n linking: LinkingOptions<ParamListBase>,\n initialRouteName: undefined | string,\n parentTriggerMap: TriggerMap,\n routeInfo: UrlObject,\n contextKey: string\n) {\n const configs: TriggerConfig[] = [];\n\n for (const trigger of triggers) {\n if (trigger.name in parentTriggerMap) {\n const parentTrigger = parentTriggerMap[trigger.name];\n throw new Error(\n `Trigger ${JSON.stringify({\n name: trigger.name,\n href: trigger.href,\n })} has the same name as parent trigger ${JSON.stringify({\n name: parentTrigger.name,\n href: parentTrigger.href,\n })}. Triggers must have unique names.`\n );\n }\n\n if (trigger.type === 'external') {\n configs.push(trigger);\n continue;\n }\n\n let resolvedHref = resolveHref(trigger.href);\n\n if (resolvedHref.startsWith('../')) {\n throw new Error('Trigger href cannot link to a parent directory');\n }\n\n const segmentsWithoutGroups = contextKey.split('/').filter((segment) => {\n return !(segment.startsWith('(') && segment.endsWith(')'));\n });\n\n resolvedHref = resolveHrefStringWithSegments(\n resolvedHref,\n {\n ...routeInfo,\n segments: segmentsWithoutGroups,\n },\n true\n );\n\n let state = linking.getStateFromPath?.(resolvedHref, linking.config)?.routes[0];\n\n if (!state) {\n // This shouldn't occur, as you should get the global +not-found\n console.warn(\n `Unable to find screen for trigger ${JSON.stringify(trigger)}. Does this point to a valid screen?`\n );\n continue;\n }\n\n let routeState = state;\n\n // The state object is the current state from the rootNavigator\n // We need to work out the state for just this trigger\n if (layoutRouteNode.route) {\n while (state?.state) {\n const previousState = state;\n if (previousState.name === layoutRouteNode.route) break;\n state = state.state.routes[state.state.index ?? state.state.routes.length - 1];\n }\n routeState = state.state?.routes[state.state.index ?? state.state.routes.length - 1] || state;\n }\n\n const routeNode = layoutRouteNode.children.find((child) => child.route === routeState?.name);\n if (!routeNode) {\n console.warn(\n `Unable to find routeNode for trigger ${JSON.stringify(trigger)}. This might be a bug with Expo Router`\n );\n continue;\n }\n\n if (routeNode.generated && routeNode.internal && routeNode.route.includes('+not-found')) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `Tab trigger '${trigger.name}' has the href '${trigger.href}' which points to a +not-found route.`\n );\n }\n continue;\n }\n\n const duplicateTrigger =\n trigger.type === 'internal' &&\n configs.find((config): config is Extract<TriggerConfig, { type: 'internal' }> => {\n if (config.type === 'external') {\n return false;\n }\n\n return config.routeNode.route === routeNode.route;\n });\n\n if (duplicateTrigger) {\n const duplicateTriggerText = `${JSON.stringify({ name: duplicateTrigger.name, href: duplicateTrigger.href })} and ${JSON.stringify({ name: trigger.name, href: trigger.href })}`;\n\n throw new Error(\n `A navigator cannot contain multiple trigger components that map to the same sub-segment. Consider adding a shared group and assigning a group to each trigger. Conflicting triggers:\\n\\t${duplicateTriggerText}.\\nBoth triggers map to route ${routeNode.route}.`\n );\n }\n\n configs.push({\n ...trigger,\n href: resolvedHref,\n routeNode,\n action: stateToAction(state, layoutRouteNode.route),\n });\n }\n\n const sortFn = sortRoutesWithInitial(initialRouteName);\n\n const sortedConfigs = configs.sort((a, b) => {\n // External routes should be last. They will eventually be dropped\n if (a.type === 'external' && b.type === 'external') {\n return 0;\n } else if (a.type === 'external') {\n return 1;\n } else if (b.type === 'external') {\n return -1;\n }\n\n return sortFn(a.routeNode, b.routeNode);\n });\n\n const children: React.JSX.Element[] = [];\n const triggerMap: TriggerMap = { ...parentTriggerMap };\n\n for (const [index, config] of sortedConfigs.entries()) {\n triggerMap[config.name] = { ...config, index };\n\n if (config.type === 'internal') {\n children.push(routeToScreen(config.routeNode));\n }\n }\n return {\n children,\n triggerMap,\n };\n}\n\nexport function stateToAction(\n state: PartialRoute<Route<string, object | undefined>> | undefined,\n startAtRoute?: string\n): JumpToNavigationAction {\n const rootPayload: any = {};\n let payload = rootPayload;\n\n let foundStartingPoint = !startAtRoute || !state?.state;\n\n while (state) {\n if (foundStartingPoint) {\n if (payload === rootPayload) {\n payload.name = state.name;\n } else {\n payload.screen = state.name;\n }\n payload.params = state.params ? { ...state.params } : {};\n\n state = state.state?.routes[state.state?.routes.length - 1];\n\n if (state) {\n payload.params ??= {};\n payload = payload.params;\n }\n } else {\n if (state.name === startAtRoute) {\n foundStartingPoint = true;\n }\n const nextState = state.state?.routes[state.state?.routes.length - 1];\n if (nextState) {\n state = nextState;\n }\n }\n }\n\n return {\n type: 'JUMP_TO',\n payload: rootPayload,\n };\n}\n"]}
|
|
@@ -3,9 +3,12 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export type EffectCallback = () => undefined | void | (() => void);
|
|
5
5
|
/**
|
|
6
|
-
* Hook to run an effect whenever a route is
|
|
6
|
+
* Hook to run an effect whenever a route is **focused**. Similar to
|
|
7
|
+
* [`React.useEffect`](https://react.dev/reference/react/useEffect).
|
|
8
|
+
*
|
|
7
9
|
* This can be used to perform side-effects such as fetching data or subscribing to events.
|
|
8
|
-
* The passed callback should be wrapped in `React.useCallback`
|
|
10
|
+
* The passed callback should be wrapped in [`React.useCallback`](https://react.dev/reference/react/useCallback)
|
|
11
|
+
* to avoid running the effect too often.
|
|
9
12
|
*
|
|
10
13
|
* @example
|
|
11
14
|
* ```tsx
|
|
@@ -17,10 +20,16 @@ export type EffectCallback = () => undefined | void | (() => void);
|
|
|
17
20
|
* // Callback should be wrapped in `React.useCallback` to avoid running the effect too often.
|
|
18
21
|
* useCallback(() => {
|
|
19
22
|
* // Invoked whenever the route is focused.
|
|
20
|
-
* console.log('Hello')
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
23
|
+
* console.log('Hello, I'm focused!');
|
|
24
|
+
*
|
|
25
|
+
* // Return function is invoked whenever the route gets out of focus.
|
|
26
|
+
* return () => {
|
|
27
|
+
* console.log('This route is now unfocused.');
|
|
28
|
+
* };
|
|
29
|
+
* }, []);
|
|
30
|
+
* );
|
|
31
|
+
*
|
|
32
|
+
* return </>;
|
|
24
33
|
* }
|
|
25
34
|
*```
|
|
26
35
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFocusEffect.d.ts","sourceRoot":"","sources":["../src/useFocusEffect.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;AAEnE
|
|
1
|
+
{"version":3,"file":"useFocusEffect.d.ts","sourceRoot":"","sources":["../src/useFocusEffect.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;AAEnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,yBAAyB,CAAC,EAAE,KAAK,QAsGvF"}
|