@gtkx/navigation 2.0.0-beta.1 → 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 -165
- 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 +12 -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
|
@@ -9,14 +9,6 @@ const neededKeys = (state, closing, offset) => [
|
|
|
9
9
|
...Object.keys(closing),
|
|
10
10
|
];
|
|
11
11
|
const hasSameMembers = (left, right) => left.length === right.length && left.every((key) => right.includes(key));
|
|
12
|
-
const hasRefreshedFocus = (tracking, descriptors) => {
|
|
13
|
-
const { focusedKey } = tracking;
|
|
14
|
-
if (focusedKey === undefined) {
|
|
15
|
-
return false;
|
|
16
|
-
}
|
|
17
|
-
const next = descriptors[focusedKey];
|
|
18
|
-
return next !== undefined && tracking.descriptors[focusedKey]?.route !== next.route;
|
|
19
|
-
};
|
|
20
12
|
const appendOrder = (previous, needed) => [
|
|
21
13
|
...previous.filter((key) => needed.includes(key)),
|
|
22
14
|
...needed.filter((key) => !previous.includes(key)),
|
|
@@ -58,7 +50,7 @@ const useStackPages = (state, descriptors, describe, offset) => {
|
|
|
58
50
|
const [tracking, setTracking] = useState(() => initialTracking(state, descriptors, offset));
|
|
59
51
|
if (!hasSameMembers(tracking.order, neededKeys(state, tracking.closing, offset)) ||
|
|
60
52
|
tracking.focusedKey !== getFocusedKey(state, offset) ||
|
|
61
|
-
|
|
53
|
+
tracking.descriptors !== descriptors) {
|
|
62
54
|
setTracking(advance(tracking, state, descriptors, offset));
|
|
63
55
|
}
|
|
64
56
|
const release = useCallback((key) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stack-pages.js","sourceRoot":"","sources":["../../src/stack/stack-pages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAkB9C,MAAM,aAAa,GAAG,CAAC,KAAiB,EAAE,MAAc,EAAsB,EAAE,CAC5E,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC;AAEtE,MAAM,WAAW,GAAG,CAAC,KAAiB,EAAE,MAAc,EAAY,EAAE,CAAC;IACjE,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;IACvD,GAAG,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;CACrD,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,KAAiB,EAAE,OAA2B,EAAE,MAAc,EAAY,EAAE,CAAC;IAC7F,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC;IAC7B,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,IAAuB,EAAE,KAAwB,EAAW,EAAE,CAClF,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAE7E,MAAM,
|
|
1
|
+
{"version":3,"file":"stack-pages.js","sourceRoot":"","sources":["../../src/stack/stack-pages.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ParamListBase, RouteProp, StackNavigationState } from \"@react-navigation/core\";\nimport { useCallback, useState } from \"react\";\nimport type { StackDescriptor, StackDescriptorMap } from \"./types.js\";\n\ntype StackState = StackNavigationState<ParamListBase>;\ntype Describe = (route: RouteProp<ParamListBase>, isPlaceholder: boolean) => StackDescriptor;\n\ntype PageTracking = {\n order: readonly string[];\n focusedKey: string | undefined;\n descriptors: StackDescriptorMap;\n closing: StackDescriptorMap;\n};\n\ntype StackPages = {\n pages: readonly StackDescriptor[];\n release: (key: string) => void;\n};\n\nconst getFocusedKey = (state: StackState, offset: number): string | undefined =>\n state.index < offset ? undefined : state.routes[state.index]?.key;\n\nconst mountedKeys = (state: StackState, offset: number): string[] => [\n ...state.routes.slice(offset).map((route) => route.key),\n ...state.preloadedRoutes.map((route) => route.key),\n];\n\nconst neededKeys = (state: StackState, closing: StackDescriptorMap, offset: number): string[] => [\n ...mountedKeys(state, offset),\n ...Object.keys(closing),\n];\n\nconst hasSameMembers = (left: readonly string[], right: readonly string[]): boolean =>\n left.length === right.length && left.every((key) => right.includes(key));\n\nconst appendOrder = (previous: readonly string[], needed: readonly string[]): string[] => [\n ...previous.filter((key) => needed.includes(key)),\n ...needed.filter((key) => !previous.includes(key)),\n];\n\nconst withoutKeys = (map: StackDescriptorMap, keys: readonly string[]): StackDescriptorMap =>\n Object.fromEntries(Object.entries(map).filter(([key]) => !keys.includes(key)));\n\nconst nextClosing = (tracking: PageTracking, state: StackState, offset: number): StackDescriptorMap => {\n const mounted = mountedKeys(state, offset);\n const kept = withoutKeys(tracking.closing, mounted);\n const { focusedKey } = tracking;\n\n if (focusedKey === undefined || mounted.includes(focusedKey)) {\n return kept;\n }\n\n const descriptor = tracking.descriptors[focusedKey];\n\n return descriptor === undefined ? kept : { ...kept, [focusedKey]: descriptor };\n};\n\nconst advance = (\n tracking: PageTracking,\n state: StackState,\n descriptors: StackDescriptorMap,\n offset: number,\n): PageTracking => {\n const closing = nextClosing(tracking, state, offset);\n\n return {\n order: appendOrder(tracking.order, neededKeys(state, closing, offset)),\n focusedKey: getFocusedKey(state, offset),\n descriptors,\n closing,\n };\n};\n\nconst initialTracking = (state: StackState, descriptors: StackDescriptorMap, offset: number): PageTracking => ({\n order: neededKeys(state, {}, offset),\n focusedKey: getFocusedKey(state, offset),\n descriptors,\n closing: {},\n});\n\nconst resolvePage = (\n key: string,\n sources: { state: StackState; descriptors: StackDescriptorMap; closing: StackDescriptorMap },\n describe: Describe,\n): StackDescriptor | undefined => {\n const preloaded = sources.state.preloadedRoutes.find((route) => route.key === key);\n\n if (preloaded !== undefined) {\n return describe(preloaded, true);\n }\n\n return sources.descriptors[key] ?? sources.closing[key];\n};\n\nconst useStackPages = (\n state: StackState,\n descriptors: StackDescriptorMap,\n describe: Describe,\n offset: number,\n): StackPages => {\n const [tracking, setTracking] = useState<PageTracking>(() => initialTracking(state, descriptors, offset));\n\n if (!hasSameMembers(tracking.order, neededKeys(state, tracking.closing, offset)) ||\n tracking.focusedKey !== getFocusedKey(state, offset) ||\n tracking.descriptors !== descriptors) {\n setTracking(advance(tracking, state, descriptors, offset));\n }\n\n const release = useCallback((key: string) => {\n setTracking((current) => (current.closing[key] === undefined\n ? current\n : {\n ...current,\n order: current.order.filter((entry) => entry !== key),\n closing: withoutKeys(current.closing, [key]),\n }));\n }, []);\n\n const sources = { state, descriptors, closing: tracking.closing };\n\n const pages = tracking.order\n .map((key) => resolvePage(key, sources, describe))\n .filter((page) => page !== undefined);\n\n return { pages, release };\n};\n\nexport { type Describe, useStackPages };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stack-view.d.ts","sourceRoot":"","sources":["../../src/stack/stack-view.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,OAAO,CAAC;AAGlD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAER,kBAAkB,EAClB,qBAAqB,EAErB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"stack-view.d.ts","sourceRoot":"","sources":["../../src/stack/stack-view.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,OAAO,CAAC;AAGlD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAER,kBAAkB,EAClB,qBAAqB,EAErB,sBAAsB,EACzB,MAAM,YAAY,CAAC;AAOpB,KAAK,cAAc,GAAG,qBAAqB,GAAG;IAC1C,KAAK,EAAE,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAC3C,UAAU,EAAE,sBAAsB,CAAC;IACnC,WAAW,EAAE,kBAAkB,CAAC;IAChC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AA0IF,QAAA,MAAM,SAAS,GAAI,OAAO,cAAc,KAAG,SAqB1C,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
package/dist/stack/stack-view.js
CHANGED
|
@@ -16,15 +16,6 @@ const useLatest = (value) => {
|
|
|
16
16
|
}, [value]);
|
|
17
17
|
return ref;
|
|
18
18
|
};
|
|
19
|
-
const useTrackedOptions = (descriptors) => {
|
|
20
|
-
const optionsRef = useRef({});
|
|
21
|
-
useEffect(() => {
|
|
22
|
-
for (const [key, descriptor] of Object.entries(descriptors)) {
|
|
23
|
-
optionsRef.current[key] = descriptor.options;
|
|
24
|
-
}
|
|
25
|
-
}, [descriptors]);
|
|
26
|
-
return optionsRef;
|
|
27
|
-
};
|
|
28
19
|
const useStackSync = (viewRef, state, options, offset) => {
|
|
29
20
|
const isInitialRef = useRef(true);
|
|
30
21
|
useEffect(() => {
|
|
@@ -91,8 +82,8 @@ const StackPage = ({ descriptor, previous, navigation, onHidden }) => {
|
|
|
91
82
|
const StackView = (props) => {
|
|
92
83
|
const { state, navigation, descriptors, describe, popOnEscape, offset = 0 } = props;
|
|
93
84
|
const viewRef = useRef(null);
|
|
94
|
-
const options = useTrackedOptions(descriptors);
|
|
95
85
|
const { pages, release } = useStackPages(state, descriptors, describe, offset);
|
|
86
|
+
const options = useLatest(Object.fromEntries(pages.map((page) => [page.route.key, page.options])));
|
|
96
87
|
const onPopped = usePoppedHandler(viewRef, navigation, options, offset);
|
|
97
88
|
useStackSync(viewRef, state, options, offset);
|
|
98
89
|
return (_jsx(AdwNavigationView, { ref: viewRef, popOnEscape: popOnEscape ?? true, onPopped: onPopped, children: pages.map((descriptor) => (_jsx(StackPage, { descriptor: descriptor, previous: previousDescriptor(state, descriptors, descriptor.route.key, offset), navigation: navigation, onHidden: release }, descriptor.route.key))) }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stack-view.js","sourceRoot":"","sources":["../../src/stack/stack-view.tsx"],"names":[],"mappings":"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","sourcesContent":["import type * as Adw from \"@gtkx/gi/adw\";\nimport type { ParamListBase, StackNavigationState } from \"@react-navigation/core\";\nimport type { ReactNode, RefObject } from \"react\";\nimport { AdwNavigationPage, AdwNavigationView, AdwToolbarView } from \"@gtkx/jsx/adw\";\nimport { useCallback, useEffect, useRef } from \"react\";\nimport type { Describe } from \"./stack-pages.js\";\nimport type { OptionsByKey } from \"./sync-navigation-stack.js\";\nimport type {\n StackDescriptor,\n StackDescriptorMap,\n StackNavigationConfig,\n StackNavigationEventMap,\n StackNavigationHelpers,\n StackNavigationOptions,\n} from \"./types.js\";\nimport { HeaderBar } from \"../shared/header-bar.js\";\nimport { useStackPages } from \"./stack-pages.js\";\nimport { reconcilePoppedStack, syncNavigationStack } from \"./sync-navigation-stack.js\";\n\ntype ViewRef = RefObject<Adw.NavigationView | null>;\ntype MutableOptions = Record<string, StackNavigationOptions>;\n\ntype StackViewProps = StackNavigationConfig & {\n state: StackNavigationState<ParamListBase>;\n navigation: StackNavigationHelpers;\n descriptors: StackDescriptorMap;\n describe: Describe;\n offset?: number;\n};\n\ntype StackPageProps = {\n descriptor: StackDescriptor;\n previous?: StackDescriptor;\n navigation: StackNavigationHelpers;\n onHidden: (key: string) => void;\n};\n\ntype TransitionEvent = keyof StackNavigationEventMap;\n\nconst previousDescriptor = (\n state: StackNavigationState<ParamListBase>,\n descriptors: StackDescriptorMap,\n key: string,\n offset: number,\n): StackDescriptor | undefined => {\n const index = state.routes.findIndex((route) => route.key === key);\n const previousKey = index > offset ? state.routes[index - 1]?.key : undefined;\n\n return previousKey === undefined ? undefined : descriptors[previousKey];\n};\n\nconst useLatest = <T,>(value: T): RefObject<T> => {\n const ref = useRef(value);\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref;\n};\n\nconst useTrackedOptions = (descriptors: StackDescriptorMap): RefObject<MutableOptions> => {\n const optionsRef = useRef<MutableOptions>({});\n\n useEffect(() => {\n for (const [key, descriptor] of Object.entries(descriptors)) {\n optionsRef.current[key] = descriptor.options;\n }\n }, [descriptors]);\n\n return optionsRef;\n};\n\nconst useStackSync = (\n viewRef: ViewRef,\n state: StackNavigationState<ParamListBase>,\n options: RefObject<OptionsByKey>,\n offset: number,\n): void => {\n const isInitialRef = useRef(true);\n\n useEffect(() => {\n const view = viewRef.current;\n\n if (view === null) {\n return;\n }\n\n const desired = state.routes.slice(offset).map((route) => route.key);\n syncNavigationStack(view, desired, options.current, isInitialRef.current);\n isInitialRef.current = false;\n }, [viewRef, state, options, offset]);\n};\n\nconst usePoppedHandler = (\n viewRef: ViewRef,\n navigation: StackNavigationHelpers,\n options: RefObject<OptionsByKey>,\n offset: number,\n): (() => void) => {\n const navigationRef = useLatest(navigation);\n const isScheduledRef = useRef(false);\n\n return useCallback(() => {\n if (isScheduledRef.current) {\n return;\n }\n\n isScheduledRef.current = true;\n\n queueMicrotask(() => {\n isScheduledRef.current = false;\n const view = viewRef.current;\n\n if (view !== null) {\n reconcilePoppedStack(view, navigationRef.current, options.current, offset);\n }\n });\n }, [viewRef, navigationRef, options, offset]);\n};\n\nconst StackPageContent = ({ descriptor, previous }: Omit<StackPageProps, \"navigation\" | \"onHidden\">): ReactNode => {\n const { route, options, navigation } = descriptor;\n\n if (options.headerShown === false) {\n return descriptor.render();\n }\n\n const back = previous === undefined ? undefined : { title: previous.options.title ?? previous.route.name };\n\n const topBar = options.header === undefined\n ? <HeaderBar options={options} showBackButton={options.headerBackVisible ?? true} />\n : <>{options.header({ route, navigation, options, back })}</>;\n\n return <AdwToolbarView topBar={topBar}>{descriptor.render()}</AdwToolbarView>;\n};\n\nconst StackPage = ({ descriptor, previous, navigation, onHidden }: StackPageProps): ReactNode => {\n const { route, options } = descriptor;\n const pageRef = useRef<Adw.NavigationPage | null>(null);\n\n const emit = (type: TransitionEvent, isClosing: boolean): void => {\n navigation.emit({ type, data: { closing: isClosing }, target: route.key });\n };\n\n useEffect(() => {\n const page = pageRef.current;\n\n if (page !== null && !page.getMapped()) {\n onHidden(route.key);\n }\n });\n\n return (\n <AdwNavigationPage\n ref={pageRef}\n tag={route.key}\n title={options.title ?? route.name}\n canPop={options.canPop ?? true}\n onShowing={() => {\n emit(\"transitionStart\", false);\n }}\n onHiding={() => {\n emit(\"transitionStart\", true);\n }}\n onShown={() => {\n emit(\"transitionEnd\", false);\n }}\n onHidden={() => {\n emit(\"transitionEnd\", true);\n onHidden(route.key);\n }}\n >\n <StackPageContent descriptor={descriptor} previous={previous} />\n </AdwNavigationPage>\n );\n};\n\nconst StackView = (props: StackViewProps): ReactNode => {\n const { state, navigation, descriptors, describe, popOnEscape, offset = 0 } = props;\n const viewRef = useRef<Adw.NavigationView | null>(null);\n const options = useTrackedOptions(descriptors);\n const { pages, release } = useStackPages(state, descriptors, describe, offset);\n const onPopped = usePoppedHandler(viewRef, navigation, options, offset);\n useStackSync(viewRef, state, options, offset);\n\n return (\n <AdwNavigationView ref={viewRef} popOnEscape={popOnEscape ?? true} onPopped={onPopped}>\n {pages.map((descriptor) => (\n <StackPage\n key={descriptor.route.key}\n descriptor={descriptor}\n previous={previousDescriptor(state, descriptors, descriptor.route.key, offset)}\n navigation={navigation}\n onHidden={release}\n />\n ))}\n </AdwNavigationView>\n );\n};\n\nexport { StackView };\n"]}
|
|
1
|
+
{"version":3,"file":"stack-view.js","sourceRoot":"","sources":["../../src/stack/stack-view.tsx"],"names":[],"mappings":"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","sourcesContent":["import type * as Adw from \"@gtkx/gi/adw\";\nimport type { ParamListBase, StackNavigationState } from \"@react-navigation/core\";\nimport type { ReactNode, RefObject } from \"react\";\nimport { AdwNavigationPage, AdwNavigationView, AdwToolbarView } from \"@gtkx/jsx/adw\";\nimport { useCallback, useEffect, useRef } from \"react\";\nimport type { Describe } from \"./stack-pages.js\";\nimport type { OptionsByKey } from \"./sync-navigation-stack.js\";\nimport type {\n StackDescriptor,\n StackDescriptorMap,\n StackNavigationConfig,\n StackNavigationEventMap,\n StackNavigationHelpers,\n} from \"./types.js\";\nimport { HeaderBar } from \"../shared/header-bar.js\";\nimport { useStackPages } from \"./stack-pages.js\";\nimport { reconcilePoppedStack, syncNavigationStack } from \"./sync-navigation-stack.js\";\n\ntype ViewRef = RefObject<Adw.NavigationView | null>;\n\ntype StackViewProps = StackNavigationConfig & {\n state: StackNavigationState<ParamListBase>;\n navigation: StackNavigationHelpers;\n descriptors: StackDescriptorMap;\n describe: Describe;\n offset?: number;\n};\n\ntype StackPageProps = {\n descriptor: StackDescriptor;\n previous?: StackDescriptor;\n navigation: StackNavigationHelpers;\n onHidden: (key: string) => void;\n};\n\ntype TransitionEvent = keyof StackNavigationEventMap;\n\nconst previousDescriptor = (\n state: StackNavigationState<ParamListBase>,\n descriptors: StackDescriptorMap,\n key: string,\n offset: number,\n): StackDescriptor | undefined => {\n const index = state.routes.findIndex((route) => route.key === key);\n const previousKey = index > offset ? state.routes[index - 1]?.key : undefined;\n\n return previousKey === undefined ? undefined : descriptors[previousKey];\n};\n\nconst useLatest = <T,>(value: T): RefObject<T> => {\n const ref = useRef(value);\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref;\n};\n\nconst useStackSync = (\n viewRef: ViewRef,\n state: StackNavigationState<ParamListBase>,\n options: RefObject<OptionsByKey>,\n offset: number,\n): void => {\n const isInitialRef = useRef(true);\n\n useEffect(() => {\n const view = viewRef.current;\n\n if (view === null) {\n return;\n }\n\n const desired = state.routes.slice(offset).map((route) => route.key);\n syncNavigationStack(view, desired, options.current, isInitialRef.current);\n isInitialRef.current = false;\n }, [viewRef, state, options, offset]);\n};\n\nconst usePoppedHandler = (\n viewRef: ViewRef,\n navigation: StackNavigationHelpers,\n options: RefObject<OptionsByKey>,\n offset: number,\n): (() => void) => {\n const navigationRef = useLatest(navigation);\n const isScheduledRef = useRef(false);\n\n return useCallback(() => {\n if (isScheduledRef.current) {\n return;\n }\n\n isScheduledRef.current = true;\n\n queueMicrotask(() => {\n isScheduledRef.current = false;\n const view = viewRef.current;\n\n if (view !== null) {\n reconcilePoppedStack(view, navigationRef.current, options.current, offset);\n }\n });\n }, [viewRef, navigationRef, options, offset]);\n};\n\nconst StackPageContent = ({ descriptor, previous }: Omit<StackPageProps, \"navigation\" | \"onHidden\">): ReactNode => {\n const { route, options, navigation } = descriptor;\n\n if (options.headerShown === false) {\n return descriptor.render();\n }\n\n const back = previous === undefined ? undefined : { title: previous.options.title ?? previous.route.name };\n\n const topBar = options.header === undefined\n ? <HeaderBar options={options} showBackButton={options.headerBackVisible ?? true} />\n : <>{options.header({ route, navigation, options, back })}</>;\n\n return <AdwToolbarView topBar={topBar}>{descriptor.render()}</AdwToolbarView>;\n};\n\nconst StackPage = ({ descriptor, previous, navigation, onHidden }: StackPageProps): ReactNode => {\n const { route, options } = descriptor;\n const pageRef = useRef<Adw.NavigationPage | null>(null);\n\n const emit = (type: TransitionEvent, isClosing: boolean): void => {\n navigation.emit({ type, data: { closing: isClosing }, target: route.key });\n };\n\n useEffect(() => {\n const page = pageRef.current;\n\n if (page !== null && !page.getMapped()) {\n onHidden(route.key);\n }\n });\n\n return (\n <AdwNavigationPage\n ref={pageRef}\n tag={route.key}\n title={options.title ?? route.name}\n canPop={options.canPop ?? true}\n onShowing={() => {\n emit(\"transitionStart\", false);\n }}\n onHiding={() => {\n emit(\"transitionStart\", true);\n }}\n onShown={() => {\n emit(\"transitionEnd\", false);\n }}\n onHidden={() => {\n emit(\"transitionEnd\", true);\n onHidden(route.key);\n }}\n >\n <StackPageContent descriptor={descriptor} previous={previous} />\n </AdwNavigationPage>\n );\n};\n\nconst StackView = (props: StackViewProps): ReactNode => {\n const { state, navigation, descriptors, describe, popOnEscape, offset = 0 } = props;\n const viewRef = useRef<Adw.NavigationView | null>(null);\n const { pages, release } = useStackPages(state, descriptors, describe, offset);\n const options = useLatest<OptionsByKey>(Object.fromEntries(pages.map((page) => [page.route.key, page.options])));\n const onPopped = usePoppedHandler(viewRef, navigation, options, offset);\n useStackSync(viewRef, state, options, offset);\n\n return (\n <AdwNavigationView ref={viewRef} popOnEscape={popOnEscape ?? true} onPopped={onPopped}>\n {pages.map((descriptor) => (\n <StackPage\n key={descriptor.route.key}\n descriptor={descriptor}\n previous={previousDescriptor(state, descriptors, descriptor.route.key, offset)}\n navigation={navigation}\n onHidden={release}\n />\n ))}\n </AdwNavigationView>\n );\n};\n\nexport { StackView };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-tab-navigator.d.ts","sourceRoot":"","sources":["../../src/tabs/create-tab-navigator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,mBAAmB,EAEnB,kBAAkB,EAElB,cAAc,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGpH,8EAA8E;AAC9E,KAAK,UAAU,CACX,SAAS,SAAS,aAAa,GAAG,aAAa,EAC/C,WAAW,SAAS,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,IAC3D;IACA,oCAAoC;IACpC,SAAS,EAAE,SAAS,CAAC;IACrB,6BAA6B;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,oCAAoC;IACpC,KAAK,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACrC,0BAA0B;IAC1B,aAAa,EAAE,oBAAoB,CAAC;IACpC,kCAAkC;IAClC,QAAQ,EAAE,qBAAqB,CAAC;IAChC,mCAAmC;IACnC,cAAc,EAAE;SACX,SAAS,IAAI,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC;KACvF,CAAC;IACF,+BAA+B;IAC/B,SAAS,EAAE,OAAO,YAAY,CAAC;CAClC,CAAC;AAEF,mFAAmF;AACnF,QAAA,MAAM,eAAe,EAAE,mBAAmB,CAAC,UAAU,CAAqC,CAAC;AAE3F,8GAA8G;AAC9G,iBAAS,YAAY,CAAC,EAAE,cAAc,EAAE,GAAG,OAAO,EAAE,EAAE,iBAAiB,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"create-tab-navigator.d.ts","sourceRoot":"","sources":["../../src/tabs/create-tab-navigator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,mBAAmB,EAEnB,kBAAkB,EAElB,cAAc,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGpH,8EAA8E;AAC9E,KAAK,UAAU,CACX,SAAS,SAAS,aAAa,GAAG,aAAa,EAC/C,WAAW,SAAS,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,IAC3D;IACA,oCAAoC;IACpC,SAAS,EAAE,SAAS,CAAC;IACrB,6BAA6B;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,oCAAoC;IACpC,KAAK,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACrC,0BAA0B;IAC1B,aAAa,EAAE,oBAAoB,CAAC;IACpC,kCAAkC;IAClC,QAAQ,EAAE,qBAAqB,CAAC;IAChC,mCAAmC;IACnC,cAAc,EAAE;SACX,SAAS,IAAI,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC;KACvF,CAAC;IACF,+BAA+B;IAC/B,SAAS,EAAE,OAAO,YAAY,CAAC;CAClC,CAAC;AAEF,mFAAmF;AACnF,QAAA,MAAM,eAAe,EAAE,mBAAmB,CAAC,UAAU,CAAqC,CAAC;AAE3F,8GAA8G;AAC9G,iBAAS,YAAY,CAAC,EAAE,cAAc,EAAE,GAAG,OAAO,EAAE,EAAE,iBAAiB,GAAG,SAAS,CAYlF;AAED,qFAAqF;AACrF,iBAAS,kBAAkB,CACvB,KAAK,CAAC,SAAS,SAAS,aAAa,EACrC,KAAK,CAAC,WAAW,SAAS,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,EACjE,KAAK,CAAC,OAAO,SAAS,oBAAoB,GAAG,UAAU,CAAC,SAAS,EAAE,WAAW,CAAC,EAC/E,KAAK,CAAC,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,EACpE,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAElD;AAED,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,CAAC"}
|
|
@@ -5,8 +5,8 @@ import { TabView } from "./tab-view.js";
|
|
|
5
5
|
const createTabScreen = createScreenFactory();
|
|
6
6
|
/** Renders the screens of a {@link createTabNavigator} as pages of an `AdwViewStack` with a view switcher. */
|
|
7
7
|
function TabNavigator({ tabBarPosition, ...options }) {
|
|
8
|
-
const { state, descriptors, navigation,
|
|
9
|
-
return (_jsx(
|
|
8
|
+
const { state, descriptors, navigation, render } = useNavigationBuilder(TabRouter, options);
|
|
9
|
+
return render(_jsx(TabView, { tabBarPosition: tabBarPosition, state: state, navigation: navigation, descriptors: descriptors }));
|
|
10
10
|
}
|
|
11
11
|
/** Creates a tab navigator rendered with `AdwViewStack` and an `AdwViewSwitcher`. */
|
|
12
12
|
function createTabNavigator(config) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-tab-navigator.js","sourceRoot":"","sources":["../../src/tabs/create-tab-navigator.tsx"],"names":[],"mappings":";AAWA,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEtH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAyBxC,mFAAmF;AACnF,MAAM,eAAe,GAAoC,mBAAmB,EAAc,CAAC;AAE3F,8GAA8G;AAC9G,SAAS,YAAY,CAAC,EAAE,cAAc,EAAE,GAAG,OAAO,EAAqB;IACnE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"create-tab-navigator.js","sourceRoot":"","sources":["../../src/tabs/create-tab-navigator.tsx"],"names":[],"mappings":";AAWA,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEtH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAyBxC,mFAAmF;AACnF,MAAM,eAAe,GAAoC,mBAAmB,EAAc,CAAC;AAE3F,8GAA8G;AAC9G,SAAS,YAAY,CAAC,EAAE,cAAc,EAAE,GAAG,OAAO,EAAqB;IACnE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,oBAAoB,CAMrE,SAAS,EAAE,OAAO,CAAC,CAAC;IAEtB,OAAO,MAAM,CACT,KAAC,OAAO,IAAC,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,GAAI,CAC9G,CAAC;AACN,CAAC;AAED,qFAAqF;AACrF,SAAS,kBAAkB,CAKzB,MAAe;IACb,OAAO,sBAAsB,CAAC,YAAY,CAAC,CAAC,MAAM,CAAoC,CAAC;AAC3F,CAAC;AAED,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAmB,CAAC","sourcesContent":["import type {\n NavigatorTypeBagBase,\n ParamListBase,\n StaticConfig,\n StaticScreenFactory,\n TabActionHelpers,\n TabNavigationState,\n TabRouterOptions,\n TypedNavigator,\n} from \"@react-navigation/core\";\nimport type { ReactNode } from \"react\";\nimport { createNavigatorFactory, createScreenFactory, TabRouter, useNavigationBuilder } from \"@react-navigation/core\";\nimport type { TabNavigationEventMap, TabNavigationOptions, TabNavigationProp, TabNavigatorProps } from \"./types.js\";\nimport { TabView } from \"./tab-view.js\";\n\n/** Type bag describing the tab navigator to React Navigation's typed APIs. */\ntype TabTypeBag<\n ParamList extends ParamListBase = ParamListBase,\n NavigatorID extends string | undefined = string | undefined,\n> = {\n /** Route names and their params. */\n ParamList: ParamList;\n /** Optional navigator id. */\n NavigatorID: NavigatorID;\n /** Shape of the navigator state. */\n State: TabNavigationState<ParamList>;\n /** Per-screen options. */\n ScreenOptions: TabNavigationOptions;\n /** Events the navigator emits. */\n EventMap: TabNavigationEventMap;\n /** Navigation object per route. */\n NavigationList: {\n [RouteName in keyof ParamList]: TabNavigationProp<ParamList, RouteName, NavigatorID>;\n };\n /** The navigator component. */\n Navigator: typeof TabNavigator;\n};\n\n/** Declares a typed screen of a tab navigator for the static configuration API. */\nconst createTabScreen: StaticScreenFactory<TabTypeBag> = createScreenFactory<TabTypeBag>();\n\n/** Renders the screens of a {@link createTabNavigator} as pages of an `AdwViewStack` with a view switcher. */\nfunction TabNavigator({ tabBarPosition, ...options }: TabNavigatorProps): ReactNode {\n const { state, descriptors, navigation, render } = useNavigationBuilder<\n TabNavigationState<ParamListBase>,\n TabRouterOptions,\n TabActionHelpers<ParamListBase>,\n TabNavigationOptions,\n TabNavigationEventMap\n >(TabRouter, options);\n\n return render(\n <TabView tabBarPosition={tabBarPosition} state={state} navigation={navigation} descriptors={descriptors} />,\n );\n}\n\n/** Creates a tab navigator rendered with `AdwViewStack` and an `AdwViewSwitcher`. */\nfunction createTabNavigator<\n const ParamList extends ParamListBase,\n const NavigatorID extends string | undefined = string | undefined,\n const TypeBag extends NavigatorTypeBagBase = TabTypeBag<ParamList, NavigatorID>,\n const Config extends StaticConfig<TypeBag> | undefined = undefined,\n>(config?: Config): TypedNavigator<TypeBag, Config> {\n return createNavigatorFactory(TabNavigator)(config) as TypedNavigator<TypeBag, Config>;\n}\n\nexport { createTabNavigator, createTabScreen, TabNavigator, type TabTypeBag };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tab-view.d.ts","sourceRoot":"","sources":["../../src/tabs/tab-view.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,KAAK,EAAgB,SAAS,EAAE,MAAM,OAAO,CAAC;AAKrD,OAAO,KAAK,EAAiB,gBAAgB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"tab-view.d.ts","sourceRoot":"","sources":["../../src/tabs/tab-view.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,KAAK,EAAgB,SAAS,EAAE,MAAM,OAAO,CAAC;AAKrD,OAAO,KAAK,EAAiB,gBAAgB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAM7G,KAAK,YAAY,GAAG,mBAAmB,GAAG;IACtC,KAAK,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC;IACzC,UAAU,EAAE,oBAAoB,CAAC;IACjC,WAAW,EAAE,gBAAgB,CAAC;CACjC,CAAC;AAqEF,QAAA,MAAM,OAAO,GAAI,oDAA4D,YAAY,KAAG,SAoC3F,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
package/dist/tabs/tab-view.js
CHANGED
|
@@ -6,7 +6,6 @@ import { useCallback, useState } from "react";
|
|
|
6
6
|
import { HeaderBar } from "../shared/header-bar.js";
|
|
7
7
|
import { getFocusedRoute, requireDescriptor } from "../shared/routes.js";
|
|
8
8
|
import { ScenePage } from "../shared/scene-page.js";
|
|
9
|
-
import { useLoadedRoutes } from "../shared/use-loaded-routes.js";
|
|
10
9
|
import { usePopToTopOnBlur } from "../shared/use-pop-to-top-on-blur.js";
|
|
11
10
|
const useTabSelection = (navigation) => useCallback((name) => {
|
|
12
11
|
const current = navigation.getState();
|
|
@@ -39,14 +38,13 @@ const TabView = ({ state, navigation, descriptors, tabBarPosition = "top" }) =>
|
|
|
39
38
|
const [stack, setStack] = useState(null);
|
|
40
39
|
const focused = getFocusedRoute(state);
|
|
41
40
|
const descriptor = requireDescriptor(descriptors, focused.key);
|
|
42
|
-
const loaded = useLoadedRoutes(focused.key, state.preloadedRouteKeys);
|
|
43
41
|
const onVisibleChildChanged = useTabSelection(navigation);
|
|
44
42
|
const viewSwitcher = stack === null
|
|
45
43
|
? undefined
|
|
46
44
|
: _jsx(AdwViewSwitcher, { stack: stack, policy: Adw.ViewSwitcherPolicy.WIDE });
|
|
47
45
|
const hasSwitcherBar = tabBarPosition === "bottom" && stack !== null;
|
|
48
46
|
usePopToTopOnBlur(state, descriptors, navigation);
|
|
49
|
-
return (_jsx(AdwToolbarView, { topBar: (_jsx(TabHeader, { descriptor: descriptor, viewSwitcher: tabBarPosition === "top" ? viewSwitcher : undefined })), bottomBar: hasSwitcherBar ? _jsx(AdwViewSwitcherBar, { stack: stack, reveal: true }) : undefined, children: _jsx(AdwViewStack, { ref: setStack, visibleChildName: focused.key, enableTransitions: descriptor.options.animation === "fade", onNotifyVisibleChildName: onVisibleChildChanged, children: state.routes.map((route) => (_jsx(TabPage, { descriptor: requireDescriptor(descriptors, route.key), isLoaded:
|
|
47
|
+
return (_jsx(AdwToolbarView, { topBar: (_jsx(TabHeader, { descriptor: descriptor, viewSwitcher: tabBarPosition === "top" ? viewSwitcher : undefined })), bottomBar: hasSwitcherBar ? _jsx(AdwViewSwitcherBar, { stack: stack, reveal: true }) : undefined, children: _jsx(AdwViewStack, { ref: setStack, visibleChildName: focused.key, enableTransitions: descriptor.options.animation === "fade", onNotifyVisibleChildName: onVisibleChildChanged, children: state.routes.map((route) => (_jsx(TabPage, { descriptor: requireDescriptor(descriptors, route.key), isLoaded: route.key === focused.key || state.preloadedRouteKeys.includes(route.key) }, route.key))) }) }));
|
|
50
48
|
};
|
|
51
49
|
export { TabView };
|
|
52
50
|
//# sourceMappingURL=tab-view.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tab-view.js","sourceRoot":"","sources":["../../src/tabs/tab-view.tsx"],"names":[],"mappings":";AAEA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAClH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"tab-view.js","sourceRoot":"","sources":["../../src/tabs/tab-view.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { ParamListBase, TabNavigationState } from \"@react-navigation/core\";\nimport type { ReactElement, ReactNode } from \"react\";\nimport * as Adw from \"@gtkx/gi/adw\";\nimport { AdwToolbarView, AdwViewStack, AdwViewSwitcher, AdwViewSwitcherBar, AdwWindowTitle } from \"@gtkx/jsx/adw\";\nimport { CommonActions } from \"@react-navigation/core\";\nimport { useCallback, useState } from \"react\";\nimport type { TabDescriptor, TabDescriptorMap, TabNavigationConfig, TabNavigationHelpers } from \"./types.js\";\nimport { HeaderBar } from \"../shared/header-bar.js\";\nimport { getFocusedRoute, requireDescriptor } from \"../shared/routes.js\";\nimport { ScenePage } from \"../shared/scene-page.js\";\nimport { usePopToTopOnBlur } from \"../shared/use-pop-to-top-on-blur.js\";\n\ntype TabViewProps = TabNavigationConfig & {\n state: TabNavigationState<ParamListBase>;\n navigation: TabNavigationHelpers;\n descriptors: TabDescriptorMap;\n};\n\ntype TabHeaderProps = {\n descriptor: TabDescriptor;\n viewSwitcher: ReactElement | undefined;\n};\n\ntype TabPageProps = {\n descriptor: TabDescriptor;\n isLoaded: boolean;\n};\n\nconst useTabSelection = (navigation: TabNavigationHelpers): ((name: string | null) => void) =>\n useCallback((name: string | null) => {\n const current = navigation.getState();\n const focusedKey = getFocusedRoute(current).key;\n const route = current.routes.find((candidate) => candidate.key === name);\n\n if (route === undefined || route.key === focusedKey) {\n return;\n }\n\n const event = navigation.emit({ type: \"tabPress\", target: route.key, canPreventDefault: true });\n\n if (!event.defaultPrevented) {\n navigation.dispatch({ ...CommonActions.navigate(route.name, route.params), target: current.key });\n }\n }, [navigation]);\n\nconst defaultTabHeader = ({ descriptor, viewSwitcher }: TabHeaderProps): ReactElement => (\n <HeaderBar\n options={descriptor.options}\n titleWidget={viewSwitcher ?? <AdwWindowTitle title={descriptor.options.title ?? descriptor.route.name} />}\n />\n);\n\nconst TabHeader = (props: TabHeaderProps): ReactNode => {\n const { descriptor, viewSwitcher } = props;\n const { route, options, navigation } = descriptor;\n\n if (options.headerShown === false) {\n return <>{viewSwitcher}</>;\n }\n\n return (\n <>\n {options.header === undefined\n ? defaultTabHeader(props)\n : options.header({ route, navigation, options, viewSwitcher })}\n </>\n );\n};\n\nconst TabPage = ({ descriptor, isLoaded }: TabPageProps): ReactNode => {\n const { route, options } = descriptor;\n\n return (\n <ScenePage\n name={route.key}\n title={options.tabBarLabel ?? options.title ?? route.name}\n iconName={options.tabBarIcon}\n badgeNumber={options.tabBarBadge}\n needsAttention={options.needsAttention}\n isLoaded={isLoaded || options.lazy === false}\n render={() => descriptor.render()}\n />\n );\n};\n\nconst TabView = ({ state, navigation, descriptors, tabBarPosition = \"top\" }: TabViewProps): ReactNode => {\n const [stack, setStack] = useState<Adw.ViewStack | null>(null);\n const focused = getFocusedRoute(state);\n const descriptor = requireDescriptor(descriptors, focused.key);\n const onVisibleChildChanged = useTabSelection(navigation);\n\n const viewSwitcher = stack === null\n ? undefined\n : <AdwViewSwitcher stack={stack} policy={Adw.ViewSwitcherPolicy.WIDE} />;\n\n const hasSwitcherBar = tabBarPosition === \"bottom\" && stack !== null;\n usePopToTopOnBlur(state, descriptors, navigation);\n\n return (\n <AdwToolbarView\n topBar={(\n <TabHeader descriptor={descriptor} viewSwitcher={tabBarPosition === \"top\" ? viewSwitcher : undefined} />\n )}\n bottomBar={hasSwitcherBar ? <AdwViewSwitcherBar stack={stack} reveal /> : undefined}\n >\n <AdwViewStack\n ref={setStack}\n visibleChildName={focused.key}\n enableTransitions={descriptor.options.animation === \"fade\"}\n onNotifyVisibleChildName={onVisibleChildChanged}\n >\n {state.routes.map((route) => (\n <TabPage\n key={route.key}\n descriptor={requireDescriptor(descriptors, route.key)}\n isLoaded={route.key === focused.key || state.preloadedRouteKeys.includes(route.key)}\n />\n ))}\n </AdwViewStack>\n </AdwToolbarView>\n );\n};\n\nexport { TabView };\n"]}
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gtkx/navigation",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
4
|
-
"description": "React Navigation for GTKX
|
|
3
|
+
"version": "2.0.0-beta.11",
|
|
4
|
+
"description": "React Navigation navigators for GTKX.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"gtkx",
|
|
7
7
|
"gtk",
|
|
8
8
|
"gtk4",
|
|
9
9
|
"adwaita",
|
|
10
|
+
"gnome",
|
|
10
11
|
"react",
|
|
11
12
|
"react-navigation",
|
|
12
13
|
"navigation",
|
|
@@ -53,18 +54,20 @@
|
|
|
53
54
|
"node": ">=26.7.0"
|
|
54
55
|
},
|
|
55
56
|
"dependencies": {
|
|
56
|
-
"@gtkx/react": "2.0.0-beta.
|
|
57
|
-
"@react-navigation/core": "^7.
|
|
57
|
+
"@gtkx/react": "2.0.0-beta.11",
|
|
58
|
+
"@react-navigation/core": "^7.22.1",
|
|
58
59
|
"@react-navigation/routers": "^7.6.4"
|
|
59
60
|
},
|
|
60
61
|
"peerDependencies": {
|
|
61
|
-
"react": "^19.
|
|
62
|
+
"@types/react": "^19.3",
|
|
63
|
+
"react": "^19.3"
|
|
62
64
|
},
|
|
63
65
|
"devDependencies": {
|
|
64
|
-
"@gtkx/config": "2.0.0-beta.
|
|
65
|
-
"@gtkx/testing": "2.0.0-beta.
|
|
66
|
-
"@gtkx/vitest": "2.0.0-beta.
|
|
67
|
-
"
|
|
66
|
+
"@gtkx/config": "2.0.0-beta.11",
|
|
67
|
+
"@gtkx/testing": "2.0.0-beta.11",
|
|
68
|
+
"@gtkx/vitest": "2.0.0-beta.11",
|
|
69
|
+
"@types/react": "^19.3.0",
|
|
70
|
+
"vitest": "^5.0.1"
|
|
68
71
|
},
|
|
69
72
|
"scripts": {
|
|
70
73
|
"release": "tsx ../../scripts/release-package.ts"
|
|
@@ -82,7 +82,7 @@ function DrawerNavigator({
|
|
|
82
82
|
}: DrawerNavigatorProps): ReactNode {
|
|
83
83
|
const createRouter = useDrawerRouter(collapsed === true);
|
|
84
84
|
|
|
85
|
-
const { state, descriptors, navigation,
|
|
85
|
+
const { state, descriptors, navigation, render } = useNavigationBuilder<
|
|
86
86
|
DrawerNavigationState<ParamListBase>,
|
|
87
87
|
DrawerRouterOptions,
|
|
88
88
|
DrawerActionHelpers<ParamListBase>,
|
|
@@ -90,21 +90,19 @@ function DrawerNavigator({
|
|
|
90
90
|
DrawerNavigationEventMap
|
|
91
91
|
>(createRouter, { ...options, defaultStatus: defaultStatus ?? (collapsed === true ? "closed" : "open") });
|
|
92
92
|
|
|
93
|
-
return (
|
|
94
|
-
<
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
/>
|
|
107
|
-
</NavigationContent>
|
|
93
|
+
return render(
|
|
94
|
+
<DrawerView
|
|
95
|
+
state={state}
|
|
96
|
+
navigation={navigation}
|
|
97
|
+
descriptors={descriptors}
|
|
98
|
+
drawerContent={drawerContent}
|
|
99
|
+
collapsed={collapsed}
|
|
100
|
+
sidebarPosition={sidebarPosition}
|
|
101
|
+
pinSidebar={pinSidebar}
|
|
102
|
+
minSidebarWidth={minSidebarWidth}
|
|
103
|
+
maxSidebarWidth={maxSidebarWidth}
|
|
104
|
+
sidebarWidthFraction={sidebarWidthFraction}
|
|
105
|
+
/>,
|
|
108
106
|
);
|
|
109
107
|
}
|
|
110
108
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { NavigationState } from "@react-navigation/core";
|
|
2
2
|
import type { ReactNode } from "react";
|
|
3
3
|
import * as Gtk from "@gtkx/gi/gtk";
|
|
4
|
-
import { GtkBox, GtkImage, GtkLabel, GtkListBox } from "@gtkx/jsx/gtk";
|
|
4
|
+
import { GtkBox, GtkImage, GtkLabel, GtkListBox, GtkListBoxRow } from "@gtkx/jsx/gtk";
|
|
5
5
|
import { CommonActions, DrawerActions } from "@react-navigation/core";
|
|
6
6
|
import { useCallback, useContext } from "react";
|
|
7
7
|
import type { DrawerContentProps, DrawerDescriptor, DrawerNavigationHelpers } from "./types.js";
|
|
@@ -43,12 +43,15 @@ const useDrawerItemPress = (navigation: DrawerNavigationHelpers, isCollapsed: bo
|
|
|
43
43
|
|
|
44
44
|
const DrawerItem = ({ descriptor }: { descriptor: DrawerDescriptor }): ReactNode => {
|
|
45
45
|
const { route, options } = descriptor;
|
|
46
|
+
const label = options.drawerLabel ?? options.title ?? route.name;
|
|
46
47
|
|
|
47
48
|
return (
|
|
48
|
-
<
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
<GtkListBoxRow accessibleLabel={label}>
|
|
50
|
+
<GtkBox spacing={12}>
|
|
51
|
+
{options.drawerIcon === undefined ? null : <GtkImage iconName={options.drawerIcon} />}
|
|
52
|
+
<GtkLabel label={label} xalign={0} />
|
|
53
|
+
</GtkBox>
|
|
54
|
+
</GtkListBoxRow>
|
|
52
55
|
);
|
|
53
56
|
};
|
|
54
57
|
|
|
@@ -1,19 +1,6 @@
|
|
|
1
|
-
import type { DrawerStatus,
|
|
1
|
+
import type { DrawerNavigationState, DrawerStatus, ParamListBase } from "@react-navigation/core";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const isDrawerEntry = (entry: unknown): entry is DrawerHistoryEntry =>
|
|
6
|
-
typeof entry === "object" && entry !== null && "type" in entry && entry.type === "drawer";
|
|
7
|
-
|
|
8
|
-
const getDrawerStatus = (state: NavigationState): DrawerStatus => {
|
|
9
|
-
const history: readonly unknown[] = state.history ?? [];
|
|
10
|
-
const entry = history.findLast(isDrawerEntry);
|
|
11
|
-
|
|
12
|
-
if (entry !== undefined) {
|
|
13
|
-
return entry.status;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
return "default" in state && state.default === "open" ? "open" : "closed";
|
|
17
|
-
};
|
|
3
|
+
const getDrawerStatus = (state: DrawerNavigationState<ParamListBase>): DrawerStatus =>
|
|
4
|
+
state.history.findLast((entry) => entry.type === "drawer")?.status ?? state.default;
|
|
18
5
|
|
|
19
6
|
export { getDrawerStatus };
|
|
@@ -21,7 +21,6 @@ import type {
|
|
|
21
21
|
import { HeaderBar } from "../shared/header-bar.js";
|
|
22
22
|
import { getFocusedRoute, requireDescriptor } from "../shared/routes.js";
|
|
23
23
|
import { ScenePage } from "../shared/scene-page.js";
|
|
24
|
-
import { useLoadedRoutes } from "../shared/use-loaded-routes.js";
|
|
25
24
|
import { usePopToTopOnBlur } from "../shared/use-pop-to-top-on-blur.js";
|
|
26
25
|
import { DrawerCollapsedContext } from "./drawer-collapsed-context.js";
|
|
27
26
|
import { DrawerItemList } from "./drawer-item-list.js";
|
|
@@ -47,15 +46,12 @@ const PACK_TYPES = { start: Gtk.PackType.START, end: Gtk.PackType.END } as const
|
|
|
47
46
|
|
|
48
47
|
const useSidebarSync = (navigation: DrawerNavigationHelpers): ((isShown: boolean | null) => void) =>
|
|
49
48
|
useCallback((isShown: boolean | null) => {
|
|
50
|
-
|
|
51
|
-
const isOpen = getDrawerStatus(current) === "open";
|
|
52
|
-
|
|
53
|
-
if (isShown === null || isShown === isOpen) {
|
|
49
|
+
if (isShown === null) {
|
|
54
50
|
return;
|
|
55
51
|
}
|
|
56
52
|
|
|
57
53
|
const action = isShown ? DrawerActions.openDrawer() : DrawerActions.closeDrawer();
|
|
58
|
-
navigation.dispatch({ ...action, target:
|
|
54
|
+
navigation.dispatch({ ...action, target: navigation.getState().key });
|
|
59
55
|
}, [navigation]);
|
|
60
56
|
|
|
61
57
|
const useCloseOnNavigate = (
|
|
@@ -70,7 +66,7 @@ const useCloseOnNavigate = (
|
|
|
70
66
|
const hasChanged = previousKeyRef.current !== focusedKey;
|
|
71
67
|
previousKeyRef.current = focusedKey;
|
|
72
68
|
|
|
73
|
-
if (hasChanged && isCollapsed
|
|
69
|
+
if (hasChanged && isCollapsed) {
|
|
74
70
|
navigation.dispatch({ ...DrawerActions.closeDrawer(), target: navigation.getState().key });
|
|
75
71
|
}
|
|
76
72
|
}, [focusedKey, isCollapsed, navigation]);
|
|
@@ -132,7 +128,6 @@ const DrawerView = ({ state, navigation, descriptors, drawerContent, ...config }
|
|
|
132
128
|
const { collapsed = false, sidebarPosition = "start", pinSidebar, minSidebarWidth, maxSidebarWidth } = config;
|
|
133
129
|
const focused = getFocusedRoute(state);
|
|
134
130
|
const descriptor = requireDescriptor(descriptors, focused.key);
|
|
135
|
-
const loaded = useLoadedRoutes(focused.key, state.preloadedRouteKeys);
|
|
136
131
|
const onShowSidebarChanged = useSidebarSync(navigation);
|
|
137
132
|
const contentProps = { state, navigation, descriptors };
|
|
138
133
|
const sidebar = drawerContent === undefined ? <DrawerContent {...contentProps} /> : drawerContent(contentProps);
|
|
@@ -158,7 +153,7 @@ const DrawerView = ({ state, navigation, descriptors, drawerContent, ...config }
|
|
|
158
153
|
<DrawerPage
|
|
159
154
|
key={route.key}
|
|
160
155
|
descriptor={requireDescriptor(descriptors, route.key)}
|
|
161
|
-
isLoaded={
|
|
156
|
+
isLoaded={route.key === focused.key || state.preloadedRouteKeys.includes(route.key)}
|
|
162
157
|
/>
|
|
163
158
|
))}
|
|
164
159
|
</AdwViewStack>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ReactElement, ReactNode } from "react";
|
|
2
2
|
import { AdwBin, AdwViewStackPage } from "@gtkx/jsx/adw";
|
|
3
|
+
import { useState } from "react";
|
|
3
4
|
|
|
4
5
|
type ScenePageProps = {
|
|
5
6
|
name: string;
|
|
@@ -11,17 +12,25 @@ type ScenePageProps = {
|
|
|
11
12
|
render: () => ReactElement;
|
|
12
13
|
};
|
|
13
14
|
|
|
14
|
-
const ScenePage = ({ name, title, isLoaded, render, ...page }: ScenePageProps): ReactNode =>
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
15
|
+
const ScenePage = ({ name, title, isLoaded, render, ...page }: ScenePageProps): ReactNode => {
|
|
16
|
+
const [hasLoaded, setHasLoaded] = useState(isLoaded);
|
|
17
|
+
|
|
18
|
+
if (isLoaded && !hasLoaded) {
|
|
19
|
+
setHasLoaded(true);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
<AdwViewStackPage
|
|
24
|
+
name={name}
|
|
25
|
+
title={title}
|
|
26
|
+
iconName={page.iconName}
|
|
27
|
+
badgeNumber={page.badgeNumber}
|
|
28
|
+
needsAttention={page.needsAttention}
|
|
29
|
+
useUnderline={false}
|
|
30
|
+
>
|
|
31
|
+
<AdwBin>{hasLoaded ? render() : null}</AdwBin>
|
|
32
|
+
</AdwViewStackPage>
|
|
33
|
+
);
|
|
34
|
+
};
|
|
26
35
|
|
|
27
36
|
export { ScenePage };
|
|
@@ -56,7 +56,7 @@ function SplitViewNavigator({
|
|
|
56
56
|
popOnEscape,
|
|
57
57
|
...options
|
|
58
58
|
}: SplitViewNavigatorProps): ReactNode {
|
|
59
|
-
const { state, describe, descriptors, navigation,
|
|
59
|
+
const { state, describe, descriptors, navigation, render } = useNavigationBuilder<
|
|
60
60
|
StackNavigationState<ParamListBase>,
|
|
61
61
|
StackRouterOptions,
|
|
62
62
|
StackActionHelpers<ParamListBase>,
|
|
@@ -64,22 +64,20 @@ function SplitViewNavigator({
|
|
|
64
64
|
SplitViewNavigationEventMap
|
|
65
65
|
>(splitViewRouter, options);
|
|
66
66
|
|
|
67
|
-
return (
|
|
68
|
-
<
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
/>
|
|
82
|
-
</NavigationContent>
|
|
67
|
+
return render(
|
|
68
|
+
<SplitView
|
|
69
|
+
state={state}
|
|
70
|
+
navigation={navigation}
|
|
71
|
+
descriptors={descriptors}
|
|
72
|
+
describe={describe}
|
|
73
|
+
collapsed={collapsed}
|
|
74
|
+
contentPlaceholder={contentPlaceholder}
|
|
75
|
+
sidebarPosition={sidebarPosition}
|
|
76
|
+
minSidebarWidth={minSidebarWidth}
|
|
77
|
+
maxSidebarWidth={maxSidebarWidth}
|
|
78
|
+
sidebarWidthFraction={sidebarWidthFraction}
|
|
79
|
+
popOnEscape={popOnEscape}
|
|
80
|
+
/>,
|
|
83
81
|
);
|
|
84
82
|
}
|
|
85
83
|
|
|
@@ -46,7 +46,7 @@ const createStackScreen: StaticScreenFactory<StackTypeBag> = createScreenFactory
|
|
|
46
46
|
|
|
47
47
|
/** Renders the screens of a {@link createStackNavigator} as pages of an `AdwNavigationView`. */
|
|
48
48
|
function StackNavigator({ popOnEscape, ...options }: StackNavigatorProps): ReactNode {
|
|
49
|
-
const { state, describe, descriptors, navigation,
|
|
49
|
+
const { state, describe, descriptors, navigation, render } = useNavigationBuilder<
|
|
50
50
|
StackNavigationState<ParamListBase>,
|
|
51
51
|
StackRouterOptions,
|
|
52
52
|
StackActionHelpers<ParamListBase>,
|
|
@@ -54,16 +54,14 @@ function StackNavigator({ popOnEscape, ...options }: StackNavigatorProps): React
|
|
|
54
54
|
StackNavigationEventMap
|
|
55
55
|
>(StackRouter, options);
|
|
56
56
|
|
|
57
|
-
return (
|
|
58
|
-
<
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
/>
|
|
66
|
-
</NavigationContent>
|
|
57
|
+
return render(
|
|
58
|
+
<StackView
|
|
59
|
+
popOnEscape={popOnEscape}
|
|
60
|
+
state={state}
|
|
61
|
+
navigation={navigation}
|
|
62
|
+
descriptors={descriptors}
|
|
63
|
+
describe={describe}
|
|
64
|
+
/>,
|
|
67
65
|
);
|
|
68
66
|
}
|
|
69
67
|
|