@multiplatform.one/router 8.3.0 → 8.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/cjs/router/index.native.js +18 -6
  2. package/dist/cjs/router/index.native.js.map +1 -1
  3. package/dist/cjs/router/nativeFallback.cjs +45 -0
  4. package/dist/cjs/router/nativeFallback.native.js +53 -0
  5. package/dist/cjs/router/nativeFallback.native.js.map +1 -0
  6. package/dist/cjs/seam/DomNavigationHost.cjs +29 -2
  7. package/dist/cjs/seam/DomNavigationHost.native.js +34 -2
  8. package/dist/cjs/seam/DomNavigationHost.native.js.map +1 -1
  9. package/dist/esm/router/index.native.js +15 -3
  10. package/dist/esm/router/index.native.js.map +1 -1
  11. package/dist/esm/router/nativeFallback.mjs +19 -0
  12. package/dist/esm/router/nativeFallback.mjs.map +1 -0
  13. package/dist/esm/router/nativeFallback.native.js +24 -0
  14. package/dist/esm/router/nativeFallback.native.js.map +1 -0
  15. package/dist/esm/seam/DomNavigationHost.mjs +30 -3
  16. package/dist/esm/seam/DomNavigationHost.mjs.map +1 -1
  17. package/dist/esm/seam/DomNavigationHost.native.js +35 -3
  18. package/dist/esm/seam/DomNavigationHost.native.js.map +1 -1
  19. package/dist/jsx/router/index.native.js +18 -6
  20. package/dist/jsx/router/index.native.js.map +1 -1
  21. package/dist/jsx/router/nativeFallback.mjs +19 -0
  22. package/dist/jsx/router/nativeFallback.mjs.map +1 -0
  23. package/dist/jsx/router/nativeFallback.native.js +53 -0
  24. package/dist/jsx/router/nativeFallback.native.js.map +1 -0
  25. package/dist/jsx/seam/DomNavigationHost.mjs +30 -3
  26. package/dist/jsx/seam/DomNavigationHost.mjs.map +1 -1
  27. package/dist/jsx/seam/DomNavigationHost.native.js +34 -2
  28. package/dist/jsx/seam/DomNavigationHost.native.js.map +1 -1
  29. package/package.json +15 -4
  30. package/src/router/index.native.tsx +18 -3
  31. package/src/router/nativeFallback.spec.tsx +46 -0
  32. package/src/router/nativeFallback.tsx +19 -0
  33. package/src/seam/DomNavigationHost.routeHold.spec.tsx +78 -0
  34. package/src/seam/DomNavigationHost.tsx +34 -3
  35. package/types/router/index.native.d.ts +4 -2
  36. package/types/router/index.native.d.ts.map +1 -1
  37. package/types/router/nativeFallback.d.ts +10 -0
  38. package/types/router/nativeFallback.d.ts.map +1 -0
  39. package/types/seam/DomNavigationHost.d.ts.map +1 -1
@@ -0,0 +1,19 @@
1
+ import { useParams, usePathname, useRouter } from "./EmptyRouter.mjs";
2
+ import { Fragment, jsx } from "react/jsx-runtime";
3
+ const Link = ({
4
+ children
5
+ }) => /* @__PURE__ */jsx(Fragment, {
6
+ children
7
+ });
8
+ Link.resolveHref = href => href.toString();
9
+ const nativeFallback = {
10
+ Link,
11
+ useParams,
12
+ usePathname,
13
+ useRouter
14
+ };
15
+ function pickRouter(one) {
16
+ return one ?? nativeFallback;
17
+ }
18
+ export { nativeFallback, pickRouter };
19
+ //# sourceMappingURL=nativeFallback.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useParams","usePathname","useRouter","Fragment","jsx","Link","children","resolveHref","href","toString","nativeFallback","pickRouter","one"],"sources":["../../../src/router/nativeFallback.tsx"],"sourcesContent":[null],"mappings":"AACA,SAASA,SAAA,EAAWC,WAAA,EAAaC,SAAA,QAAiB;AASJ,SAAAC,QAAA,EAAAC,GAAA;AAA9C,MAAMC,IAAA,GAAsBA,CAAC;EAAEC;AAAS,MAAM,eAAAF,GAAA,CAAAD,QAAA;EAAGG;AAAA,CAAS;AAE1DD,IAAA,CAAKE,WAAA,GAAeC,IAAA,IAASA,IAAA,CAAKC,QAAA,CAAS;AAEpC,MAAMC,cAAA,GAA+B;EAAEL,IAAA;EAAML,SAAA;EAAWC,WAAA;EAAaC;AAAU;AAE/E,SAASS,WAAWC,GAAA,EAA6C;EACtE,OAAOA,GAAA,IAAOF,cAAA;AAChB","ignoreList":[]}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all) __defProp(target, name, {
9
+ get: all[name],
10
+ enumerable: true
11
+ });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
16
+ get: () => from[key],
17
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
18
+ });
19
+ }
20
+ return to;
21
+ };
22
+ var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
23
+ value: true
24
+ }), mod);
25
+ var nativeFallback_exports = {};
26
+ __export(nativeFallback_exports, {
27
+ nativeFallback: () => nativeFallback,
28
+ pickRouter: () => pickRouter
29
+ });
30
+ module.exports = __toCommonJS(nativeFallback_exports);
31
+ var import_jsx_runtime = require("react/jsx-runtime");
32
+ var import_EmptyRouter = require("./EmptyRouter.native.js");
33
+ var Link = function Link2(param) {
34
+ var {
35
+ children
36
+ } = param;
37
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, {
38
+ children
39
+ });
40
+ };
41
+ Link.resolveHref = function (href) {
42
+ return href.toString();
43
+ };
44
+ var nativeFallback = {
45
+ Link,
46
+ useParams: import_EmptyRouter.useParams,
47
+ usePathname: import_EmptyRouter.usePathname,
48
+ useRouter: import_EmptyRouter.useRouter
49
+ };
50
+ function pickRouter(one) {
51
+ return one !== null && one !== void 0 ? one : nativeFallback;
52
+ }
53
+ //# sourceMappingURL=nativeFallback.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable"],"sources":["../../../src/router/nativeFallback.tsx"],"sourcesContent":[null],"mappings":"AACA,YAAS;;AASqC,IAAAA,SAAA,GAAAC,MAAA,CAAAC,cAAA;AAA9C,IAAAC,gBAA+B,GAAAF,MAAS,CAAAG,wBAAM;AAE9C,IAAAC,iBAAoB,GAAAJ,MAAS,CAAAK,mBAAc;AAEpC,IAAAC,YAAM,GAAAN,MAAiC,CAAAO,SAAM,CAAAC,cAAW;AAExD,IAAAC,QAAS,GAAAA,CAAAC,MAAW,EAAAC,GAA6C;EACtE,SAAOC,IAAA,IAAOD,GAAA,EAChBZ,SAAA,CAAAW,MAAA,EAAAE,IAAA;IAAAC,GAAA,EAAAF,GAAA,CAAAC,IAAA;IAAAE,UAAA;EAAA","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import { Suspense, useEffect, useRef } from "react";
1
+ import { Suspense, useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
2
2
  import { RouteTagContext, stackNavigator, useNavState } from "./navigator.mjs";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  class DomStackAdapter {
@@ -59,6 +59,16 @@ function useZeroHeightWarning(ref) {
59
59
  return () => cancelAnimationFrame(raf);
60
60
  }, [ref]);
61
61
  }
62
+ function PageLoading({
63
+ tag,
64
+ onPending
65
+ }) {
66
+ useLayoutEffect(() => {
67
+ onPending(tag, true);
68
+ return () => onPending(tag, false);
69
+ }, [tag, onPending]);
70
+ return null;
71
+ }
62
72
  function DomNavigationHost({
63
73
  routes,
64
74
  initialHref,
@@ -81,6 +91,19 @@ function DomNavigationHost({
81
91
  }, []);
82
92
  useZeroHeightWarning(hostRef);
83
93
  const nav = useNavState();
94
+ const pendingRef = useRef(/* @__PURE__ */new Set());
95
+ const [, setPendingVersion] = useState(0);
96
+ const markPending = useCallback((tag, isPending) => {
97
+ if (pendingRef.current.has(tag) === isPending) return;
98
+ if (isPending) pendingRef.current.add(tag);else pendingRef.current.delete(tag);
99
+ setPendingVersion(version => version + 1);
100
+ }, []);
101
+ const settledRef = useRef(nav.tag);
102
+ useLayoutEffect(() => {
103
+ if (!pendingRef.current.has(nav.tag)) settledRef.current = nav.tag;
104
+ });
105
+ const pending = pendingRef.current;
106
+ const shown = pending.has(nav.tag) ? settledRef.current : nav.tag;
84
107
  return /* @__PURE__ */jsx("div", {
85
108
  ref: hostRef,
86
109
  style: {
@@ -93,11 +116,12 @@ function DomNavigationHost({
93
116
  ...style
94
117
  },
95
118
  children: routes.map(route => {
96
- const active = nav.tag === route.tag;
119
+ const active = shown === route.tag;
97
120
  const mounted = stackNavigator.isVisited(route.tag);
98
121
  return /* @__PURE__ */jsx("div", {
99
122
  "data-seam-page": route.tag,
100
123
  "data-seam-active": active ? "true" : "false",
124
+ "data-seam-pending": pending.has(route.tag) ? "true" : void 0,
101
125
  style: {
102
126
  ...PAGE_STYLE,
103
127
  display: active ? "flex" : "none"
@@ -105,7 +129,10 @@ function DomNavigationHost({
105
129
  children: /* @__PURE__ */jsx(RouteTagContext.Provider, {
106
130
  value: route.tag,
107
131
  children: /* @__PURE__ */jsx(Suspense, {
108
- fallback: null,
132
+ fallback: /* @__PURE__ */jsx(PageLoading, {
133
+ tag: route.tag,
134
+ onPending: markPending
135
+ }),
109
136
  children: mounted ? route.element : null
110
137
  })
111
138
  })
@@ -1 +1 @@
1
- {"version":3,"names":["Suspense","useEffect","useRef","RouteTagContext","stackNavigator","useNavState","jsx","DomStackAdapter","stack","onChanged","constructor","rootTag","push_by_tag","tag","push","pop","length","pop_to_tag","idx","lastIndexOf","slice","replace_with_tags","tags","get_navigation_stack","snapshot","get_n_items","get_item","index","get_tag","PAGE_STYLE","position","flex","minHeight","display","flexDirection","overflow","useZeroHeightWarning","ref","process","env","NODE_ENV","el","current","raf","requestAnimationFrame","offsetParent","getBoundingClientRect","height","console","error","cancelAnimationFrame","DomNavigationHost","routes","initialHref","style","hostRef","adapterRef","seedInitialRoute","syncFromHost","initialHrefRef","adapter","attach","detach","nav","children","map","route","active","mounted","isVisited","Provider","value","fallback","element"],"sources":["../../../src/seam/DomNavigationHost.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Suspense","useCallback","useEffect","useLayoutEffect","useRef","useState","RouteTagContext","stackNavigator","useNavState","jsx","DomStackAdapter","stack","onChanged","constructor","rootTag","push_by_tag","tag","push","pop","length","pop_to_tag","idx","lastIndexOf","slice","replace_with_tags","tags","get_navigation_stack","snapshot","get_n_items","get_item","index","get_tag","PAGE_STYLE","position","flex","minHeight","display","flexDirection","overflow","useZeroHeightWarning","ref","process","env","NODE_ENV","el","current","raf","requestAnimationFrame","offsetParent","getBoundingClientRect","height","console","error","cancelAnimationFrame","PageLoading","onPending","DomNavigationHost","routes","initialHref","style","hostRef","adapterRef","seedInitialRoute","syncFromHost","initialHrefRef","adapter","attach","detach","nav","pendingRef","Set","setPendingVersion","markPending","isPending","has","add","delete","version","settledRef","pending","shown","children","map","route","active","mounted","isVisited","Provider","value","fallback","element"],"sources":["../../../src/seam/DomNavigationHost.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -145,6 +145,19 @@ function useZeroHeightWarning(ref) {
145
145
  };
146
146
  }, [ref]);
147
147
  }
148
+ function PageLoading(param) {
149
+ var {
150
+ tag,
151
+ onPending
152
+ } = param;
153
+ (0, import_react.useLayoutEffect)(function () {
154
+ onPending(tag, true);
155
+ return function () {
156
+ return onPending(tag, false);
157
+ };
158
+ }, [tag, onPending]);
159
+ return null;
160
+ }
148
161
  function DomNavigationHost(param) {
149
162
  var {
150
163
  routes,
@@ -174,6 +187,21 @@ function DomNavigationHost(param) {
174
187
  }, []);
175
188
  useZeroHeightWarning(hostRef);
176
189
  var nav = (0, import_navigator.useNavState)();
190
+ var pendingRef = (0, import_react.useRef)(/* @__PURE__ */new Set());
191
+ var [, setPendingVersion] = (0, import_react.useState)(0);
192
+ var markPending = (0, import_react.useCallback)(function (tag, isPending) {
193
+ if (pendingRef.current.has(tag) === isPending) return;
194
+ if (isPending) pendingRef.current.add(tag);else pendingRef.current.delete(tag);
195
+ setPendingVersion(function (version) {
196
+ return version + 1;
197
+ });
198
+ }, []);
199
+ var settledRef = (0, import_react.useRef)(nav.tag);
200
+ (0, import_react.useLayoutEffect)(function () {
201
+ if (!pendingRef.current.has(nav.tag)) settledRef.current = nav.tag;
202
+ });
203
+ var pending = pendingRef.current;
204
+ var shown = pending.has(nav.tag) ? settledRef.current : nav.tag;
177
205
  return /* @__PURE__ */(0, import_jsx_runtime.jsx)("div", {
178
206
  ref: hostRef,
179
207
  style: {
@@ -186,11 +214,12 @@ function DomNavigationHost(param) {
186
214
  ...style
187
215
  },
188
216
  children: routes.map(function (route) {
189
- var active = nav.tag === route.tag;
217
+ var active = shown === route.tag;
190
218
  var mounted = import_navigator.stackNavigator.isVisited(route.tag);
191
219
  return /* @__PURE__ */(0, import_jsx_runtime.jsx)("div", {
192
220
  "data-seam-page": route.tag,
193
221
  "data-seam-active": active ? "true" : "false",
222
+ "data-seam-pending": pending.has(route.tag) ? "true" : void 0,
194
223
  style: {
195
224
  ...PAGE_STYLE,
196
225
  display: active ? "flex" : "none"
@@ -198,7 +227,10 @@ function DomNavigationHost(param) {
198
227
  children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_navigator.RouteTagContext.Provider, {
199
228
  value: route.tag,
200
229
  children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_react.Suspense, {
201
- fallback: null,
230
+ fallback: /* @__PURE__ */(0, import_jsx_runtime.jsx)(PageLoading, {
231
+ tag: route.tag,
232
+ onPending: markPending
233
+ }),
202
234
  children: mounted ? route.element : null
203
235
  })
204
236
  })
@@ -1 +1 @@
1
- {"version":3,"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","DomNavigationHost_exports","DomNavigationHost","DomStackAdapter","module","exports","import_jsx_runtime","require","import_react","import_navigator","_class_call_check","instance","Constructor","TypeError","_defineProperties","props","i","length","descriptor","configurable","writable","_create_class","protoProps","staticProps","_define_property","obj","DomStackAdapter2","rootTag","onChanged","stack","push_by_tag","tag","push","pop","pop_to_tag","idx","lastIndexOf","slice","replace_with_tags","tags","get_navigation_stack","snapshot","get_n_items","get_item","index","get_tag","_snapshot_index"],"sources":["../../../src/seam/DomNavigationHost.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","DomNavigationHost_exports","DomNavigationHost","DomStackAdapter","module","exports","import_jsx_runtime","require","import_react","import_navigator","_class_call_check","instance","Constructor","TypeError","_defineProperties","props","i","length","descriptor","configurable","writable","_create_class","protoProps","staticProps","_define_property","obj","DomStackAdapter2","rootTag","onChanged","stack","push_by_tag","tag","push","pop","pop_to_tag","idx","lastIndexOf","slice","replace_with_tags","tags","get_navigation_stack","snapshot","get_n_items","get_item","index","get_tag","_snapshot_index","PAGE_STYLE","position","flex","minHeight","display","flexDirection","overflow","useZeroHeightWarning","ref","useEffect","process","env","NODE_ENV","el","current","raf","requestAnimationFrame","offsetParent","getBoundingClientRect","height"],"sources":["../../../src/seam/DomNavigationHost.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@multiplatform.one/router",
3
- "version": "8.3.0",
3
+ "version": "8.5.0",
4
4
  "description": "multiplatform.one router with support for react-router-dom and react-navigation",
5
5
  "keywords": [
6
6
  "react",
@@ -61,12 +61,12 @@
61
61
  "access": "public"
62
62
  },
63
63
  "dependencies": {
64
- "@multiplatform.one/platform": "^8.3.0",
64
+ "@multiplatform.one/platform": "^8.5.0",
65
65
  "@vxrn/color-scheme": "~1.16.5"
66
66
  },
67
67
  "devDependencies": {
68
- "@multiplatform.one/config": "8.3.0",
69
- "@multiplatform.one/test-utils": "8.3.0",
68
+ "@multiplatform.one/config": "8.5.0",
69
+ "@multiplatform.one/test-utils": "8.5.0",
70
70
  "@react-navigation/native": "^7.2.2",
71
71
  "@tamagui/build": "2.7.6",
72
72
  "@testing-library/react": "^16.3.3",
@@ -86,6 +86,17 @@
86
86
  "react": "^19.1.0",
87
87
  "react-router-dom": "^7.0.0"
88
88
  },
89
+ "peerDependenciesMeta": {
90
+ "@react-navigation/native": {
91
+ "optional": true
92
+ },
93
+ "one": {
94
+ "optional": true
95
+ },
96
+ "react-router-dom": {
97
+ "optional": true
98
+ }
99
+ },
89
100
  "engines": {
90
101
  "node": ">=16.0.0"
91
102
  },
@@ -1,6 +1,21 @@
1
- import { Link, useParams, usePathname as useOnePathname, useRouter } from "one";
1
+ import type { LinkComponent, UseParams, UseRouter } from "../types";
2
+ import { type NativeRouter, pickRouter } from "./nativeFallback";
2
3
 
3
- export { Link, useParams, useRouter };
4
+ function loadOne(): NativeRouter | undefined {
5
+ try {
6
+ return require("one") as NativeRouter;
7
+ } catch {
8
+ return undefined;
9
+ }
10
+ }
11
+
12
+ const router = pickRouter(loadOne());
13
+
14
+ export const Link: LinkComponent = router.Link;
15
+ export const useParams: UseParams = router.useParams;
16
+ export const useRouter: UseRouter = router.useRouter;
17
+
18
+ const useRouterPathname = router.usePathname;
4
19
 
5
20
  /**
6
21
  * One 1.16.5 `usePathname()` reads `useRouteInfo().pathname` with no guard.
@@ -11,7 +26,7 @@ export { Link, useParams, useRouter };
11
26
  */
12
27
  export function usePathname(): string {
13
28
  try {
14
- return useOnePathname() ?? "/";
29
+ return useRouterPathname() ?? "/";
15
30
  } catch {
16
31
  return "/";
17
32
  }
@@ -0,0 +1,46 @@
1
+ import { render, renderHook, screen } from "@testing-library/react";
2
+ import { readFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { describe, expect, it } from "vitest";
5
+ import type { LinkComponent } from "../types";
6
+ import { type NativeRouter, nativeFallback, pickRouter } from "./nativeFallback";
7
+
8
+ describe("native router without One", () => {
9
+ it("falls back to the no-op router when one is not installed", () => {
10
+ const router = pickRouter(undefined);
11
+ expect(router).toBe(nativeFallback);
12
+ const { result } = renderHook(() => router.useRouter());
13
+ expect(result.current.canGoBack()).toBe(false);
14
+ expect(() => result.current.push("/a" as never)).not.toThrow();
15
+ expect(renderHook(() => router.usePathname()).result.current).toBe("/");
16
+ expect(renderHook(() => router.useParams()).result.current).toEqual({});
17
+ });
18
+
19
+ it("renders a Link's children with no anchor", () => {
20
+ const { container } = render(
21
+ <nativeFallback.Link href={"/a" as never}>
22
+ <span>go</span>
23
+ </nativeFallback.Link>,
24
+ );
25
+ expect(screen.getByText("go")).toBeTruthy();
26
+ expect(container.querySelector("a")).toBeNull();
27
+ expect(nativeFallback.Link.resolveHref("/a" as never)).toBe("/a");
28
+ });
29
+
30
+ it("uses One's router when one is installed", () => {
31
+ const Link = (() => null) as unknown as LinkComponent;
32
+ const one: NativeRouter = {
33
+ Link,
34
+ useParams: () => ({ id: "1" }),
35
+ usePathname: () => "/one",
36
+ useRouter: nativeFallback.useRouter,
37
+ };
38
+ expect(pickRouter(one)).toBe(one);
39
+ });
40
+
41
+ it("loads one from inside a try block so Metro treats it as optional", () => {
42
+ const source = readFileSync(join(__dirname, "index.native.tsx"), "utf8");
43
+ expect(source).not.toMatch(/^import[^;]*from "one"/m);
44
+ expect(source).toMatch(/try \{\s*return require\("one"\)/);
45
+ });
46
+ });
@@ -0,0 +1,19 @@
1
+ import type { LinkComponent, UseParams, UsePathname, UseRouter } from "../types";
2
+ import { useParams, usePathname, useRouter } from "./EmptyRouter";
3
+
4
+ export interface NativeRouter {
5
+ Link: LinkComponent;
6
+ useParams: UseParams;
7
+ usePathname: UsePathname;
8
+ useRouter: UseRouter;
9
+ }
10
+
11
+ const Link: LinkComponent = ({ children }) => <>{children}</>;
12
+
13
+ Link.resolveHref = (href) => href.toString();
14
+
15
+ export const nativeFallback: NativeRouter = { Link, useParams, usePathname, useRouter };
16
+
17
+ export function pickRouter(one: NativeRouter | undefined): NativeRouter {
18
+ return one ?? nativeFallback;
19
+ }
@@ -0,0 +1,78 @@
1
+ import { act, render, screen } from "@testing-library/react";
2
+ import { lazy, type ReactElement } from "react";
3
+ import { beforeEach, describe, expect, it } from "vitest";
4
+ import { DomNavigationHost } from "./DomNavigationHost";
5
+ import { stackNavigator } from "./navigator";
6
+
7
+ const ROUTES = [
8
+ { pattern: "/", tag: "home", title: "Home" },
9
+ { pattern: "/todos", tag: "todos", title: "Todos" },
10
+ ];
11
+
12
+ function deferredScreen() {
13
+ let resolve!: () => void;
14
+ const ready = new Promise<{ default: () => ReactElement }>((done) => {
15
+ resolve = () => done({ default: () => <div data-testid="todos-screen" /> });
16
+ });
17
+ return { Screen: lazy(() => ready), resolve: () => act(async () => resolve()) };
18
+ }
19
+
20
+ function page(container: HTMLElement, tag: string): HTMLElement {
21
+ return container.querySelector(`[data-seam-page="${tag}"]`) as HTMLElement;
22
+ }
23
+
24
+ function shown(container: HTMLElement): string[] {
25
+ return [...container.querySelectorAll<HTMLElement>("[data-seam-page]")]
26
+ .filter((el) => el.style.display !== "none")
27
+ .map((el) => el.dataset.seamPage ?? "");
28
+ }
29
+
30
+ describe("DomNavigationHost route change (LC-198)", () => {
31
+ beforeEach(() => {
32
+ stackNavigator.detach();
33
+ stackNavigator.configure(ROUTES);
34
+ });
35
+
36
+ it("holds the current page on screen while the next one is still loading", async () => {
37
+ const todos = deferredScreen();
38
+ const { container } = render(
39
+ <DomNavigationHost
40
+ routes={[
41
+ { ...ROUTES[0]!, element: <div data-testid="home-screen" /> },
42
+ { ...ROUTES[1]!, element: <todos.Screen /> },
43
+ ]}
44
+ />,
45
+ );
46
+
47
+ act(() => stackNavigator.push("/todos"));
48
+
49
+ expect(shown(container)).toEqual(["home"]);
50
+ expect(page(container, "home").childElementCount).toBeGreaterThan(0);
51
+ expect(page(container, "home").dataset.seamActive).toBe("true");
52
+ expect(page(container, "todos").dataset.seamPending).toBe("true");
53
+ expect(screen.getByTestId("home-screen")).toBeTruthy();
54
+
55
+ await todos.resolve();
56
+
57
+ expect(shown(container)).toEqual(["todos"]);
58
+ expect(page(container, "todos").dataset.seamActive).toBe("true");
59
+ expect(page(container, "todos").dataset.seamPending).toBeUndefined();
60
+ expect(screen.getByTestId("todos-screen")).toBeTruthy();
61
+ });
62
+
63
+ it("shows the page at once when it does not suspend", () => {
64
+ const { container } = render(
65
+ <DomNavigationHost
66
+ routes={[
67
+ { ...ROUTES[0]!, element: <div data-testid="home-screen" /> },
68
+ { ...ROUTES[1]!, element: <div data-testid="todos-screen" /> },
69
+ ]}
70
+ />,
71
+ );
72
+
73
+ act(() => stackNavigator.push("/todos"));
74
+
75
+ expect(shown(container)).toEqual(["todos"]);
76
+ expect(page(container, "todos").dataset.seamPending).toBeUndefined();
77
+ });
78
+ });
@@ -26,7 +26,7 @@
26
26
  // See the contract above PAGE_STYLE.
27
27
 
28
28
  import type { CSSProperties, ReactNode } from "react";
29
- import { Suspense, useEffect, useRef } from "react";
29
+ import { Suspense, useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
30
30
  import {
31
31
  RouteTagContext,
32
32
  stackNavigator,
@@ -149,6 +149,20 @@ function useZeroHeightWarning(ref: { current: HTMLDivElement | null }): void {
149
149
  }, [ref]);
150
150
  }
151
151
 
152
+ function PageLoading({
153
+ tag,
154
+ onPending,
155
+ }: {
156
+ tag: string;
157
+ onPending: (tag: string, isPending: boolean) => void;
158
+ }): null {
159
+ useLayoutEffect(() => {
160
+ onPending(tag, true);
161
+ return () => onPending(tag, false);
162
+ }, [tag, onPending]);
163
+ return null;
164
+ }
165
+
152
166
  export function DomNavigationHost({
153
167
  routes,
154
168
  initialHref,
@@ -183,6 +197,20 @@ export function DomNavigationHost({
183
197
  useZeroHeightWarning(hostRef);
184
198
 
185
199
  const nav = useNavState();
200
+ const pendingRef = useRef<Set<string>>(new Set());
201
+ const [, setPendingVersion] = useState(0);
202
+ const markPending = useCallback((tag: string, isPending: boolean) => {
203
+ if (pendingRef.current.has(tag) === isPending) return;
204
+ if (isPending) pendingRef.current.add(tag);
205
+ else pendingRef.current.delete(tag);
206
+ setPendingVersion((version) => version + 1);
207
+ }, []);
208
+ const settledRef = useRef(nav.tag);
209
+ useLayoutEffect(() => {
210
+ if (!pendingRef.current.has(nav.tag)) settledRef.current = nav.tag;
211
+ });
212
+ const pending = pendingRef.current;
213
+ const shown = pending.has(nav.tag) ? settledRef.current : nav.tag;
186
214
 
187
215
  return (
188
216
  <div
@@ -198,17 +226,20 @@ export function DomNavigationHost({
198
226
  }}
199
227
  >
200
228
  {routes.map((route) => {
201
- const active = nav.tag === route.tag;
229
+ const active = shown === route.tag;
202
230
  const mounted = stackNavigator.isVisited(route.tag);
203
231
  return (
204
232
  <div
205
233
  key={route.tag}
206
234
  data-seam-page={route.tag}
207
235
  data-seam-active={active ? "true" : "false"}
236
+ data-seam-pending={pending.has(route.tag) ? "true" : undefined}
208
237
  style={{ ...PAGE_STYLE, display: active ? "flex" : "none" }}
209
238
  >
210
239
  <RouteTagContext.Provider value={route.tag}>
211
- <Suspense fallback={null}>{mounted ? route.element : null}</Suspense>
240
+ <Suspense fallback={<PageLoading tag={route.tag} onPending={markPending} />}>
241
+ {mounted ? route.element : null}
242
+ </Suspense>
212
243
  </RouteTagContext.Provider>
213
244
  </div>
214
245
  );
@@ -1,5 +1,7 @@
1
- import { Link, useParams, useRouter } from "one";
2
- export { Link, useParams, useRouter };
1
+ import type { LinkComponent, UseParams, UseRouter } from "../types";
2
+ export declare const Link: LinkComponent;
3
+ export declare const useParams: UseParams;
4
+ export declare const useRouter: UseRouter;
3
5
  /**
4
6
  * One 1.16.5 `usePathname()` reads `useRouteInfo().pathname` with no guard.
5
7
  * On native a layout node sees the router store's `routeInfo`, which is
@@ -1 +1 @@
1
- {"version":3,"file":"index.native.d.ts","sourceRoot":"","sources":["../../src/router/index.native.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAiC,SAAS,EAAE,MAAM,KAAK,CAAC;AAEhF,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAEtC;;;;;;GAMG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAMpC"}
1
+ {"version":3,"file":"index.native.d.ts","sourceRoot":"","sources":["../../src/router/index.native.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAapE,eAAO,MAAM,IAAI,EAAE,aAA2B,CAAC;AAC/C,eAAO,MAAM,SAAS,EAAE,SAA4B,CAAC;AACrD,eAAO,MAAM,SAAS,EAAE,SAA4B,CAAC;AAIrD;;;;;;GAMG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAMpC"}
@@ -0,0 +1,10 @@
1
+ import type { LinkComponent, UseParams, UsePathname, UseRouter } from "../types";
2
+ export interface NativeRouter {
3
+ Link: LinkComponent;
4
+ useParams: UseParams;
5
+ usePathname: UsePathname;
6
+ useRouter: UseRouter;
7
+ }
8
+ export declare const nativeFallback: NativeRouter;
9
+ export declare function pickRouter(one: NativeRouter | undefined): NativeRouter;
10
+ //# sourceMappingURL=nativeFallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nativeFallback.d.ts","sourceRoot":"","sources":["../../src/router/nativeFallback.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGjF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,SAAS,CAAC;CACtB;AAMD,eAAO,MAAM,cAAc,EAAE,YAA0D,CAAC;AAExF,wBAAgB,UAAU,CAAC,GAAG,EAAE,YAAY,GAAG,SAAS,GAAG,YAAY,CAEtE"}
@@ -1 +1 @@
1
- {"version":3,"file":"DomNavigationHost.d.ts","sourceRoot":"","sources":["../../src/seam/DomNavigationHost.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtD,OAAO,EAIL,KAAK,IAAI,EACT,KAAK,eAAe,EACpB,KAAK,QAAQ,EACd,MAAM,aAAa,CAAC;AAErB;;qBAEqB;AACrB,qBAAa,eAAgB,YAAW,eAAe;IACrD,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;gBAE3B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,IAAI;IAKlD,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAK9B,GAAG,IAAI,OAAO;IAOd,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAQhC,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAKvC,oBAAoB,IAAI;QACtB,WAAW,IAAI,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG;YAAE,OAAO,IAAI,MAAM,GAAG,IAAI,CAAA;SAAE,GAAG,IAAI,CAAC;KAC9D;CAQF;AAED,MAAM,WAAW,aAAc,SAAQ,QAAQ;IAC7C,OAAO,EAAE,SAAS,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB;;;8DAG0D;IAC1D,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAmDD,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,WAAW,EACX,KAAK,GACN,EAAE,sBAAsB,GAAG,SAAS,CA8DpC"}
1
+ {"version":3,"file":"DomNavigationHost.d.ts","sourceRoot":"","sources":["../../src/seam/DomNavigationHost.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtD,OAAO,EAIL,KAAK,IAAI,EACT,KAAK,eAAe,EACpB,KAAK,QAAQ,EACd,MAAM,aAAa,CAAC;AAErB;;qBAEqB;AACrB,qBAAa,eAAgB,YAAW,eAAe;IACrD,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;gBAE3B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,IAAI;IAKlD,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAK9B,GAAG,IAAI,OAAO;IAOd,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAQhC,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAKvC,oBAAoB,IAAI;QACtB,WAAW,IAAI,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG;YAAE,OAAO,IAAI,MAAM,GAAG,IAAI,CAAA;SAAE,GAAG,IAAI,CAAC;KAC9D;CAQF;AAED,MAAM,WAAW,aAAc,SAAQ,QAAQ;IAC7C,OAAO,EAAE,SAAS,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB;;;8DAG0D;IAC1D,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAiED,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,WAAW,EACX,KAAK,GACN,EAAE,sBAAsB,GAAG,SAAS,CA+EpC"}