@alepha/react 0.11.5 → 0.11.7

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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 Feunard
3
+ Copyright (c) 2025 Nicolas Foures
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -192,7 +192,3 @@ class App {
192
192
 
193
193
  const router = useRouter<App>();
194
194
  router.go("home"); // typesafe
195
-
196
- #### useStore()
197
-
198
- Hook to access and mutate the Alepha state.
@@ -1,4 +1,4 @@
1
- import { $env, $hook, $inject, $module, Alepha, AlephaError, Descriptor, KIND, createDescriptor, t } from "@alepha/core";
1
+ import { $atom, $env, $hook, $inject, $module, $use, Alepha, AlephaError, Atom, Descriptor, KIND, createDescriptor, t } from "@alepha/core";
2
2
  import { AlephaDateTime, DateTimeProvider } from "@alepha/datetime";
3
3
  import { AlephaServer, HttpClient } from "@alepha/server";
4
4
  import { AlephaServerLinks, LinkProvider } from "@alepha/server-links";
@@ -417,30 +417,28 @@ const useEvents = (opts, deps) => {
417
417
 
418
418
  //#endregion
419
419
  //#region src/hooks/useStore.ts
420
- /**
421
- * Hook to access and mutate the Alepha state.
422
- */
423
- const useStore = (key, defaultValue) => {
420
+ function useStore(target, defaultValue) {
424
421
  const alepha = useAlepha();
425
422
  useMemo(() => {
426
- if (defaultValue != null && alepha.state.get(key) == null) alepha.state.set(key, defaultValue);
423
+ if (defaultValue != null && alepha.state.get(target) == null) alepha.state.set(target, defaultValue);
427
424
  }, [defaultValue]);
428
- const [state, setState] = useState(alepha.state.get(key));
425
+ const [state, setState] = useState(alepha.state.get(target));
429
426
  useEffect(() => {
430
427
  if (!alepha.isBrowser()) return;
428
+ const key = target instanceof Atom ? target.key : target;
431
429
  return alepha.events.on("state:mutate", (ev) => {
432
430
  if (ev.key === key) setState(ev.value);
433
431
  });
434
432
  }, []);
435
433
  return [state, (value) => {
436
- alepha.state.set(key, value);
434
+ alepha.state.set(target, value);
437
435
  }];
438
- };
436
+ }
439
437
 
440
438
  //#endregion
441
439
  //#region src/hooks/useRouterState.ts
442
440
  const useRouterState = () => {
443
- const [state] = useStore("react.router.state");
441
+ const [state] = useStore("alepha.react.router.state");
444
442
  if (!state) throw new AlephaError("Missing react router state");
445
443
  return state;
446
444
  };
@@ -951,7 +949,7 @@ var ReactBrowserRouterProvider = class extends RouterProvider {
951
949
  };
952
950
  await this.alepha.events.emit("react:action:begin", { type: "transition" });
953
951
  await this.alepha.events.emit("react:transition:begin", {
954
- previous: this.alepha.state.get("react.router.state"),
952
+ previous: this.alepha.state.get("alepha.react.router.state"),
955
953
  state
956
954
  });
957
955
  try {
@@ -993,7 +991,7 @@ var ReactBrowserRouterProvider = class extends RouterProvider {
993
991
  const layer = previous[i];
994
992
  if (state.layers[i]?.name !== layer.name) this.pageApi.page(layer.name)?.onLeave?.();
995
993
  }
996
- this.alepha.state.set("react.router.state", state);
994
+ this.alepha.state.set("alepha.react.router.state", state);
997
995
  await this.alepha.events.emit("react:action:end", { type: "transition" });
998
996
  await this.alepha.events.emit("react:transition:end", { state });
999
997
  }
@@ -1005,6 +1003,14 @@ var ReactBrowserRouterProvider = class extends RouterProvider {
1005
1003
  //#endregion
1006
1004
  //#region src/providers/ReactBrowserProvider.ts
1007
1005
  const envSchema = t.object({ REACT_ROOT_ID: t.text({ default: "root" }) });
1006
+ /**
1007
+ * React browser renderer configuration atom
1008
+ */
1009
+ const reactBrowserOptions = $atom({
1010
+ name: "alepha.react.browser.options",
1011
+ schema: t.object({ scrollRestoration: t.enum(["top", "manual"]) }),
1012
+ default: { scrollRestoration: "top" }
1013
+ });
1008
1014
  var ReactBrowserProvider = class {
1009
1015
  env = $env(envSchema);
1010
1016
  log = $logger();
@@ -1012,7 +1018,7 @@ var ReactBrowserProvider = class {
1012
1018
  alepha = $inject(Alepha);
1013
1019
  router = $inject(ReactBrowserRouterProvider);
1014
1020
  dateTimeProvider = $inject(DateTimeProvider);
1015
- options = { scrollRestoration: "top" };
1021
+ options = $use(reactBrowserOptions);
1016
1022
  getRootElement() {
1017
1023
  const root = this.document.getElementById(this.env.REACT_ROOT_ID);
1018
1024
  if (root) return root;
@@ -1023,7 +1029,7 @@ var ReactBrowserProvider = class {
1023
1029
  }
1024
1030
  transitioning;
1025
1031
  get state() {
1026
- return this.alepha.state.get("react.router.state");
1032
+ return this.alepha.state.get("alepha.react.router.state");
1027
1033
  }
1028
1034
  /**
1029
1035
  * Accessor for Document DOM API.
@@ -1185,7 +1191,7 @@ var ReactRouter = class {
1185
1191
  alepha = $inject(Alepha);
1186
1192
  pageApi = $inject(ReactPageProvider);
1187
1193
  get state() {
1188
- return this.alepha.state.get("react.router.state");
1194
+ return this.alepha.state.get("alepha.react.router.state");
1189
1195
  }
1190
1196
  get pages() {
1191
1197
  return this.pageApi.getPages();
@@ -1543,7 +1549,7 @@ function useAction(options, deps) {
1543
1549
  }, []);
1544
1550
  useEffect(() => {
1545
1551
  if (options.runOnInit) handler(...[]);
1546
- }, []);
1552
+ }, deps);
1547
1553
  useEffect(() => {
1548
1554
  if (!options.runEvery) return;
1549
1555
  intervalRef.current = dateTimeProvider.createInterval(() => handler(...[]), options.runEvery, true);
@@ -1692,5 +1698,5 @@ const AlephaReact = $module({
1692
1698
  });
1693
1699
 
1694
1700
  //#endregion
1695
- export { $page, AlephaContext, AlephaReact, ClientOnly_default as ClientOnly, ErrorBoundary_default as ErrorBoundary, ErrorViewer_default as ErrorViewer, Link_default as Link, NestedView_default as NestedView, NotFoundPage as NotFound, PageDescriptor, ReactBrowserProvider, ReactBrowserRouterProvider, ReactPageProvider, ReactRouter, Redirection, RouterLayerContext, isPageRoute, ssrSchemaLoading, useAction, useActive, useAlepha, useClient, useEvents, useInject, useQueryParams, useRouter, useRouterState, useSchema, useStore };
1701
+ export { $page, AlephaContext, AlephaReact, ClientOnly_default as ClientOnly, ErrorBoundary_default as ErrorBoundary, ErrorViewer_default as ErrorViewer, Link_default as Link, NestedView_default as NestedView, NotFoundPage as NotFound, PageDescriptor, ReactBrowserProvider, ReactBrowserRouterProvider, ReactPageProvider, ReactRouter, Redirection, RouterLayerContext, isPageRoute, reactBrowserOptions, ssrSchemaLoading, useAction, useActive, useAlepha, useClient, useEvents, useInject, useQueryParams, useRouter, useRouterState, useSchema, useStore };
1696
1702
  //# sourceMappingURL=index.browser.js.map