@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.
Files changed (52) hide show
  1. package/README.md +8 -168
  2. package/dist/drawer/create-drawer-navigator.d.ts.map +1 -1
  3. package/dist/drawer/create-drawer-navigator.js +2 -2
  4. package/dist/drawer/create-drawer-navigator.js.map +1 -1
  5. package/dist/drawer/drawer-item-list.d.ts.map +1 -1
  6. package/dist/drawer/drawer-item-list.js +3 -2
  7. package/dist/drawer/drawer-item-list.js.map +1 -1
  8. package/dist/drawer/drawer-status.d.ts +2 -2
  9. package/dist/drawer/drawer-status.d.ts.map +1 -1
  10. package/dist/drawer/drawer-status.js +1 -9
  11. package/dist/drawer/drawer-status.js.map +1 -1
  12. package/dist/drawer/drawer-view.d.ts.map +1 -1
  13. package/dist/drawer/drawer-view.js +4 -8
  14. package/dist/drawer/drawer-view.js.map +1 -1
  15. package/dist/shared/scene-page.d.ts.map +1 -1
  16. package/dist/shared/scene-page.js +8 -1
  17. package/dist/shared/scene-page.js.map +1 -1
  18. package/dist/split-view/create-split-view-navigator.d.ts.map +1 -1
  19. package/dist/split-view/create-split-view-navigator.js +2 -2
  20. package/dist/split-view/create-split-view-navigator.js.map +1 -1
  21. package/dist/stack/create-stack-navigator.d.ts.map +1 -1
  22. package/dist/stack/create-stack-navigator.js +2 -2
  23. package/dist/stack/create-stack-navigator.js.map +1 -1
  24. package/dist/stack/stack-pages.d.ts.map +1 -1
  25. package/dist/stack/stack-pages.js +1 -9
  26. package/dist/stack/stack-pages.js.map +1 -1
  27. package/dist/stack/stack-view.d.ts.map +1 -1
  28. package/dist/stack/stack-view.js +1 -10
  29. package/dist/stack/stack-view.js.map +1 -1
  30. package/dist/tabs/create-tab-navigator.d.ts.map +1 -1
  31. package/dist/tabs/create-tab-navigator.js +2 -2
  32. package/dist/tabs/create-tab-navigator.js.map +1 -1
  33. package/dist/tabs/tab-view.d.ts.map +1 -1
  34. package/dist/tabs/tab-view.js +1 -3
  35. package/dist/tabs/tab-view.js.map +1 -1
  36. package/package.json +11 -9
  37. package/src/drawer/create-drawer-navigator.tsx +14 -16
  38. package/src/drawer/drawer-item-list.tsx +8 -5
  39. package/src/drawer/drawer-status.ts +3 -16
  40. package/src/drawer/drawer-view.tsx +4 -9
  41. package/src/shared/scene-page.tsx +21 -12
  42. package/src/split-view/create-split-view-navigator.tsx +15 -17
  43. package/src/stack/create-stack-navigator.tsx +9 -11
  44. package/src/stack/stack-pages.ts +1 -13
  45. package/src/stack/stack-view.tsx +1 -15
  46. package/src/tabs/create-tab-navigator.tsx +3 -5
  47. package/src/tabs/tab-view.tsx +1 -3
  48. package/dist/shared/use-loaded-routes.d.ts +0 -3
  49. package/dist/shared/use-loaded-routes.d.ts.map +0 -1
  50. package/dist/shared/use-loaded-routes.js +0 -11
  51. package/dist/shared/use-loaded-routes.js.map +0 -1
  52. package/src/shared/use-loaded-routes.ts +0 -14
@@ -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
- hasRefreshedFocus(tracking, descriptors)) {
105
+ tracking.descriptors !== descriptors) {
118
106
  setTracking(advance(tracking, state, descriptors, offset));
119
107
  }
120
108
 
@@ -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, NavigationContent } = useNavigationBuilder<
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
- <NavigationContent>
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
 
@@ -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={loaded.has(route.key)}
116
+ isLoaded={route.key === focused.key || state.preloadedRouteKeys.includes(route.key)}
119
117
  />
120
118
  ))}
121
119
  </AdwViewStack>
@@ -1,3 +0,0 @@
1
- declare const useLoadedRoutes: (focusedKey: string, preloadedKeys: readonly string[]) => ReadonlySet<string>;
2
- export { useLoadedRoutes };
3
- //# sourceMappingURL=use-loaded-routes.d.ts.map
@@ -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 };