@alepha/react 0.9.3 → 0.9.5

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/README.md +64 -6
  2. package/dist/index.browser.js +442 -328
  3. package/dist/index.browser.js.map +1 -1
  4. package/dist/index.cjs +644 -482
  5. package/dist/index.cjs.map +1 -1
  6. package/dist/index.d.cts +402 -339
  7. package/dist/index.d.cts.map +1 -1
  8. package/dist/index.d.ts +412 -349
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +641 -484
  11. package/dist/index.js.map +1 -1
  12. package/package.json +16 -11
  13. package/src/components/Link.tsx +2 -5
  14. package/src/components/NestedView.tsx +164 -19
  15. package/src/components/NotFound.tsx +1 -1
  16. package/src/descriptors/$page.ts +100 -5
  17. package/src/errors/Redirection.ts +8 -5
  18. package/src/hooks/useActive.ts +25 -35
  19. package/src/hooks/useAlepha.ts +16 -2
  20. package/src/hooks/useClient.ts +7 -4
  21. package/src/hooks/useInject.ts +4 -1
  22. package/src/hooks/useQueryParams.ts +9 -6
  23. package/src/hooks/useRouter.ts +18 -31
  24. package/src/hooks/useRouterEvents.ts +30 -22
  25. package/src/hooks/useRouterState.ts +8 -20
  26. package/src/hooks/useSchema.ts +10 -15
  27. package/src/hooks/useStore.ts +0 -7
  28. package/src/index.browser.ts +14 -11
  29. package/src/index.shared.ts +2 -3
  30. package/src/index.ts +27 -31
  31. package/src/providers/ReactBrowserProvider.ts +151 -62
  32. package/src/providers/ReactBrowserRendererProvider.ts +22 -0
  33. package/src/providers/ReactBrowserRouterProvider.ts +137 -0
  34. package/src/providers/{PageDescriptorProvider.ts → ReactPageProvider.ts} +121 -104
  35. package/src/providers/ReactServerProvider.ts +90 -76
  36. package/src/{hooks/RouterHookApi.ts → services/ReactRouter.ts} +49 -62
  37. package/src/contexts/RouterContext.ts +0 -14
  38. package/src/providers/BrowserRouterProvider.ts +0 -155
  39. package/src/providers/ReactBrowserRenderer.ts +0 -93
@@ -1,93 +0,0 @@
1
- import { $env, $hook, $inject, $logger, type Static, t } from "@alepha/core";
2
- import type { ApiLinksResponse } from "@alepha/server";
3
- import type { Root } from "react-dom/client";
4
- import { createRoot, hydrateRoot } from "react-dom/client";
5
- import { BrowserRouterProvider } from "./BrowserRouterProvider.ts";
6
- import type {
7
- PreviousLayerData,
8
- TransitionOptions,
9
- } from "./PageDescriptorProvider.ts";
10
- import { ReactBrowserProvider } from "./ReactBrowserProvider.ts";
11
-
12
- const envSchema = t.object({
13
- REACT_ROOT_ID: t.string({ default: "root" }),
14
- });
15
-
16
- declare module "@alepha/core" {
17
- interface Env extends Partial<Static<typeof envSchema>> {}
18
- }
19
-
20
- export interface ReactBrowserRendererOptions {
21
- scrollRestoration?: "top" | "manual";
22
- }
23
-
24
- // TODO: move to ReactBrowserProvider when it will be removed from server-side imports
25
- export class ReactBrowserRenderer {
26
- protected readonly browserProvider = $inject(ReactBrowserProvider);
27
- protected readonly browserRouterProvider = $inject(BrowserRouterProvider);
28
- protected readonly env = $env(envSchema);
29
- protected readonly log = $logger();
30
-
31
- protected root!: Root;
32
-
33
- public options: ReactBrowserRendererOptions = {
34
- scrollRestoration: "top",
35
- };
36
-
37
- protected getRootElement() {
38
- const root = this.browserProvider.document.getElementById(
39
- this.env.REACT_ROOT_ID,
40
- );
41
- if (root) {
42
- return root;
43
- }
44
-
45
- const div = this.browserProvider.document.createElement("div");
46
- div.id = this.env.REACT_ROOT_ID;
47
-
48
- this.browserProvider.document.body.prepend(div);
49
-
50
- return div;
51
- }
52
-
53
- public readonly ready = $hook({
54
- on: "react:browser:render",
55
- handler: async ({ state, context, hydration }) => {
56
- const element = this.browserRouterProvider.root(state, context);
57
-
58
- if (hydration?.layers) {
59
- this.root = hydrateRoot(this.getRootElement(), element);
60
- this.log.info("Hydrated root element");
61
- } else {
62
- this.root ??= createRoot(this.getRootElement());
63
- this.root.render(element);
64
- this.log.info("Created root element");
65
- }
66
- },
67
- });
68
-
69
- protected readonly onTransitionEnd = $hook({
70
- on: "react:transition:end",
71
- handler: () => {
72
- if (
73
- this.options.scrollRestoration === "top" &&
74
- typeof window !== "undefined"
75
- ) {
76
- window.scrollTo(0, 0);
77
- }
78
- },
79
- });
80
- }
81
-
82
- // ---------------------------------------------------------------------------------------------------------------------
83
-
84
- export interface RouterGoOptions {
85
- replace?: boolean;
86
- match?: TransitionOptions;
87
- params?: Record<string, string>;
88
- }
89
-
90
- export interface ReactHydrationState {
91
- layers?: Array<PreviousLayerData>;
92
- links?: ApiLinksResponse;
93
- }