@gtkx/navigation 2.0.0-beta.10 → 2.0.0-beta.11
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/README.md +8 -168
- package/dist/drawer/create-drawer-navigator.d.ts.map +1 -1
- package/dist/drawer/create-drawer-navigator.js +2 -2
- package/dist/drawer/create-drawer-navigator.js.map +1 -1
- package/dist/drawer/drawer-item-list.d.ts.map +1 -1
- package/dist/drawer/drawer-item-list.js +3 -2
- package/dist/drawer/drawer-item-list.js.map +1 -1
- package/dist/drawer/drawer-status.d.ts +2 -2
- package/dist/drawer/drawer-status.d.ts.map +1 -1
- package/dist/drawer/drawer-status.js +1 -9
- package/dist/drawer/drawer-status.js.map +1 -1
- package/dist/drawer/drawer-view.d.ts.map +1 -1
- package/dist/drawer/drawer-view.js +4 -8
- package/dist/drawer/drawer-view.js.map +1 -1
- package/dist/shared/scene-page.d.ts.map +1 -1
- package/dist/shared/scene-page.js +8 -1
- package/dist/shared/scene-page.js.map +1 -1
- package/dist/split-view/create-split-view-navigator.d.ts.map +1 -1
- package/dist/split-view/create-split-view-navigator.js +2 -2
- package/dist/split-view/create-split-view-navigator.js.map +1 -1
- package/dist/stack/create-stack-navigator.d.ts.map +1 -1
- package/dist/stack/create-stack-navigator.js +2 -2
- package/dist/stack/create-stack-navigator.js.map +1 -1
- package/dist/stack/stack-pages.d.ts.map +1 -1
- package/dist/stack/stack-pages.js +1 -9
- package/dist/stack/stack-pages.js.map +1 -1
- package/dist/stack/stack-view.d.ts.map +1 -1
- package/dist/stack/stack-view.js +1 -10
- package/dist/stack/stack-view.js.map +1 -1
- package/dist/tabs/create-tab-navigator.d.ts.map +1 -1
- package/dist/tabs/create-tab-navigator.js +2 -2
- package/dist/tabs/create-tab-navigator.js.map +1 -1
- package/dist/tabs/tab-view.d.ts.map +1 -1
- package/dist/tabs/tab-view.js +1 -3
- package/dist/tabs/tab-view.js.map +1 -1
- package/package.json +11 -9
- package/src/drawer/create-drawer-navigator.tsx +14 -16
- package/src/drawer/drawer-item-list.tsx +8 -5
- package/src/drawer/drawer-status.ts +3 -16
- package/src/drawer/drawer-view.tsx +4 -9
- package/src/shared/scene-page.tsx +21 -12
- package/src/split-view/create-split-view-navigator.tsx +15 -17
- package/src/stack/create-stack-navigator.tsx +9 -11
- package/src/stack/stack-pages.ts +1 -13
- package/src/stack/stack-view.tsx +1 -15
- package/src/tabs/create-tab-navigator.tsx +3 -5
- package/src/tabs/tab-view.tsx +1 -3
- package/dist/shared/use-loaded-routes.d.ts +0 -3
- package/dist/shared/use-loaded-routes.d.ts.map +0 -1
- package/dist/shared/use-loaded-routes.js +0 -11
- package/dist/shared/use-loaded-routes.js.map +0 -1
- package/src/shared/use-loaded-routes.ts +0 -14
package/src/stack/stack-pages.ts
CHANGED
|
@@ -33,18 +33,6 @@ const neededKeys = (state: StackState, closing: StackDescriptorMap, offset: numb
|
|
|
33
33
|
const hasSameMembers = (left: readonly string[], right: readonly string[]): boolean =>
|
|
34
34
|
left.length === right.length && left.every((key) => right.includes(key));
|
|
35
35
|
|
|
36
|
-
const hasRefreshedFocus = (tracking: PageTracking, descriptors: StackDescriptorMap): boolean => {
|
|
37
|
-
const { focusedKey } = tracking;
|
|
38
|
-
|
|
39
|
-
if (focusedKey === undefined) {
|
|
40
|
-
return false;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const next = descriptors[focusedKey];
|
|
44
|
-
|
|
45
|
-
return next !== undefined && tracking.descriptors[focusedKey]?.route !== next.route;
|
|
46
|
-
};
|
|
47
|
-
|
|
48
36
|
const appendOrder = (previous: readonly string[], needed: readonly string[]): string[] => [
|
|
49
37
|
...previous.filter((key) => needed.includes(key)),
|
|
50
38
|
...needed.filter((key) => !previous.includes(key)),
|
|
@@ -114,7 +102,7 @@ const useStackPages = (
|
|
|
114
102
|
|
|
115
103
|
if (!hasSameMembers(tracking.order, neededKeys(state, tracking.closing, offset)) ||
|
|
116
104
|
tracking.focusedKey !== getFocusedKey(state, offset) ||
|
|
117
|
-
|
|
105
|
+
tracking.descriptors !== descriptors) {
|
|
118
106
|
setTracking(advance(tracking, state, descriptors, offset));
|
|
119
107
|
}
|
|
120
108
|
|
package/src/stack/stack-view.tsx
CHANGED
|
@@ -11,14 +11,12 @@ import type {
|
|
|
11
11
|
StackNavigationConfig,
|
|
12
12
|
StackNavigationEventMap,
|
|
13
13
|
StackNavigationHelpers,
|
|
14
|
-
StackNavigationOptions,
|
|
15
14
|
} from "./types.js";
|
|
16
15
|
import { HeaderBar } from "../shared/header-bar.js";
|
|
17
16
|
import { useStackPages } from "./stack-pages.js";
|
|
18
17
|
import { reconcilePoppedStack, syncNavigationStack } from "./sync-navigation-stack.js";
|
|
19
18
|
|
|
20
19
|
type ViewRef = RefObject<Adw.NavigationView | null>;
|
|
21
|
-
type MutableOptions = Record<string, StackNavigationOptions>;
|
|
22
20
|
|
|
23
21
|
type StackViewProps = StackNavigationConfig & {
|
|
24
22
|
state: StackNavigationState<ParamListBase>;
|
|
@@ -59,18 +57,6 @@ const useLatest = <T,>(value: T): RefObject<T> => {
|
|
|
59
57
|
return ref;
|
|
60
58
|
};
|
|
61
59
|
|
|
62
|
-
const useTrackedOptions = (descriptors: StackDescriptorMap): RefObject<MutableOptions> => {
|
|
63
|
-
const optionsRef = useRef<MutableOptions>({});
|
|
64
|
-
|
|
65
|
-
useEffect(() => {
|
|
66
|
-
for (const [key, descriptor] of Object.entries(descriptors)) {
|
|
67
|
-
optionsRef.current[key] = descriptor.options;
|
|
68
|
-
}
|
|
69
|
-
}, [descriptors]);
|
|
70
|
-
|
|
71
|
-
return optionsRef;
|
|
72
|
-
};
|
|
73
|
-
|
|
74
60
|
const useStackSync = (
|
|
75
61
|
viewRef: ViewRef,
|
|
76
62
|
state: StackNavigationState<ParamListBase>,
|
|
@@ -179,8 +165,8 @@ const StackPage = ({ descriptor, previous, navigation, onHidden }: StackPageProp
|
|
|
179
165
|
const StackView = (props: StackViewProps): ReactNode => {
|
|
180
166
|
const { state, navigation, descriptors, describe, popOnEscape, offset = 0 } = props;
|
|
181
167
|
const viewRef = useRef<Adw.NavigationView | null>(null);
|
|
182
|
-
const options = useTrackedOptions(descriptors);
|
|
183
168
|
const { pages, release } = useStackPages(state, descriptors, describe, offset);
|
|
169
|
+
const options = useLatest<OptionsByKey>(Object.fromEntries(pages.map((page) => [page.route.key, page.options])));
|
|
184
170
|
const onPopped = usePoppedHandler(viewRef, navigation, options, offset);
|
|
185
171
|
useStackSync(viewRef, state, options, offset);
|
|
186
172
|
|
|
@@ -41,7 +41,7 @@ const createTabScreen: StaticScreenFactory<TabTypeBag> = createScreenFactory<Tab
|
|
|
41
41
|
|
|
42
42
|
/** Renders the screens of a {@link createTabNavigator} as pages of an `AdwViewStack` with a view switcher. */
|
|
43
43
|
function TabNavigator({ tabBarPosition, ...options }: TabNavigatorProps): ReactNode {
|
|
44
|
-
const { state, descriptors, navigation,
|
|
44
|
+
const { state, descriptors, navigation, render } = useNavigationBuilder<
|
|
45
45
|
TabNavigationState<ParamListBase>,
|
|
46
46
|
TabRouterOptions,
|
|
47
47
|
TabActionHelpers<ParamListBase>,
|
|
@@ -49,10 +49,8 @@ function TabNavigator({ tabBarPosition, ...options }: TabNavigatorProps): ReactN
|
|
|
49
49
|
TabNavigationEventMap
|
|
50
50
|
>(TabRouter, options);
|
|
51
51
|
|
|
52
|
-
return (
|
|
53
|
-
<
|
|
54
|
-
<TabView tabBarPosition={tabBarPosition} state={state} navigation={navigation} descriptors={descriptors} />
|
|
55
|
-
</NavigationContent>
|
|
52
|
+
return render(
|
|
53
|
+
<TabView tabBarPosition={tabBarPosition} state={state} navigation={navigation} descriptors={descriptors} />,
|
|
56
54
|
);
|
|
57
55
|
}
|
|
58
56
|
|
package/src/tabs/tab-view.tsx
CHANGED
|
@@ -8,7 +8,6 @@ import type { TabDescriptor, TabDescriptorMap, TabNavigationConfig, TabNavigatio
|
|
|
8
8
|
import { HeaderBar } from "../shared/header-bar.js";
|
|
9
9
|
import { getFocusedRoute, requireDescriptor } from "../shared/routes.js";
|
|
10
10
|
import { ScenePage } from "../shared/scene-page.js";
|
|
11
|
-
import { useLoadedRoutes } from "../shared/use-loaded-routes.js";
|
|
12
11
|
import { usePopToTopOnBlur } from "../shared/use-pop-to-top-on-blur.js";
|
|
13
12
|
|
|
14
13
|
type TabViewProps = TabNavigationConfig & {
|
|
@@ -88,7 +87,6 @@ const TabView = ({ state, navigation, descriptors, tabBarPosition = "top" }: Tab
|
|
|
88
87
|
const [stack, setStack] = useState<Adw.ViewStack | null>(null);
|
|
89
88
|
const focused = getFocusedRoute(state);
|
|
90
89
|
const descriptor = requireDescriptor(descriptors, focused.key);
|
|
91
|
-
const loaded = useLoadedRoutes(focused.key, state.preloadedRouteKeys);
|
|
92
90
|
const onVisibleChildChanged = useTabSelection(navigation);
|
|
93
91
|
|
|
94
92
|
const viewSwitcher = stack === null
|
|
@@ -115,7 +113,7 @@ const TabView = ({ state, navigation, descriptors, tabBarPosition = "top" }: Tab
|
|
|
115
113
|
<TabPage
|
|
116
114
|
key={route.key}
|
|
117
115
|
descriptor={requireDescriptor(descriptors, route.key)}
|
|
118
|
-
isLoaded={
|
|
116
|
+
isLoaded={route.key === focused.key || state.preloadedRouteKeys.includes(route.key)}
|
|
119
117
|
/>
|
|
120
118
|
))}
|
|
121
119
|
</AdwViewStack>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-loaded-routes.d.ts","sourceRoot":"","sources":["../../src/shared/use-loaded-routes.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,eAAe,GAAI,YAAY,MAAM,EAAE,eAAe,SAAS,MAAM,EAAE,KAAG,WAAW,CAAC,MAAM,CASjG,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { useState } from "react";
|
|
2
|
-
const useLoadedRoutes = (focusedKey, preloadedKeys) => {
|
|
3
|
-
const [loaded, setLoaded] = useState(() => new Set([focusedKey]));
|
|
4
|
-
const pending = [focusedKey, ...preloadedKeys].filter((key) => !loaded.has(key));
|
|
5
|
-
if (pending.length > 0) {
|
|
6
|
-
setLoaded(new Set([...loaded, ...pending]));
|
|
7
|
-
}
|
|
8
|
-
return loaded;
|
|
9
|
-
};
|
|
10
|
-
export { useLoadedRoutes };
|
|
11
|
-
//# sourceMappingURL=use-loaded-routes.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-loaded-routes.js","sourceRoot":"","sources":["../../src/shared/use-loaded-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,MAAM,eAAe,GAAG,CAAC,UAAkB,EAAE,aAAgC,EAAuB,EAAE;IAClG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAsB,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACvF,MAAM,OAAO,GAAG,CAAC,UAAU,EAAE,GAAG,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAEjF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC","sourcesContent":["import { useState } from \"react\";\n\nconst useLoadedRoutes = (focusedKey: string, preloadedKeys: readonly string[]): ReadonlySet<string> => {\n const [loaded, setLoaded] = useState<ReadonlySet<string>>(() => new Set([focusedKey]));\n const pending = [focusedKey, ...preloadedKeys].filter((key) => !loaded.has(key));\n\n if (pending.length > 0) {\n setLoaded(new Set([...loaded, ...pending]));\n }\n\n return loaded;\n};\n\nexport { useLoadedRoutes };\n"]}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { useState } from "react";
|
|
2
|
-
|
|
3
|
-
const useLoadedRoutes = (focusedKey: string, preloadedKeys: readonly string[]): ReadonlySet<string> => {
|
|
4
|
-
const [loaded, setLoaded] = useState<ReadonlySet<string>>(() => new Set([focusedKey]));
|
|
5
|
-
const pending = [focusedKey, ...preloadedKeys].filter((key) => !loaded.has(key));
|
|
6
|
-
|
|
7
|
-
if (pending.length > 0) {
|
|
8
|
-
setLoaded(new Set([...loaded, ...pending]));
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
return loaded;
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
export { useLoadedRoutes };
|