@aigamo/route-sphere 2.1.0-4 → 2.1.0-6

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.
@@ -0,0 +1,7 @@
1
+ export interface IStateSetter<TState> {
2
+ set: (state: TState) => void;
3
+ }
4
+ export interface IStateGetter<TState> {
5
+ get: () => TState;
6
+ }
7
+ export type IStateAccessor<TState> = IStateSetter<TState> & IStateGetter<TState>;
@@ -0,0 +1,7 @@
1
+ export interface IStateDeserializer {
2
+ deserialize: () => unknown;
3
+ }
4
+ export interface IStateSerializer<TState> {
5
+ serialize: (state: TState) => void;
6
+ }
7
+ export type IStateCodec<TState> = IStateSerializer<TState> & IStateDeserializer;
@@ -1,2 +1,4 @@
1
1
  import { StateChangeEvent } from '../stores/StateChangeEvent';
2
- export declare const useStateHandler: <TState>(deserializer: () => any, stateValidator: (state: any) => state is TState, stateSetter: (state: TState) => void, onStateChange: ((event: StateChangeEvent<TState>) => void) | undefined, stateGetter: () => TState, serializer: (state: TState) => void) => void;
2
+ import { IStateAccessor } from './IStateAccessor';
3
+ import { IStateCodec } from './IStateCodec';
4
+ export declare const useStateHandler: <TState>(codec: IStateCodec<TState>, validator: (state: unknown) => state is TState, accessor: IStateAccessor<TState>, onStateChange: ((event: StateChangeEvent<TState>) => void) | undefined) => void;
package/dist/index.cjs.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react"),u=require("react-router-dom"),n=require("./useStateHandler-BKLDeBsK.cjs"),S=()=>{const e=u.useLocation();return r.useLayoutEffect(()=>{window.scrollTo(0,0)},[e]),null},i=e=>r.useCallback(()=>{try{return JSON.parse(window.localStorage.getItem(e)??JSON.stringify({}))}catch(t){return console.error(t),{}}},[e]),d=e=>r.useCallback(t=>{window.localStorage.setItem(e,JSON.stringify(t))},[e]),g=(e,t,a,o,s)=>{const c=i(e),l=d(e);n.useStateHandler(c,t,a,o,s,l)},L=e=>r.useCallback(t=>{e.state=t},[e]),b=e=>r.useCallback(()=>e.state,[e]),w=(e,t)=>{const a=L(t),o=b(t);g(e,t.validateState,a,t.onStateChange,o)},T=(e,t)=>t.some(a=>e.includes(a));exports.useStateHandler=n.useStateHandler;exports.ScrollToTop=S;exports.includesAny=T;exports.useLocalStorageState=w;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react"),n=require("react-router-dom"),c=require("./useStateHandler-B54QKldW.cjs"),l=()=>{const e=n.useLocation();return r.useLayoutEffect(()=>{window.scrollTo(0,0)},[e]),null},u=e=>r.useCallback(()=>{try{return JSON.parse(window.localStorage.getItem(e)??JSON.stringify({}))}catch(t){return console.error(t),{}}},[e]),S=e=>r.useCallback(t=>{window.localStorage.setItem(e,JSON.stringify(t))},[e]),i=e=>{const t=u(e),o=S(e);return r.useMemo(()=>({deserialize:t,serialize:o}),[t,o])},d=(e,t,o,a)=>{const s=i(e);c.useStateHandler(s,t,o,a)},g=e=>r.useCallback(()=>e.state,[e]),L=e=>r.useCallback(t=>{e.state=t},[e]),m=e=>{const t=g(e),o=L(e);return r.useMemo(()=>({get:t,set:o}),[t,o])},b=(e,t)=>{const o=m(t);d(e,t.validateState,o,t.onStateChange)},w=(e,t)=>t.some(o=>e.includes(o));exports.useStateHandler=c.useStateHandler;exports.ScrollToTop=l;exports.includesAny=w;exports.useLocalStorageState=b;
2
2
  //# sourceMappingURL=index.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/components/ScrollToTop.tsx","../src/components/useLocalStorageState.tsx","../src/helpers/includesAny.ts"],"sourcesContent":["import { useLayoutEffect } from 'react';\nimport { useLocation } from 'react-router-dom';\n\nexport const ScrollToTop = (): null => {\n\tconst location = useLocation();\n\n\tuseLayoutEffect(() => {\n\t\twindow.scrollTo(0, 0);\n\t}, [location]);\n\n\treturn null;\n};\n","import type { IStateStore } from '@/stores/IStateStore';\nimport type { StateChangeEvent } from '@/stores/StateChangeEvent';\nimport { useCallback } from 'react';\n\nimport { useStateHandler } from './useStateHandler';\n\nconst useLocalStorageStateDeserializer = (key: string): (() => any) => {\n\treturn useCallback((): any => {\n\t\ttry {\n\t\t\treturn JSON.parse(\n\t\t\t\twindow.localStorage.getItem(key) ?? JSON.stringify({}),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t\treturn {};\n\t\t}\n\t}, [key]);\n};\n\nconst useLocalStorageStateSerializer = <TState,>(\n\tkey: string,\n): ((state: TState) => void) => {\n\treturn useCallback(\n\t\t(state: TState): void => {\n\t\t\twindow.localStorage.setItem(key, JSON.stringify(state));\n\t\t},\n\t\t[key],\n\t);\n};\n\nconst useLocalStorageStateHandler = <TState,>(\n\tkey: string,\n\tstateValidator: (state: any) => state is TState,\n\tstateSetter: (state: TState) => void,\n\tonStateChange: ((event: StateChangeEvent<TState>) => void) | undefined,\n\tstateGetter: () => TState,\n): void => {\n\tconst deserializer = useLocalStorageStateDeserializer(key);\n\tconst serializer = useLocalStorageStateSerializer(key);\n\tuseStateHandler(\n\t\tdeserializer,\n\t\tstateValidator,\n\t\tstateSetter,\n\t\tonStateChange,\n\t\tstateGetter,\n\t\tserializer,\n\t);\n};\n\nconst useLocalStorageStateSetter = <TState,>(\n\tstore: IStateStore<TState>,\n): ((state: TState) => void) => {\n\treturn useCallback(\n\t\t(state: TState): void => {\n\t\t\tstore.state = state;\n\t\t},\n\t\t[store],\n\t);\n};\n\nconst useLocalStorageStateGetter = <TState,>(\n\tstore: IStateStore<TState>,\n): (() => TState) => {\n\treturn useCallback((): TState => store.state, [store]);\n};\n\nexport const useLocalStorageState = <TState,>(\n\tkey: string,\n\tstore: IStateStore<TState>,\n): void => {\n\tconst stateSetter = useLocalStorageStateSetter(store);\n\tconst stateGetter = useLocalStorageStateGetter(store);\n\tuseLocalStorageStateHandler(\n\t\tkey,\n\t\tstore.validateState,\n\t\tstateSetter,\n\t\tstore.onStateChange,\n\t\tstateGetter,\n\t);\n};\n","export const includesAny = <T>(array: T[], values: T[]): boolean => {\n\treturn values.some((value) => array.includes(value));\n};\n"],"names":["ScrollToTop","location","useLocation","useLayoutEffect","useLocalStorageStateDeserializer","key","useCallback","error","useLocalStorageStateSerializer","state","useLocalStorageStateHandler","stateValidator","stateSetter","onStateChange","stateGetter","deserializer","serializer","useStateHandler","useLocalStorageStateSetter","store","useLocalStorageStateGetter","useLocalStorageState","includesAny","array","values","value"],"mappings":"mLAGaA,EAAc,IAAY,CACtC,MAAMC,EAAWC,EAAAA,YAAA,EAEjBC,OAAAA,EAAAA,gBAAgB,IAAM,CACrB,OAAO,SAAS,EAAG,CAAC,CACrB,EAAG,CAACF,CAAQ,CAAC,EAEN,IACR,ECLMG,EAAoCC,GAClCC,EAAAA,YAAY,IAAW,CAC7B,GAAI,CACH,OAAO,KAAK,MACX,OAAO,aAAa,QAAQD,CAAG,GAAK,KAAK,UAAU,CAAA,CAAE,CAAA,CAEvD,OAASE,EAAO,CACf,eAAQ,MAAMA,CAAK,EACZ,CAAA,CACR,CACD,EAAG,CAACF,CAAG,CAAC,EAGHG,EACLH,GAEOC,EAAAA,YACLG,GAAwB,CACxB,OAAO,aAAa,QAAQJ,EAAK,KAAK,UAAUI,CAAK,CAAC,CACvD,EACA,CAACJ,CAAG,CAAA,EAIAK,EAA8B,CACnCL,EACAM,EACAC,EACAC,EACAC,IACU,CACV,MAAMC,EAAeX,EAAiCC,CAAG,EACnDW,EAAaR,EAA+BH,CAAG,EACrDY,EAAAA,gBACCF,EACAJ,EACAC,EACAC,EACAC,EACAE,CAAA,CAEF,EAEME,EACLC,GAEOb,EAAAA,YACLG,GAAwB,CACxBU,EAAM,MAAQV,CACf,EACA,CAACU,CAAK,CAAA,EAIFC,EACLD,GAEOb,EAAAA,YAAY,IAAca,EAAM,MAAO,CAACA,CAAK,CAAC,EAGzCE,EAAuB,CACnChB,EACAc,IACU,CACV,MAAMP,EAAcM,EAA2BC,CAAK,EAC9CL,EAAcM,EAA2BD,CAAK,EACpDT,EACCL,EACAc,EAAM,cACNP,EACAO,EAAM,cACNL,CAAA,CAEF,EC/EaQ,EAAc,CAAIC,EAAYC,IACnCA,EAAO,KAAMC,GAAUF,EAAM,SAASE,CAAK,CAAC"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/components/ScrollToTop.tsx","../src/components/useLocalStorageState.tsx","../src/helpers/includesAny.ts"],"sourcesContent":["import { useLayoutEffect } from 'react';\nimport { useLocation } from 'react-router-dom';\n\nexport const ScrollToTop = (): null => {\n\tconst location = useLocation();\n\n\tuseLayoutEffect(() => {\n\t\twindow.scrollTo(0, 0);\n\t}, [location]);\n\n\treturn null;\n};\n","import type { IStateStore } from '@/stores/IStateStore';\nimport type { StateChangeEvent } from '@/stores/StateChangeEvent';\nimport { useCallback, useMemo } from 'react';\n\nimport type { IStateAccessor } from './IStateAccessor';\nimport type { IStateCodec } from './IStateCodec';\nimport { useStateHandler } from './useStateHandler';\n\nconst useLocalStorageStateDeserializer = (key: string): (() => unknown) => {\n\treturn useCallback((): unknown => {\n\t\ttry {\n\t\t\treturn JSON.parse(\n\t\t\t\twindow.localStorage.getItem(key) ?? JSON.stringify({}),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t\treturn {};\n\t\t}\n\t}, [key]);\n};\n\nconst useLocalStorageStateSerializer = <TState,>(\n\tkey: string,\n): ((state: TState) => void) => {\n\treturn useCallback(\n\t\t(state: TState): void => {\n\t\t\twindow.localStorage.setItem(key, JSON.stringify(state));\n\t\t},\n\t\t[key],\n\t);\n};\n\nconst useLocalStorageStateCodec = <TState,>(\n\tkey: string,\n): IStateCodec<TState> => {\n\tconst deserializer = useLocalStorageStateDeserializer(key);\n\tconst serializer = useLocalStorageStateSerializer(key);\n\tconst codec = useMemo(\n\t\t(): IStateCodec<TState> => ({\n\t\t\tdeserialize: deserializer,\n\t\t\tserialize: serializer,\n\t\t}),\n\t\t[deserializer, serializer],\n\t);\n\treturn codec;\n};\n\nconst useLocalStorageStateHandler = <TState,>(\n\tkey: string,\n\tvalidator: (state: unknown) => state is TState,\n\taccessor: IStateAccessor<TState>,\n\tonStateChange: ((event: StateChangeEvent<TState>) => void) | undefined,\n): void => {\n\tconst codec = useLocalStorageStateCodec(key);\n\tuseStateHandler(codec, validator, accessor, onStateChange);\n};\n\nconst useLocalStorageStateGetter = <TState,>(\n\tstore: IStateStore<TState>,\n): (() => TState) => {\n\treturn useCallback((): TState => store.state, [store]);\n};\n\nconst useLocalStorageStateSetter = <TState,>(\n\tstore: IStateStore<TState>,\n): ((state: TState) => void) => {\n\treturn useCallback(\n\t\t(state: TState): void => {\n\t\t\tstore.state = state;\n\t\t},\n\t\t[store],\n\t);\n};\n\nconst useLocalStorageStateAccessor = <TState,>(\n\tstore: IStateStore<TState>,\n): IStateAccessor<TState> => {\n\tconst getter = useLocalStorageStateGetter(store);\n\tconst setter = useLocalStorageStateSetter(store);\n\tconst accessor = useMemo(\n\t\t(): IStateAccessor<TState> => ({ get: getter, set: setter }),\n\t\t[getter, setter],\n\t);\n\treturn accessor;\n};\n\nexport const useLocalStorageState = <TState,>(\n\tkey: string,\n\tstore: IStateStore<TState>,\n): void => {\n\tconst accessor = useLocalStorageStateAccessor(store);\n\tuseLocalStorageStateHandler(\n\t\tkey,\n\t\tstore.validateState,\n\t\taccessor,\n\t\tstore.onStateChange,\n\t);\n};\n","export const includesAny = <T>(array: T[], values: T[]): boolean => {\n\treturn values.some((value) => array.includes(value));\n};\n"],"names":["ScrollToTop","location","useLocation","useLayoutEffect","useLocalStorageStateDeserializer","key","useCallback","error","useLocalStorageStateSerializer","state","useLocalStorageStateCodec","deserializer","serializer","useMemo","useLocalStorageStateHandler","validator","accessor","onStateChange","codec","useStateHandler","useLocalStorageStateGetter","store","useLocalStorageStateSetter","useLocalStorageStateAccessor","getter","setter","useLocalStorageState","includesAny","array","values","value"],"mappings":"mLAGaA,EAAc,IAAY,CACtC,MAAMC,EAAWC,EAAAA,YAAA,EAEjBC,OAAAA,EAAAA,gBAAgB,IAAM,CACrB,OAAO,SAAS,EAAG,CAAC,CACrB,EAAG,CAACF,CAAQ,CAAC,EAEN,IACR,ECHMG,EAAoCC,GAClCC,EAAAA,YAAY,IAAe,CACjC,GAAI,CACH,OAAO,KAAK,MACX,OAAO,aAAa,QAAQD,CAAG,GAAK,KAAK,UAAU,CAAA,CAAE,CAAA,CAEvD,OAASE,EAAO,CACf,eAAQ,MAAMA,CAAK,EACZ,CAAA,CACR,CACD,EAAG,CAACF,CAAG,CAAC,EAGHG,EACLH,GAEOC,EAAAA,YACLG,GAAwB,CACxB,OAAO,aAAa,QAAQJ,EAAK,KAAK,UAAUI,CAAK,CAAC,CACvD,EACA,CAACJ,CAAG,CAAA,EAIAK,EACLL,GACyB,CACzB,MAAMM,EAAeP,EAAiCC,CAAG,EACnDO,EAAaJ,EAA+BH,CAAG,EAQrD,OAPcQ,EAAAA,QACb,KAA4B,CAC3B,YAAaF,EACb,UAAWC,CAAA,GAEZ,CAACD,EAAcC,CAAU,CAAA,CAG3B,EAEME,EAA8B,CACnCT,EACAU,EACAC,EACAC,IACU,CACV,MAAMC,EAAQR,EAA0BL,CAAG,EAC3Cc,EAAAA,gBAAgBD,EAAOH,EAAWC,EAAUC,CAAa,CAC1D,EAEMG,EACLC,GAEOf,EAAAA,YAAY,IAAce,EAAM,MAAO,CAACA,CAAK,CAAC,EAGhDC,EACLD,GAEOf,EAAAA,YACLG,GAAwB,CACxBY,EAAM,MAAQZ,CACf,EACA,CAACY,CAAK,CAAA,EAIFE,EACLF,GAC4B,CAC5B,MAAMG,EAASJ,EAA2BC,CAAK,EACzCI,EAASH,EAA2BD,CAAK,EAK/C,OAJiBR,EAAAA,QAChB,KAA+B,CAAE,IAAKW,EAAQ,IAAKC,CAAA,GACnD,CAACD,EAAQC,CAAM,CAAA,CAGjB,EAEaC,EAAuB,CACnCrB,EACAgB,IACU,CACV,MAAML,EAAWO,EAA6BF,CAAK,EACnDP,EACCT,EACAgB,EAAM,cACNL,EACAK,EAAM,aAAA,CAER,ECjGaM,EAAc,CAAIC,EAAYC,IACnCA,EAAO,KAAMC,GAAUF,EAAM,SAASE,CAAK,CAAC"}
package/dist/index.es.js CHANGED
@@ -1,53 +1,60 @@
1
- import { useLayoutEffect as l, useCallback as o } from "react";
2
- import { useLocation as S } from "react-router-dom";
3
- import { u as i } from "./useStateHandler-CdocwC8x.js";
4
- const z = () => {
5
- const t = S();
6
- return l(() => {
1
+ import { useLayoutEffect as n, useMemo as c, useCallback as r } from "react";
2
+ import { useLocation as l } from "react-router-dom";
3
+ import { u } from "./useStateHandler-Cmr_YOo4.js";
4
+ const C = () => {
5
+ const e = l();
6
+ return n(() => {
7
7
  window.scrollTo(0, 0);
8
- }, [t]), null;
9
- }, u = (t) => o(() => {
8
+ }, [e]), null;
9
+ }, i = (e) => r(() => {
10
10
  try {
11
11
  return JSON.parse(
12
- window.localStorage.getItem(t) ?? JSON.stringify({})
12
+ window.localStorage.getItem(e) ?? JSON.stringify({})
13
13
  );
14
- } catch (e) {
15
- return console.error(e), {};
14
+ } catch (t) {
15
+ return console.error(t), {};
16
16
  }
17
- }, [t]), g = (t) => o(
18
- (e) => {
19
- window.localStorage.setItem(t, JSON.stringify(e));
17
+ }, [e]), S = (e) => r(
18
+ (t) => {
19
+ window.localStorage.setItem(e, JSON.stringify(t));
20
20
  },
21
- [t]
22
- ), d = (t, e, r, a, n) => {
23
- const s = u(t), c = g(t);
24
- i(
25
- s,
26
- e,
27
- r,
28
- a,
29
- n,
30
- c
21
+ [e]
22
+ ), g = (e) => {
23
+ const t = i(e), o = S(e);
24
+ return c(
25
+ () => ({
26
+ deserialize: t,
27
+ serialize: o
28
+ }),
29
+ [t, o]
31
30
  );
32
- }, m = (t) => o(
33
- (e) => {
34
- t.state = e;
31
+ }, d = (e, t, o, a) => {
32
+ const s = g(e);
33
+ u(s, t, o, a);
34
+ }, m = (e) => r(() => e.state, [e]), L = (e) => r(
35
+ (t) => {
36
+ e.state = t;
35
37
  },
36
- [t]
37
- ), L = (t) => o(() => t.state, [t]), J = (t, e) => {
38
- const r = m(e), a = L(e);
38
+ [e]
39
+ ), f = (e) => {
40
+ const t = m(e), o = L(e);
41
+ return c(
42
+ () => ({ get: t, set: o }),
43
+ [t, o]
44
+ );
45
+ }, J = (e, t) => {
46
+ const o = f(t);
39
47
  d(
40
- t,
41
- e.validateState,
42
- r,
43
- e.onStateChange,
44
- a
48
+ e,
49
+ t.validateState,
50
+ o,
51
+ t.onStateChange
45
52
  );
46
- }, N = (t, e) => e.some((r) => t.includes(r));
53
+ }, N = (e, t) => t.some((o) => e.includes(o));
47
54
  export {
48
- z as ScrollToTop,
55
+ C as ScrollToTop,
49
56
  N as includesAny,
50
57
  J as useLocalStorageState,
51
- i as useStateHandler
58
+ u as useStateHandler
52
59
  };
53
60
  //# sourceMappingURL=index.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/components/ScrollToTop.tsx","../src/components/useLocalStorageState.tsx","../src/helpers/includesAny.ts"],"sourcesContent":["import { useLayoutEffect } from 'react';\nimport { useLocation } from 'react-router-dom';\n\nexport const ScrollToTop = (): null => {\n\tconst location = useLocation();\n\n\tuseLayoutEffect(() => {\n\t\twindow.scrollTo(0, 0);\n\t}, [location]);\n\n\treturn null;\n};\n","import type { IStateStore } from '@/stores/IStateStore';\nimport type { StateChangeEvent } from '@/stores/StateChangeEvent';\nimport { useCallback } from 'react';\n\nimport { useStateHandler } from './useStateHandler';\n\nconst useLocalStorageStateDeserializer = (key: string): (() => any) => {\n\treturn useCallback((): any => {\n\t\ttry {\n\t\t\treturn JSON.parse(\n\t\t\t\twindow.localStorage.getItem(key) ?? JSON.stringify({}),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t\treturn {};\n\t\t}\n\t}, [key]);\n};\n\nconst useLocalStorageStateSerializer = <TState,>(\n\tkey: string,\n): ((state: TState) => void) => {\n\treturn useCallback(\n\t\t(state: TState): void => {\n\t\t\twindow.localStorage.setItem(key, JSON.stringify(state));\n\t\t},\n\t\t[key],\n\t);\n};\n\nconst useLocalStorageStateHandler = <TState,>(\n\tkey: string,\n\tstateValidator: (state: any) => state is TState,\n\tstateSetter: (state: TState) => void,\n\tonStateChange: ((event: StateChangeEvent<TState>) => void) | undefined,\n\tstateGetter: () => TState,\n): void => {\n\tconst deserializer = useLocalStorageStateDeserializer(key);\n\tconst serializer = useLocalStorageStateSerializer(key);\n\tuseStateHandler(\n\t\tdeserializer,\n\t\tstateValidator,\n\t\tstateSetter,\n\t\tonStateChange,\n\t\tstateGetter,\n\t\tserializer,\n\t);\n};\n\nconst useLocalStorageStateSetter = <TState,>(\n\tstore: IStateStore<TState>,\n): ((state: TState) => void) => {\n\treturn useCallback(\n\t\t(state: TState): void => {\n\t\t\tstore.state = state;\n\t\t},\n\t\t[store],\n\t);\n};\n\nconst useLocalStorageStateGetter = <TState,>(\n\tstore: IStateStore<TState>,\n): (() => TState) => {\n\treturn useCallback((): TState => store.state, [store]);\n};\n\nexport const useLocalStorageState = <TState,>(\n\tkey: string,\n\tstore: IStateStore<TState>,\n): void => {\n\tconst stateSetter = useLocalStorageStateSetter(store);\n\tconst stateGetter = useLocalStorageStateGetter(store);\n\tuseLocalStorageStateHandler(\n\t\tkey,\n\t\tstore.validateState,\n\t\tstateSetter,\n\t\tstore.onStateChange,\n\t\tstateGetter,\n\t);\n};\n","export const includesAny = <T>(array: T[], values: T[]): boolean => {\n\treturn values.some((value) => array.includes(value));\n};\n"],"names":["ScrollToTop","location","useLocation","useLayoutEffect","useLocalStorageStateDeserializer","key","useCallback","error","useLocalStorageStateSerializer","state","useLocalStorageStateHandler","stateValidator","stateSetter","onStateChange","stateGetter","deserializer","serializer","useStateHandler","useLocalStorageStateSetter","store","useLocalStorageStateGetter","useLocalStorageState","includesAny","array","values","value"],"mappings":";;;AAGO,MAAMA,IAAc,MAAY;AACtC,QAAMC,IAAWC,EAAA;AAEjB,SAAAC,EAAgB,MAAM;AACrB,WAAO,SAAS,GAAG,CAAC;AAAA,EACrB,GAAG,CAACF,CAAQ,CAAC,GAEN;AACR,GCLMG,IAAmC,CAACC,MAClCC,EAAY,MAAW;AAC7B,MAAI;AACH,WAAO,KAAK;AAAA,MACX,OAAO,aAAa,QAAQD,CAAG,KAAK,KAAK,UAAU,CAAA,CAAE;AAAA,IAAA;AAAA,EAEvD,SAASE,GAAO;AACf,mBAAQ,MAAMA,CAAK,GACZ,CAAA;AAAA,EACR;AACD,GAAG,CAACF,CAAG,CAAC,GAGHG,IAAiC,CACtCH,MAEOC;AAAA,EACN,CAACG,MAAwB;AACxB,WAAO,aAAa,QAAQJ,GAAK,KAAK,UAAUI,CAAK,CAAC;AAAA,EACvD;AAAA,EACA,CAACJ,CAAG;AAAA,GAIAK,IAA8B,CACnCL,GACAM,GACAC,GACAC,GACAC,MACU;AACV,QAAMC,IAAeX,EAAiCC,CAAG,GACnDW,IAAaR,EAA+BH,CAAG;AACrD,EAAAY;AAAA,IACCF;AAAA,IACAJ;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAE;AAAA,EAAA;AAEF,GAEME,IAA6B,CAClCC,MAEOb;AAAA,EACN,CAACG,MAAwB;AACxB,IAAAU,EAAM,QAAQV;AAAA,EACf;AAAA,EACA,CAACU,CAAK;AAAA,GAIFC,IAA6B,CAClCD,MAEOb,EAAY,MAAca,EAAM,OAAO,CAACA,CAAK,CAAC,GAGzCE,IAAuB,CACnChB,GACAc,MACU;AACV,QAAMP,IAAcM,EAA2BC,CAAK,GAC9CL,IAAcM,EAA2BD,CAAK;AACpD,EAAAT;AAAA,IACCL;AAAA,IACAc,EAAM;AAAA,IACNP;AAAA,IACAO,EAAM;AAAA,IACNL;AAAA,EAAA;AAEF,GC/EaQ,IAAc,CAAIC,GAAYC,MACnCA,EAAO,KAAK,CAACC,MAAUF,EAAM,SAASE,CAAK,CAAC;"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/components/ScrollToTop.tsx","../src/components/useLocalStorageState.tsx","../src/helpers/includesAny.ts"],"sourcesContent":["import { useLayoutEffect } from 'react';\nimport { useLocation } from 'react-router-dom';\n\nexport const ScrollToTop = (): null => {\n\tconst location = useLocation();\n\n\tuseLayoutEffect(() => {\n\t\twindow.scrollTo(0, 0);\n\t}, [location]);\n\n\treturn null;\n};\n","import type { IStateStore } from '@/stores/IStateStore';\nimport type { StateChangeEvent } from '@/stores/StateChangeEvent';\nimport { useCallback, useMemo } from 'react';\n\nimport type { IStateAccessor } from './IStateAccessor';\nimport type { IStateCodec } from './IStateCodec';\nimport { useStateHandler } from './useStateHandler';\n\nconst useLocalStorageStateDeserializer = (key: string): (() => unknown) => {\n\treturn useCallback((): unknown => {\n\t\ttry {\n\t\t\treturn JSON.parse(\n\t\t\t\twindow.localStorage.getItem(key) ?? JSON.stringify({}),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t\treturn {};\n\t\t}\n\t}, [key]);\n};\n\nconst useLocalStorageStateSerializer = <TState,>(\n\tkey: string,\n): ((state: TState) => void) => {\n\treturn useCallback(\n\t\t(state: TState): void => {\n\t\t\twindow.localStorage.setItem(key, JSON.stringify(state));\n\t\t},\n\t\t[key],\n\t);\n};\n\nconst useLocalStorageStateCodec = <TState,>(\n\tkey: string,\n): IStateCodec<TState> => {\n\tconst deserializer = useLocalStorageStateDeserializer(key);\n\tconst serializer = useLocalStorageStateSerializer(key);\n\tconst codec = useMemo(\n\t\t(): IStateCodec<TState> => ({\n\t\t\tdeserialize: deserializer,\n\t\t\tserialize: serializer,\n\t\t}),\n\t\t[deserializer, serializer],\n\t);\n\treturn codec;\n};\n\nconst useLocalStorageStateHandler = <TState,>(\n\tkey: string,\n\tvalidator: (state: unknown) => state is TState,\n\taccessor: IStateAccessor<TState>,\n\tonStateChange: ((event: StateChangeEvent<TState>) => void) | undefined,\n): void => {\n\tconst codec = useLocalStorageStateCodec(key);\n\tuseStateHandler(codec, validator, accessor, onStateChange);\n};\n\nconst useLocalStorageStateGetter = <TState,>(\n\tstore: IStateStore<TState>,\n): (() => TState) => {\n\treturn useCallback((): TState => store.state, [store]);\n};\n\nconst useLocalStorageStateSetter = <TState,>(\n\tstore: IStateStore<TState>,\n): ((state: TState) => void) => {\n\treturn useCallback(\n\t\t(state: TState): void => {\n\t\t\tstore.state = state;\n\t\t},\n\t\t[store],\n\t);\n};\n\nconst useLocalStorageStateAccessor = <TState,>(\n\tstore: IStateStore<TState>,\n): IStateAccessor<TState> => {\n\tconst getter = useLocalStorageStateGetter(store);\n\tconst setter = useLocalStorageStateSetter(store);\n\tconst accessor = useMemo(\n\t\t(): IStateAccessor<TState> => ({ get: getter, set: setter }),\n\t\t[getter, setter],\n\t);\n\treturn accessor;\n};\n\nexport const useLocalStorageState = <TState,>(\n\tkey: string,\n\tstore: IStateStore<TState>,\n): void => {\n\tconst accessor = useLocalStorageStateAccessor(store);\n\tuseLocalStorageStateHandler(\n\t\tkey,\n\t\tstore.validateState,\n\t\taccessor,\n\t\tstore.onStateChange,\n\t);\n};\n","export const includesAny = <T>(array: T[], values: T[]): boolean => {\n\treturn values.some((value) => array.includes(value));\n};\n"],"names":["ScrollToTop","location","useLocation","useLayoutEffect","useLocalStorageStateDeserializer","key","useCallback","error","useLocalStorageStateSerializer","state","useLocalStorageStateCodec","deserializer","serializer","useMemo","useLocalStorageStateHandler","validator","accessor","onStateChange","codec","useStateHandler","useLocalStorageStateGetter","store","useLocalStorageStateSetter","useLocalStorageStateAccessor","getter","setter","useLocalStorageState","includesAny","array","values","value"],"mappings":";;;AAGO,MAAMA,IAAc,MAAY;AACtC,QAAMC,IAAWC,EAAA;AAEjB,SAAAC,EAAgB,MAAM;AACrB,WAAO,SAAS,GAAG,CAAC;AAAA,EACrB,GAAG,CAACF,CAAQ,CAAC,GAEN;AACR,GCHMG,IAAmC,CAACC,MAClCC,EAAY,MAAe;AACjC,MAAI;AACH,WAAO,KAAK;AAAA,MACX,OAAO,aAAa,QAAQD,CAAG,KAAK,KAAK,UAAU,CAAA,CAAE;AAAA,IAAA;AAAA,EAEvD,SAASE,GAAO;AACf,mBAAQ,MAAMA,CAAK,GACZ,CAAA;AAAA,EACR;AACD,GAAG,CAACF,CAAG,CAAC,GAGHG,IAAiC,CACtCH,MAEOC;AAAA,EACN,CAACG,MAAwB;AACxB,WAAO,aAAa,QAAQJ,GAAK,KAAK,UAAUI,CAAK,CAAC;AAAA,EACvD;AAAA,EACA,CAACJ,CAAG;AAAA,GAIAK,IAA4B,CACjCL,MACyB;AACzB,QAAMM,IAAeP,EAAiCC,CAAG,GACnDO,IAAaJ,EAA+BH,CAAG;AAQrD,SAPcQ;AAAA,IACb,OAA4B;AAAA,MAC3B,aAAaF;AAAA,MACb,WAAWC;AAAA,IAAA;AAAA,IAEZ,CAACD,GAAcC,CAAU;AAAA,EAAA;AAG3B,GAEME,IAA8B,CACnCT,GACAU,GACAC,GACAC,MACU;AACV,QAAMC,IAAQR,EAA0BL,CAAG;AAC3C,EAAAc,EAAgBD,GAAOH,GAAWC,GAAUC,CAAa;AAC1D,GAEMG,IAA6B,CAClCC,MAEOf,EAAY,MAAce,EAAM,OAAO,CAACA,CAAK,CAAC,GAGhDC,IAA6B,CAClCD,MAEOf;AAAA,EACN,CAACG,MAAwB;AACxB,IAAAY,EAAM,QAAQZ;AAAA,EACf;AAAA,EACA,CAACY,CAAK;AAAA,GAIFE,IAA+B,CACpCF,MAC4B;AAC5B,QAAMG,IAASJ,EAA2BC,CAAK,GACzCI,IAASH,EAA2BD,CAAK;AAK/C,SAJiBR;AAAA,IAChB,OAA+B,EAAE,KAAKW,GAAQ,KAAKC,EAAA;AAAA,IACnD,CAACD,GAAQC,CAAM;AAAA,EAAA;AAGjB,GAEaC,IAAuB,CACnCrB,GACAgB,MACU;AACV,QAAML,IAAWO,EAA6BF,CAAK;AACnD,EAAAP;AAAA,IACCT;AAAA,IACAgB,EAAM;AAAA,IACNL;AAAA,IACAK,EAAM;AAAA,EAAA;AAER,GCjGaM,IAAc,CAAIC,GAAYC,MACnCA,EAAO,KAAK,CAACC,MAAUF,EAAM,SAASE,CAAK,CAAC;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("./useStateHandler-BKLDeBsK.cjs"),n=require("qs"),s=require("react"),c=require("react-router-dom"),l=()=>{const t=c.useLocation();return s.useCallback(()=>n.parse(t.search.slice(1)),[t])},S=()=>{const t=c.useNavigate();return s.useCallback(async e=>{const a=`?${n.stringify(e)}`;await t(a)},[t])},L=(t,e,a,o)=>{const r=l(),i=S();u.useStateHandler(r,t,e,a,o,i)},d=t=>s.useCallback(e=>{t.state=e},[t]),b=t=>s.useCallback(()=>t.state,[t]),g=t=>{const e=d(t),a=b(t);L(t.validateState,e,t.onStateChange,a)};exports.useLocationState=g;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./useStateHandler-B54QKldW.cjs"),o=require("qs"),s=require("react"),n=require("react-router-dom"),i=()=>{const e=n.useLocation();return s.useCallback(()=>o.parse(e.search.slice(1)),[e])},u=()=>{const e=n.useNavigate();return s.useCallback(async t=>{const a=`?${o.stringify(t)}`;await e(a)},[e])},l=()=>{const e=i(),t=u();return s.useMemo(()=>({deserialize:e,serialize:t}),[e,t])},S=(e,t,a)=>{const c=l();r.useStateHandler(c,e,t,a)},d=e=>s.useCallback(()=>e.state,[e]),L=e=>s.useCallback(t=>{e.state=t},[e]),g=e=>{const t=d(e),a=L(e);return s.useMemo(()=>({get:t,set:a}),[t,a])},b=e=>{const t=g(e);S(e.validateState,t,e.onStateChange)};exports.useLocationState=b;
2
2
  //# sourceMappingURL=react-router.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"react-router.cjs.js","sources":["../src/react-router/useLocationState.tsx"],"sourcesContent":["import { useStateHandler } from '@/components/useStateHandler';\nimport type { IStateStore } from '@/stores/IStateStore';\nimport type { StateChangeEvent } from '@/stores/StateChangeEvent';\nimport { type ParsedQs, parse, stringify } from 'qs';\nimport { useCallback } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\n\nconst useLocationStateDeserializer = (): (() => ParsedQs) => {\n\tconst location = useLocation();\n\n\t// Pass `location` as deps instead of `location.search`.\n\treturn useCallback(\n\t\t(): ParsedQs => parse(location.search.slice(1)),\n\t\t[location],\n\t);\n};\n\nconst useLocationStateSerializer = <TState,>(): ((state: TState) => void) => {\n\tconst navigate = useNavigate();\n\n\treturn useCallback(\n\t\tasync (state: TState): Promise<void> => {\n\t\t\tconst newUrl = `?${stringify(state)}`;\n\t\t\tawait navigate(newUrl);\n\t\t},\n\t\t[navigate],\n\t);\n};\n\n/** Updates a store that implements the {@link LocationStateStore} interface when a route changes, and vice versa. */\nconst useLocationStateHandler = <TState,>(\n\tstateValidator: (state: any) => state is TState,\n\tstateSetter: (state: TState) => void,\n\tonStateChange: ((event: StateChangeEvent<TState>) => void) | undefined,\n\tstateGetter: () => TState,\n): void => {\n\tconst deserializer = useLocationStateDeserializer();\n\tconst serializer = useLocationStateSerializer();\n\tuseStateHandler(\n\t\tdeserializer,\n\t\tstateValidator,\n\t\tstateSetter,\n\t\tonStateChange,\n\t\tstateGetter,\n\t\tserializer,\n\t);\n};\n\nconst useLocationStateSetter = <TState,>(\n\tstore: IStateStore<TState>,\n): ((state: TState) => void) => {\n\treturn useCallback(\n\t\t(state: TState): void => {\n\t\t\tstore.state = state;\n\t\t},\n\t\t[store],\n\t);\n};\n\nconst useLocationStateGetter = <TState,>(\n\tstore: IStateStore<TState>,\n): (() => TState) => {\n\treturn useCallback((): TState => store.state, [store]);\n};\n\n/** Updates a store that implements the {@link LocationStateStore} interface when a route changes, and vice versa. */\nexport const useLocationState = <TState,>(store: IStateStore<TState>): void => {\n\tconst stateSetter = useLocationStateSetter(store);\n\tconst stateGetter = useLocationStateGetter(store);\n\tuseLocationStateHandler(\n\t\tstore.validateState,\n\t\tstateSetter,\n\t\tstore.onStateChange,\n\t\tstateGetter,\n\t);\n};\n"],"names":["useLocationStateDeserializer","location","useLocation","useCallback","parse","useLocationStateSerializer","navigate","useNavigate","state","newUrl","stringify","useLocationStateHandler","stateValidator","stateSetter","onStateChange","stateGetter","deserializer","serializer","useStateHandler","useLocationStateSetter","store","useLocationStateGetter","useLocationState"],"mappings":"mMAOMA,EAA+B,IAAwB,CAC5D,MAAMC,EAAWC,EAAAA,YAAA,EAGjB,OAAOC,EAAAA,YACN,IAAgBC,EAAAA,MAAMH,EAAS,OAAO,MAAM,CAAC,CAAC,EAC9C,CAACA,CAAQ,CAAA,CAEX,EAEMI,EAA6B,IAA0C,CAC5E,MAAMC,EAAWC,EAAAA,YAAA,EAEjB,OAAOJ,EAAAA,YACN,MAAOK,GAAiC,CACvC,MAAMC,EAAS,IAAIC,EAAAA,UAAUF,CAAK,CAAC,GACnC,MAAMF,EAASG,CAAM,CACtB,EACA,CAACH,CAAQ,CAAA,CAEX,EAGMK,EAA0B,CAC/BC,EACAC,EACAC,EACAC,IACU,CACV,MAAMC,EAAehB,EAAA,EACfiB,EAAaZ,EAAA,EACnBa,EAAAA,gBACCF,EACAJ,EACAC,EACAC,EACAC,EACAE,CAAA,CAEF,EAEME,EACLC,GAEOjB,EAAAA,YACLK,GAAwB,CACxBY,EAAM,MAAQZ,CACf,EACA,CAACY,CAAK,CAAA,EAIFC,EACLD,GAEOjB,EAAAA,YAAY,IAAciB,EAAM,MAAO,CAACA,CAAK,CAAC,EAIzCE,EAA6BF,GAAqC,CAC9E,MAAMP,EAAcM,EAAuBC,CAAK,EAC1CL,EAAcM,EAAuBD,CAAK,EAChDT,EACCS,EAAM,cACNP,EACAO,EAAM,cACNL,CAAA,CAEF"}
1
+ {"version":3,"file":"react-router.cjs.js","sources":["../src/react-router/useLocationState.tsx"],"sourcesContent":["import type { IStateAccessor } from '@/components/IStateAccessor';\nimport type { IStateCodec } from '@/components/IStateCodec';\nimport { useStateHandler } from '@/components/useStateHandler';\nimport type { IStateStore } from '@/stores/IStateStore';\nimport type { StateChangeEvent } from '@/stores/StateChangeEvent';\nimport { type ParsedQs, parse, stringify } from 'qs';\nimport { useCallback, useMemo } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\n\nconst useLocationStateDeserializer = (): (() => ParsedQs) => {\n\tconst location = useLocation();\n\n\t// Pass `location` as deps instead of `location.search`.\n\treturn useCallback(\n\t\t(): ParsedQs => parse(location.search.slice(1)),\n\t\t[location],\n\t);\n};\n\nconst useLocationStateSerializer = <TState,>(): ((state: TState) => void) => {\n\tconst navigate = useNavigate();\n\n\treturn useCallback(\n\t\tasync (state: TState): Promise<void> => {\n\t\t\tconst newUrl = `?${stringify(state)}`;\n\t\t\tawait navigate(newUrl);\n\t\t},\n\t\t[navigate],\n\t);\n};\n\nconst useLocationStateCodec = <TState,>(): IStateCodec<TState> => {\n\tconst deserializer = useLocationStateDeserializer();\n\tconst serializer = useLocationStateSerializer();\n\tconst codec = useMemo(\n\t\t(): IStateCodec<TState> => ({\n\t\t\tdeserialize: deserializer,\n\t\t\tserialize: serializer,\n\t\t}),\n\t\t[deserializer, serializer],\n\t);\n\treturn codec;\n};\n\n/** Updates a store that implements the {@link LocationStateStore} interface when a route changes, and vice versa. */\nconst useLocationStateHandler = <TState,>(\n\tvalidator: (state: unknown) => state is TState,\n\taccessor: IStateAccessor<TState>,\n\tonStateChange: ((event: StateChangeEvent<TState>) => void) | undefined,\n): void => {\n\tconst codec = useLocationStateCodec();\n\tuseStateHandler(codec, validator, accessor, onStateChange);\n};\n\nconst useLocationStateGetter = <TState,>(\n\tstore: IStateStore<TState>,\n): (() => TState) => {\n\treturn useCallback((): TState => store.state, [store]);\n};\n\nconst useLocationStateSetter = <TState,>(\n\tstore: IStateStore<TState>,\n): ((state: TState) => void) => {\n\treturn useCallback(\n\t\t(state: TState): void => {\n\t\t\tstore.state = state;\n\t\t},\n\t\t[store],\n\t);\n};\n\nconst useLocationStateAccessor = <TState,>(\n\tstore: IStateStore<TState>,\n): IStateAccessor<TState> => {\n\tconst getter = useLocationStateGetter(store);\n\tconst setter = useLocationStateSetter(store);\n\tconst accessor = useMemo(\n\t\t(): IStateAccessor<TState> => ({ get: getter, set: setter }),\n\t\t[getter, setter],\n\t);\n\treturn accessor;\n};\n\n/** Updates a store that implements the {@link LocationStateStore} interface when a route changes, and vice versa. */\nexport const useLocationState = <TState,>(store: IStateStore<TState>): void => {\n\tconst accessor = useLocationStateAccessor(store);\n\tuseLocationStateHandler(store.validateState, accessor, store.onStateChange);\n};\n"],"names":["useLocationStateDeserializer","location","useLocation","useCallback","parse","useLocationStateSerializer","navigate","useNavigate","state","newUrl","stringify","useLocationStateCodec","deserializer","serializer","useMemo","useLocationStateHandler","validator","accessor","onStateChange","codec","useStateHandler","useLocationStateGetter","store","useLocationStateSetter","useLocationStateAccessor","getter","setter","useLocationState"],"mappings":"mMASMA,EAA+B,IAAwB,CAC5D,MAAMC,EAAWC,EAAAA,YAAA,EAGjB,OAAOC,EAAAA,YACN,IAAgBC,EAAAA,MAAMH,EAAS,OAAO,MAAM,CAAC,CAAC,EAC9C,CAACA,CAAQ,CAAA,CAEX,EAEMI,EAA6B,IAA0C,CAC5E,MAAMC,EAAWC,EAAAA,YAAA,EAEjB,OAAOJ,EAAAA,YACN,MAAOK,GAAiC,CACvC,MAAMC,EAAS,IAAIC,EAAAA,UAAUF,CAAK,CAAC,GACnC,MAAMF,EAASG,CAAM,CACtB,EACA,CAACH,CAAQ,CAAA,CAEX,EAEMK,EAAwB,IAAoC,CACjE,MAAMC,EAAeZ,EAAA,EACfa,EAAaR,EAAA,EAQnB,OAPcS,EAAAA,QACb,KAA4B,CAC3B,YAAaF,EACb,UAAWC,CAAA,GAEZ,CAACD,EAAcC,CAAU,CAAA,CAG3B,EAGME,EAA0B,CAC/BC,EACAC,EACAC,IACU,CACV,MAAMC,EAAQR,EAAA,EACdS,EAAAA,gBAAgBD,EAAOH,EAAWC,EAAUC,CAAa,CAC1D,EAEMG,EACLC,GAEOnB,EAAAA,YAAY,IAAcmB,EAAM,MAAO,CAACA,CAAK,CAAC,EAGhDC,EACLD,GAEOnB,EAAAA,YACLK,GAAwB,CACxBc,EAAM,MAAQd,CACf,EACA,CAACc,CAAK,CAAA,EAIFE,EACLF,GAC4B,CAC5B,MAAMG,EAASJ,EAAuBC,CAAK,EACrCI,EAASH,EAAuBD,CAAK,EAK3C,OAJiBR,EAAAA,QAChB,KAA+B,CAAE,IAAKW,EAAQ,IAAKC,CAAA,GACnD,CAACD,EAAQC,CAAM,CAAA,CAGjB,EAGaC,EAA6BL,GAAqC,CAC9E,MAAML,EAAWO,EAAyBF,CAAK,EAC/CP,EAAwBO,EAAM,cAAeL,EAAUK,EAAM,aAAa,CAC3E"}
@@ -1,45 +1,48 @@
1
- import { u as i } from "./useStateHandler-CdocwC8x.js";
2
- import { parse as c, stringify as u } from "qs";
3
- import { useCallback as o } from "react";
4
- import { useLocation as l, useNavigate as S } from "react-router-dom";
5
- const m = () => {
6
- const t = l();
7
- return o(
8
- () => c(t.search.slice(1)),
1
+ import { u as n } from "./useStateHandler-Cmr_YOo4.js";
2
+ import { parse as r, stringify as i } from "qs";
3
+ import { useMemo as c, useCallback as s } from "react";
4
+ import { useLocation as u, useNavigate as l } from "react-router-dom";
5
+ const S = () => {
6
+ const t = u();
7
+ return s(
8
+ () => r(t.search.slice(1)),
9
9
  [t]
10
10
  );
11
- }, L = () => {
12
- const t = S();
13
- return o(
11
+ }, d = () => {
12
+ const t = l();
13
+ return s(
14
14
  async (e) => {
15
- const a = `?${u(e)}`;
16
- await t(a);
15
+ const o = `?${i(e)}`;
16
+ await t(o);
17
17
  },
18
18
  [t]
19
19
  );
20
- }, p = (t, e, a, n) => {
21
- const s = m(), r = L();
22
- i(
23
- s,
24
- t,
25
- e,
26
- a,
27
- n,
28
- r
20
+ }, m = () => {
21
+ const t = S(), e = d();
22
+ return c(
23
+ () => ({
24
+ deserialize: t,
25
+ serialize: e
26
+ }),
27
+ [t, e]
29
28
  );
30
- }, f = (t) => o(
29
+ }, L = (t, e, o) => {
30
+ const a = m();
31
+ n(a, t, e, o);
32
+ }, g = (t) => s(() => t.state, [t]), p = (t) => s(
31
33
  (e) => {
32
34
  t.state = e;
33
35
  },
34
36
  [t]
35
- ), d = (t) => o(() => t.state, [t]), w = (t) => {
36
- const e = f(t), a = d(t);
37
- p(
38
- t.validateState,
39
- e,
40
- t.onStateChange,
41
- a
37
+ ), z = (t) => {
38
+ const e = g(t), o = p(t);
39
+ return c(
40
+ () => ({ get: e, set: o }),
41
+ [e, o]
42
42
  );
43
+ }, w = (t) => {
44
+ const e = z(t);
45
+ L(t.validateState, e, t.onStateChange);
43
46
  };
44
47
  export {
45
48
  w as useLocationState
@@ -1 +1 @@
1
- {"version":3,"file":"react-router.es.js","sources":["../src/react-router/useLocationState.tsx"],"sourcesContent":["import { useStateHandler } from '@/components/useStateHandler';\nimport type { IStateStore } from '@/stores/IStateStore';\nimport type { StateChangeEvent } from '@/stores/StateChangeEvent';\nimport { type ParsedQs, parse, stringify } from 'qs';\nimport { useCallback } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\n\nconst useLocationStateDeserializer = (): (() => ParsedQs) => {\n\tconst location = useLocation();\n\n\t// Pass `location` as deps instead of `location.search`.\n\treturn useCallback(\n\t\t(): ParsedQs => parse(location.search.slice(1)),\n\t\t[location],\n\t);\n};\n\nconst useLocationStateSerializer = <TState,>(): ((state: TState) => void) => {\n\tconst navigate = useNavigate();\n\n\treturn useCallback(\n\t\tasync (state: TState): Promise<void> => {\n\t\t\tconst newUrl = `?${stringify(state)}`;\n\t\t\tawait navigate(newUrl);\n\t\t},\n\t\t[navigate],\n\t);\n};\n\n/** Updates a store that implements the {@link LocationStateStore} interface when a route changes, and vice versa. */\nconst useLocationStateHandler = <TState,>(\n\tstateValidator: (state: any) => state is TState,\n\tstateSetter: (state: TState) => void,\n\tonStateChange: ((event: StateChangeEvent<TState>) => void) | undefined,\n\tstateGetter: () => TState,\n): void => {\n\tconst deserializer = useLocationStateDeserializer();\n\tconst serializer = useLocationStateSerializer();\n\tuseStateHandler(\n\t\tdeserializer,\n\t\tstateValidator,\n\t\tstateSetter,\n\t\tonStateChange,\n\t\tstateGetter,\n\t\tserializer,\n\t);\n};\n\nconst useLocationStateSetter = <TState,>(\n\tstore: IStateStore<TState>,\n): ((state: TState) => void) => {\n\treturn useCallback(\n\t\t(state: TState): void => {\n\t\t\tstore.state = state;\n\t\t},\n\t\t[store],\n\t);\n};\n\nconst useLocationStateGetter = <TState,>(\n\tstore: IStateStore<TState>,\n): (() => TState) => {\n\treturn useCallback((): TState => store.state, [store]);\n};\n\n/** Updates a store that implements the {@link LocationStateStore} interface when a route changes, and vice versa. */\nexport const useLocationState = <TState,>(store: IStateStore<TState>): void => {\n\tconst stateSetter = useLocationStateSetter(store);\n\tconst stateGetter = useLocationStateGetter(store);\n\tuseLocationStateHandler(\n\t\tstore.validateState,\n\t\tstateSetter,\n\t\tstore.onStateChange,\n\t\tstateGetter,\n\t);\n};\n"],"names":["useLocationStateDeserializer","location","useLocation","useCallback","parse","useLocationStateSerializer","navigate","useNavigate","state","newUrl","stringify","useLocationStateHandler","stateValidator","stateSetter","onStateChange","stateGetter","deserializer","serializer","useStateHandler","useLocationStateSetter","store","useLocationStateGetter","useLocationState"],"mappings":";;;;AAOA,MAAMA,IAA+B,MAAwB;AAC5D,QAAMC,IAAWC,EAAA;AAGjB,SAAOC;AAAA,IACN,MAAgBC,EAAMH,EAAS,OAAO,MAAM,CAAC,CAAC;AAAA,IAC9C,CAACA,CAAQ;AAAA,EAAA;AAEX,GAEMI,IAA6B,MAA0C;AAC5E,QAAMC,IAAWC,EAAA;AAEjB,SAAOJ;AAAA,IACN,OAAOK,MAAiC;AACvC,YAAMC,IAAS,IAAIC,EAAUF,CAAK,CAAC;AACnC,YAAMF,EAASG,CAAM;AAAA,IACtB;AAAA,IACA,CAACH,CAAQ;AAAA,EAAA;AAEX,GAGMK,IAA0B,CAC/BC,GACAC,GACAC,GACAC,MACU;AACV,QAAMC,IAAehB,EAAA,GACfiB,IAAaZ,EAAA;AACnB,EAAAa;AAAA,IACCF;AAAA,IACAJ;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAE;AAAA,EAAA;AAEF,GAEME,IAAyB,CAC9BC,MAEOjB;AAAA,EACN,CAACK,MAAwB;AACxB,IAAAY,EAAM,QAAQZ;AAAA,EACf;AAAA,EACA,CAACY,CAAK;AAAA,GAIFC,IAAyB,CAC9BD,MAEOjB,EAAY,MAAciB,EAAM,OAAO,CAACA,CAAK,CAAC,GAIzCE,IAAmB,CAAUF,MAAqC;AAC9E,QAAMP,IAAcM,EAAuBC,CAAK,GAC1CL,IAAcM,EAAuBD,CAAK;AAChD,EAAAT;AAAA,IACCS,EAAM;AAAA,IACNP;AAAA,IACAO,EAAM;AAAA,IACNL;AAAA,EAAA;AAEF;"}
1
+ {"version":3,"file":"react-router.es.js","sources":["../src/react-router/useLocationState.tsx"],"sourcesContent":["import type { IStateAccessor } from '@/components/IStateAccessor';\nimport type { IStateCodec } from '@/components/IStateCodec';\nimport { useStateHandler } from '@/components/useStateHandler';\nimport type { IStateStore } from '@/stores/IStateStore';\nimport type { StateChangeEvent } from '@/stores/StateChangeEvent';\nimport { type ParsedQs, parse, stringify } from 'qs';\nimport { useCallback, useMemo } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\n\nconst useLocationStateDeserializer = (): (() => ParsedQs) => {\n\tconst location = useLocation();\n\n\t// Pass `location` as deps instead of `location.search`.\n\treturn useCallback(\n\t\t(): ParsedQs => parse(location.search.slice(1)),\n\t\t[location],\n\t);\n};\n\nconst useLocationStateSerializer = <TState,>(): ((state: TState) => void) => {\n\tconst navigate = useNavigate();\n\n\treturn useCallback(\n\t\tasync (state: TState): Promise<void> => {\n\t\t\tconst newUrl = `?${stringify(state)}`;\n\t\t\tawait navigate(newUrl);\n\t\t},\n\t\t[navigate],\n\t);\n};\n\nconst useLocationStateCodec = <TState,>(): IStateCodec<TState> => {\n\tconst deserializer = useLocationStateDeserializer();\n\tconst serializer = useLocationStateSerializer();\n\tconst codec = useMemo(\n\t\t(): IStateCodec<TState> => ({\n\t\t\tdeserialize: deserializer,\n\t\t\tserialize: serializer,\n\t\t}),\n\t\t[deserializer, serializer],\n\t);\n\treturn codec;\n};\n\n/** Updates a store that implements the {@link LocationStateStore} interface when a route changes, and vice versa. */\nconst useLocationStateHandler = <TState,>(\n\tvalidator: (state: unknown) => state is TState,\n\taccessor: IStateAccessor<TState>,\n\tonStateChange: ((event: StateChangeEvent<TState>) => void) | undefined,\n): void => {\n\tconst codec = useLocationStateCodec();\n\tuseStateHandler(codec, validator, accessor, onStateChange);\n};\n\nconst useLocationStateGetter = <TState,>(\n\tstore: IStateStore<TState>,\n): (() => TState) => {\n\treturn useCallback((): TState => store.state, [store]);\n};\n\nconst useLocationStateSetter = <TState,>(\n\tstore: IStateStore<TState>,\n): ((state: TState) => void) => {\n\treturn useCallback(\n\t\t(state: TState): void => {\n\t\t\tstore.state = state;\n\t\t},\n\t\t[store],\n\t);\n};\n\nconst useLocationStateAccessor = <TState,>(\n\tstore: IStateStore<TState>,\n): IStateAccessor<TState> => {\n\tconst getter = useLocationStateGetter(store);\n\tconst setter = useLocationStateSetter(store);\n\tconst accessor = useMemo(\n\t\t(): IStateAccessor<TState> => ({ get: getter, set: setter }),\n\t\t[getter, setter],\n\t);\n\treturn accessor;\n};\n\n/** Updates a store that implements the {@link LocationStateStore} interface when a route changes, and vice versa. */\nexport const useLocationState = <TState,>(store: IStateStore<TState>): void => {\n\tconst accessor = useLocationStateAccessor(store);\n\tuseLocationStateHandler(store.validateState, accessor, store.onStateChange);\n};\n"],"names":["useLocationStateDeserializer","location","useLocation","useCallback","parse","useLocationStateSerializer","navigate","useNavigate","state","newUrl","stringify","useLocationStateCodec","deserializer","serializer","useMemo","useLocationStateHandler","validator","accessor","onStateChange","codec","useStateHandler","useLocationStateGetter","store","useLocationStateSetter","useLocationStateAccessor","getter","setter","useLocationState"],"mappings":";;;;AASA,MAAMA,IAA+B,MAAwB;AAC5D,QAAMC,IAAWC,EAAA;AAGjB,SAAOC;AAAA,IACN,MAAgBC,EAAMH,EAAS,OAAO,MAAM,CAAC,CAAC;AAAA,IAC9C,CAACA,CAAQ;AAAA,EAAA;AAEX,GAEMI,IAA6B,MAA0C;AAC5E,QAAMC,IAAWC,EAAA;AAEjB,SAAOJ;AAAA,IACN,OAAOK,MAAiC;AACvC,YAAMC,IAAS,IAAIC,EAAUF,CAAK,CAAC;AACnC,YAAMF,EAASG,CAAM;AAAA,IACtB;AAAA,IACA,CAACH,CAAQ;AAAA,EAAA;AAEX,GAEMK,IAAwB,MAAoC;AACjE,QAAMC,IAAeZ,EAAA,GACfa,IAAaR,EAAA;AAQnB,SAPcS;AAAA,IACb,OAA4B;AAAA,MAC3B,aAAaF;AAAA,MACb,WAAWC;AAAA,IAAA;AAAA,IAEZ,CAACD,GAAcC,CAAU;AAAA,EAAA;AAG3B,GAGME,IAA0B,CAC/BC,GACAC,GACAC,MACU;AACV,QAAMC,IAAQR,EAAA;AACd,EAAAS,EAAgBD,GAAOH,GAAWC,GAAUC,CAAa;AAC1D,GAEMG,IAAyB,CAC9BC,MAEOnB,EAAY,MAAcmB,EAAM,OAAO,CAACA,CAAK,CAAC,GAGhDC,IAAyB,CAC9BD,MAEOnB;AAAA,EACN,CAACK,MAAwB;AACxB,IAAAc,EAAM,QAAQd;AAAA,EACf;AAAA,EACA,CAACc,CAAK;AAAA,GAIFE,IAA2B,CAChCF,MAC4B;AAC5B,QAAMG,IAASJ,EAAuBC,CAAK,GACrCI,IAASH,EAAuBD,CAAK;AAK3C,SAJiBR;AAAA,IAChB,OAA+B,EAAE,KAAKW,GAAQ,KAAKC,EAAA;AAAA,IACnD,CAACD,GAAQC,CAAM;AAAA,EAAA;AAGjB,GAGaC,IAAmB,CAAUL,MAAqC;AAC9E,QAAML,IAAWO,EAAyBF,CAAK;AAC/C,EAAAP,EAAwBO,EAAM,eAAeL,GAAUK,EAAM,aAAa;AAC3E;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("./useStateHandler-BKLDeBsK.cjs"),n=require("@tanstack/react-router"),u=require("qs"),a=require("react"),l=()=>{const e=n.useLocation();return a.useCallback(()=>u.parse(e.searchStr.slice(1)),[e])},S=()=>{const e=n.useNavigate();return a.useCallback(async t=>{await e({search:t})},[e])},L=(e,t,s,c)=>{const r=l(),o=S();i.useStateHandler(r,e,t,s,c,o)},d=e=>a.useCallback(t=>{e.state=t},[e]),b=e=>a.useCallback(()=>e.state,[e]),g=e=>{const t=d(e),s=b(e);L(e.validateState,t,e.onStateChange,s)};exports.useLocationState=g;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("./useStateHandler-B54QKldW.cjs"),o=require("@tanstack/react-router"),r=require("qs"),a=require("react"),i=()=>{const e=o.useLocation();return a.useCallback(()=>r.parse(e.searchStr.slice(1)),[e])},u=()=>{const e=o.useNavigate();return a.useCallback(async t=>{await e({search:t})},[e])},l=()=>{const e=i(),t=u();return a.useMemo(()=>({deserialize:e,serialize:t}),[e,t])},S=(e,t,s)=>{const c=l();n.useStateHandler(c,e,t,s)},d=e=>a.useCallback(()=>e.state,[e]),L=e=>a.useCallback(t=>{e.state=t},[e]),g=e=>{const t=d(e),s=L(e);return a.useMemo(()=>({get:t,set:s}),[t,s])},b=e=>{const t=g(e);S(e.validateState,t,e.onStateChange)};exports.useLocationState=b;
2
2
  //# sourceMappingURL=tanstack-router.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tanstack-router.cjs.js","sources":["../src/tanstack-router/useLocationState.tsx"],"sourcesContent":["import { useStateHandler } from '@/components/useStateHandler';\nimport type { IStateStore } from '@/stores/IStateStore';\nimport type { StateChangeEvent } from '@/stores/StateChangeEvent';\nimport { useLocation, useNavigate } from '@tanstack/react-router';\nimport { type ParsedQs, parse } from 'qs';\nimport { useCallback } from 'react';\n\nconst useLocationStateDeserializer = (): (() => ParsedQs) => {\n\tconst location = useLocation();\n\n\t// Pass `location` as deps instead of `location.search`.\n\treturn useCallback(\n\t\t(): ParsedQs => parse(location.searchStr.slice(1)),\n\t\t[location],\n\t);\n};\n\nconst useLocationStateSerializer = <TState,>(): ((state: TState) => void) => {\n\tconst navigate = useNavigate();\n\n\treturn useCallback(\n\t\tasync (state: TState): Promise<void> => {\n\t\t\tawait navigate({ search: state as any /* FIXME */ });\n\t\t},\n\t\t[navigate],\n\t);\n};\n\n/** Updates a store that implements the {@link LocationStateStore} interface when a route changes, and vice versa. */\nconst useLocationStateHandler = <TState,>(\n\tstateValidator: (state: any) => state is TState,\n\tstateSetter: (state: TState) => void,\n\tonStateChange: ((event: StateChangeEvent<TState>) => void) | undefined,\n\tstateGetter: () => TState,\n): void => {\n\tconst deserializer = useLocationStateDeserializer();\n\tconst serializer = useLocationStateSerializer();\n\tuseStateHandler(\n\t\tdeserializer,\n\t\tstateValidator,\n\t\tstateSetter,\n\t\tonStateChange,\n\t\tstateGetter,\n\t\tserializer,\n\t);\n};\n\nconst useLocationStateSetter = <TState,>(\n\tstore: IStateStore<TState>,\n): ((state: TState) => void) => {\n\treturn useCallback(\n\t\t(state: TState) => {\n\t\t\tstore.state = state;\n\t\t},\n\t\t[store],\n\t);\n};\n\nconst useLocationStateGetter = <TState,>(\n\tstore: IStateStore<TState>,\n): (() => TState) => {\n\treturn useCallback(() => store.state, [store]);\n};\n\n/** Updates a store that implements the {@link LocationStateStore} interface when a route changes, and vice versa. */\nexport const useLocationState = <TState,>(store: IStateStore<TState>): void => {\n\tconst stateSetter = useLocationStateSetter(store);\n\tconst stateGetter = useLocationStateGetter(store);\n\tuseLocationStateHandler(\n\t\tstore.validateState,\n\t\tstateSetter,\n\t\tstore.onStateChange,\n\t\tstateGetter,\n\t);\n};\n"],"names":["useLocationStateDeserializer","location","useLocation","useCallback","parse","useLocationStateSerializer","navigate","useNavigate","state","useLocationStateHandler","stateValidator","stateSetter","onStateChange","stateGetter","deserializer","serializer","useStateHandler","useLocationStateSetter","store","useLocationStateGetter","useLocationState"],"mappings":"yMAOMA,EAA+B,IAAwB,CAC5D,MAAMC,EAAWC,EAAAA,YAAA,EAGjB,OAAOC,EAAAA,YACN,IAAgBC,EAAAA,MAAMH,EAAS,UAAU,MAAM,CAAC,CAAC,EACjD,CAACA,CAAQ,CAAA,CAEX,EAEMI,EAA6B,IAA0C,CAC5E,MAAMC,EAAWC,EAAAA,YAAA,EAEjB,OAAOJ,EAAAA,YACN,MAAOK,GAAiC,CACvC,MAAMF,EAAS,CAAE,OAAQE,CAAA,CAA0B,CACpD,EACA,CAACF,CAAQ,CAAA,CAEX,EAGMG,EAA0B,CAC/BC,EACAC,EACAC,EACAC,IACU,CACV,MAAMC,EAAed,EAAA,EACfe,EAAaV,EAAA,EACnBW,EAAAA,gBACCF,EACAJ,EACAC,EACAC,EACAC,EACAE,CAAA,CAEF,EAEME,EACLC,GAEOf,EAAAA,YACLK,GAAkB,CAClBU,EAAM,MAAQV,CACf,EACA,CAACU,CAAK,CAAA,EAIFC,EACLD,GAEOf,EAAAA,YAAY,IAAMe,EAAM,MAAO,CAACA,CAAK,CAAC,EAIjCE,EAA6BF,GAAqC,CAC9E,MAAMP,EAAcM,EAAuBC,CAAK,EAC1CL,EAAcM,EAAuBD,CAAK,EAChDT,EACCS,EAAM,cACNP,EACAO,EAAM,cACNL,CAAA,CAEF"}
1
+ {"version":3,"file":"tanstack-router.cjs.js","sources":["../src/tanstack-router/useLocationState.tsx"],"sourcesContent":["import type { IStateAccessor } from '@/components/IStateAccessor';\nimport type { IStateCodec } from '@/components/IStateCodec';\nimport { useStateHandler } from '@/components/useStateHandler';\nimport type { IStateStore } from '@/stores/IStateStore';\nimport type { StateChangeEvent } from '@/stores/StateChangeEvent';\nimport { useLocation, useNavigate } from '@tanstack/react-router';\nimport { type ParsedQs, parse } from 'qs';\nimport { useCallback, useMemo } from 'react';\n\nconst useLocationStateDeserializer = (): (() => ParsedQs) => {\n\tconst location = useLocation();\n\n\t// Pass `location` as deps instead of `location.search`.\n\treturn useCallback(\n\t\t(): ParsedQs => parse(location.searchStr.slice(1)),\n\t\t[location],\n\t);\n};\n\nconst useLocationStateSerializer = <TState,>(): ((state: TState) => void) => {\n\tconst navigate = useNavigate();\n\n\treturn useCallback(\n\t\tasync (state: TState): Promise<void> => {\n\t\t\tawait navigate({ search: state as any /* FIXME */ });\n\t\t},\n\t\t[navigate],\n\t);\n};\n\nconst useLocationStateCodec = <TState,>(): IStateCodec<TState> => {\n\tconst deserializer = useLocationStateDeserializer();\n\tconst serializer = useLocationStateSerializer();\n\tconst codec = useMemo(\n\t\t(): IStateCodec<TState> => ({\n\t\t\tdeserialize: deserializer,\n\t\t\tserialize: serializer,\n\t\t}),\n\t\t[deserializer, serializer],\n\t);\n\treturn codec;\n};\n\n/** Updates a store that implements the {@link LocationStateStore} interface when a route changes, and vice versa. */\nconst useLocationStateHandler = <TState,>(\n\tvalidator: (state: unknown) => state is TState,\n\taccessor: IStateAccessor<TState>,\n\tonStateChange: ((event: StateChangeEvent<TState>) => void) | undefined,\n): void => {\n\tconst codec = useLocationStateCodec();\n\tuseStateHandler(codec, validator, accessor, onStateChange);\n};\n\nconst useLocationStateGetter = <TState,>(\n\tstore: IStateStore<TState>,\n): (() => TState) => {\n\treturn useCallback(() => store.state, [store]);\n};\n\nconst useLocationStateSetter = <TState,>(\n\tstore: IStateStore<TState>,\n): ((state: TState) => void) => {\n\treturn useCallback(\n\t\t(state: TState) => {\n\t\t\tstore.state = state;\n\t\t},\n\t\t[store],\n\t);\n};\n\nconst useLocationStateAccessor = <TState,>(\n\tstore: IStateStore<TState>,\n): IStateAccessor<TState> => {\n\tconst getter = useLocationStateGetter(store);\n\tconst setter = useLocationStateSetter(store);\n\tconst accessor = useMemo(\n\t\t(): IStateAccessor<TState> => ({ get: getter, set: setter }),\n\t\t[getter, setter],\n\t);\n\treturn accessor;\n};\n\n/** Updates a store that implements the {@link LocationStateStore} interface when a route changes, and vice versa. */\nexport const useLocationState = <TState,>(store: IStateStore<TState>): void => {\n\tconst accessor = useLocationStateAccessor(store);\n\tuseLocationStateHandler(store.validateState, accessor, store.onStateChange);\n};\n"],"names":["useLocationStateDeserializer","location","useLocation","useCallback","parse","useLocationStateSerializer","navigate","useNavigate","state","useLocationStateCodec","deserializer","serializer","useMemo","useLocationStateHandler","validator","accessor","onStateChange","codec","useStateHandler","useLocationStateGetter","store","useLocationStateSetter","useLocationStateAccessor","getter","setter","useLocationState"],"mappings":"yMASMA,EAA+B,IAAwB,CAC5D,MAAMC,EAAWC,EAAAA,YAAA,EAGjB,OAAOC,EAAAA,YACN,IAAgBC,EAAAA,MAAMH,EAAS,UAAU,MAAM,CAAC,CAAC,EACjD,CAACA,CAAQ,CAAA,CAEX,EAEMI,EAA6B,IAA0C,CAC5E,MAAMC,EAAWC,EAAAA,YAAA,EAEjB,OAAOJ,EAAAA,YACN,MAAOK,GAAiC,CACvC,MAAMF,EAAS,CAAE,OAAQE,CAAA,CAA0B,CACpD,EACA,CAACF,CAAQ,CAAA,CAEX,EAEMG,EAAwB,IAAoC,CACjE,MAAMC,EAAeV,EAAA,EACfW,EAAaN,EAAA,EAQnB,OAPcO,EAAAA,QACb,KAA4B,CAC3B,YAAaF,EACb,UAAWC,CAAA,GAEZ,CAACD,EAAcC,CAAU,CAAA,CAG3B,EAGME,EAA0B,CAC/BC,EACAC,EACAC,IACU,CACV,MAAMC,EAAQR,EAAA,EACdS,EAAAA,gBAAgBD,EAAOH,EAAWC,EAAUC,CAAa,CAC1D,EAEMG,EACLC,GAEOjB,EAAAA,YAAY,IAAMiB,EAAM,MAAO,CAACA,CAAK,CAAC,EAGxCC,EACLD,GAEOjB,EAAAA,YACLK,GAAkB,CAClBY,EAAM,MAAQZ,CACf,EACA,CAACY,CAAK,CAAA,EAIFE,EACLF,GAC4B,CAC5B,MAAMG,EAASJ,EAAuBC,CAAK,EACrCI,EAASH,EAAuBD,CAAK,EAK3C,OAJiBR,EAAAA,QAChB,KAA+B,CAAE,IAAKW,EAAQ,IAAKC,CAAA,GACnD,CAACD,EAAQC,CAAM,CAAA,CAGjB,EAGaC,EAA6BL,GAAqC,CAC9E,MAAML,EAAWO,EAAyBF,CAAK,EAC/CP,EAAwBO,EAAM,cAAeL,EAAUK,EAAM,aAAa,CAC3E"}
@@ -1,15 +1,15 @@
1
- import { u as c } from "./useStateHandler-CdocwC8x.js";
2
- import { useLocation as i, useNavigate as u } from "@tanstack/react-router";
3
- import { parse as S } from "qs";
4
- import { useCallback as a } from "react";
5
- const l = () => {
6
- const t = i();
1
+ import { u as n } from "./useStateHandler-Cmr_YOo4.js";
2
+ import { useLocation as r, useNavigate as i } from "@tanstack/react-router";
3
+ import { parse as u } from "qs";
4
+ import { useMemo as c, useCallback as a } from "react";
5
+ const S = () => {
6
+ const t = r();
7
7
  return a(
8
- () => S(t.searchStr.slice(1)),
8
+ () => u(t.searchStr.slice(1)),
9
9
  [t]
10
10
  );
11
- }, m = () => {
12
- const t = u();
11
+ }, l = () => {
12
+ const t = i();
13
13
  return a(
14
14
  async (e) => {
15
15
  await t({
@@ -19,31 +19,34 @@ const l = () => {
19
19
  },
20
20
  [t]
21
21
  );
22
- }, L = (t, e, o, n) => {
23
- const r = l(), s = m();
24
- c(
25
- r,
26
- t,
27
- e,
28
- o,
29
- n,
30
- s
22
+ }, d = () => {
23
+ const t = S(), e = l();
24
+ return c(
25
+ () => ({
26
+ deserialize: t,
27
+ serialize: e
28
+ }),
29
+ [t, e]
31
30
  );
32
- }, p = (t) => a(
31
+ }, m = (t, e, o) => {
32
+ const s = d();
33
+ n(s, t, e, o);
34
+ }, L = (t) => a(() => t.state, [t]), p = (t) => a(
33
35
  (e) => {
34
36
  t.state = e;
35
37
  },
36
38
  [t]
37
- ), d = (t) => a(() => t.state, [t]), v = (t) => {
38
- const e = p(t), o = d(t);
39
- L(
40
- t.validateState,
41
- e,
42
- t.onStateChange,
43
- o
39
+ ), z = (t) => {
40
+ const e = L(t), o = p(t);
41
+ return c(
42
+ () => ({ get: e, set: o }),
43
+ [e, o]
44
44
  );
45
+ }, C = (t) => {
46
+ const e = z(t);
47
+ m(t.validateState, e, t.onStateChange);
45
48
  };
46
49
  export {
47
- v as useLocationState
50
+ C as useLocationState
48
51
  };
49
52
  //# sourceMappingURL=tanstack-router.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tanstack-router.es.js","sources":["../src/tanstack-router/useLocationState.tsx"],"sourcesContent":["import { useStateHandler } from '@/components/useStateHandler';\nimport type { IStateStore } from '@/stores/IStateStore';\nimport type { StateChangeEvent } from '@/stores/StateChangeEvent';\nimport { useLocation, useNavigate } from '@tanstack/react-router';\nimport { type ParsedQs, parse } from 'qs';\nimport { useCallback } from 'react';\n\nconst useLocationStateDeserializer = (): (() => ParsedQs) => {\n\tconst location = useLocation();\n\n\t// Pass `location` as deps instead of `location.search`.\n\treturn useCallback(\n\t\t(): ParsedQs => parse(location.searchStr.slice(1)),\n\t\t[location],\n\t);\n};\n\nconst useLocationStateSerializer = <TState,>(): ((state: TState) => void) => {\n\tconst navigate = useNavigate();\n\n\treturn useCallback(\n\t\tasync (state: TState): Promise<void> => {\n\t\t\tawait navigate({ search: state as any /* FIXME */ });\n\t\t},\n\t\t[navigate],\n\t);\n};\n\n/** Updates a store that implements the {@link LocationStateStore} interface when a route changes, and vice versa. */\nconst useLocationStateHandler = <TState,>(\n\tstateValidator: (state: any) => state is TState,\n\tstateSetter: (state: TState) => void,\n\tonStateChange: ((event: StateChangeEvent<TState>) => void) | undefined,\n\tstateGetter: () => TState,\n): void => {\n\tconst deserializer = useLocationStateDeserializer();\n\tconst serializer = useLocationStateSerializer();\n\tuseStateHandler(\n\t\tdeserializer,\n\t\tstateValidator,\n\t\tstateSetter,\n\t\tonStateChange,\n\t\tstateGetter,\n\t\tserializer,\n\t);\n};\n\nconst useLocationStateSetter = <TState,>(\n\tstore: IStateStore<TState>,\n): ((state: TState) => void) => {\n\treturn useCallback(\n\t\t(state: TState) => {\n\t\t\tstore.state = state;\n\t\t},\n\t\t[store],\n\t);\n};\n\nconst useLocationStateGetter = <TState,>(\n\tstore: IStateStore<TState>,\n): (() => TState) => {\n\treturn useCallback(() => store.state, [store]);\n};\n\n/** Updates a store that implements the {@link LocationStateStore} interface when a route changes, and vice versa. */\nexport const useLocationState = <TState,>(store: IStateStore<TState>): void => {\n\tconst stateSetter = useLocationStateSetter(store);\n\tconst stateGetter = useLocationStateGetter(store);\n\tuseLocationStateHandler(\n\t\tstore.validateState,\n\t\tstateSetter,\n\t\tstore.onStateChange,\n\t\tstateGetter,\n\t);\n};\n"],"names":["useLocationStateDeserializer","location","useLocation","useCallback","parse","useLocationStateSerializer","navigate","useNavigate","state","useLocationStateHandler","stateValidator","stateSetter","onStateChange","stateGetter","deserializer","serializer","useStateHandler","useLocationStateSetter","store","useLocationStateGetter","useLocationState"],"mappings":";;;;AAOA,MAAMA,IAA+B,MAAwB;AAC5D,QAAMC,IAAWC,EAAA;AAGjB,SAAOC;AAAA,IACN,MAAgBC,EAAMH,EAAS,UAAU,MAAM,CAAC,CAAC;AAAA,IACjD,CAACA,CAAQ;AAAA,EAAA;AAEX,GAEMI,IAA6B,MAA0C;AAC5E,QAAMC,IAAWC,EAAA;AAEjB,SAAOJ;AAAA,IACN,OAAOK,MAAiC;AACvC,YAAMF,EAAS;AAAA,QAAE,QAAQE;AAAA;AAAA,MAAA,CAA0B;AAAA,IACpD;AAAA,IACA,CAACF,CAAQ;AAAA,EAAA;AAEX,GAGMG,IAA0B,CAC/BC,GACAC,GACAC,GACAC,MACU;AACV,QAAMC,IAAed,EAAA,GACfe,IAAaV,EAAA;AACnB,EAAAW;AAAA,IACCF;AAAA,IACAJ;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAE;AAAA,EAAA;AAEF,GAEME,IAAyB,CAC9BC,MAEOf;AAAA,EACN,CAACK,MAAkB;AAClB,IAAAU,EAAM,QAAQV;AAAA,EACf;AAAA,EACA,CAACU,CAAK;AAAA,GAIFC,IAAyB,CAC9BD,MAEOf,EAAY,MAAMe,EAAM,OAAO,CAACA,CAAK,CAAC,GAIjCE,IAAmB,CAAUF,MAAqC;AAC9E,QAAMP,IAAcM,EAAuBC,CAAK,GAC1CL,IAAcM,EAAuBD,CAAK;AAChD,EAAAT;AAAA,IACCS,EAAM;AAAA,IACNP;AAAA,IACAO,EAAM;AAAA,IACNL;AAAA,EAAA;AAEF;"}
1
+ {"version":3,"file":"tanstack-router.es.js","sources":["../src/tanstack-router/useLocationState.tsx"],"sourcesContent":["import type { IStateAccessor } from '@/components/IStateAccessor';\nimport type { IStateCodec } from '@/components/IStateCodec';\nimport { useStateHandler } from '@/components/useStateHandler';\nimport type { IStateStore } from '@/stores/IStateStore';\nimport type { StateChangeEvent } from '@/stores/StateChangeEvent';\nimport { useLocation, useNavigate } from '@tanstack/react-router';\nimport { type ParsedQs, parse } from 'qs';\nimport { useCallback, useMemo } from 'react';\n\nconst useLocationStateDeserializer = (): (() => ParsedQs) => {\n\tconst location = useLocation();\n\n\t// Pass `location` as deps instead of `location.search`.\n\treturn useCallback(\n\t\t(): ParsedQs => parse(location.searchStr.slice(1)),\n\t\t[location],\n\t);\n};\n\nconst useLocationStateSerializer = <TState,>(): ((state: TState) => void) => {\n\tconst navigate = useNavigate();\n\n\treturn useCallback(\n\t\tasync (state: TState): Promise<void> => {\n\t\t\tawait navigate({ search: state as any /* FIXME */ });\n\t\t},\n\t\t[navigate],\n\t);\n};\n\nconst useLocationStateCodec = <TState,>(): IStateCodec<TState> => {\n\tconst deserializer = useLocationStateDeserializer();\n\tconst serializer = useLocationStateSerializer();\n\tconst codec = useMemo(\n\t\t(): IStateCodec<TState> => ({\n\t\t\tdeserialize: deserializer,\n\t\t\tserialize: serializer,\n\t\t}),\n\t\t[deserializer, serializer],\n\t);\n\treturn codec;\n};\n\n/** Updates a store that implements the {@link LocationStateStore} interface when a route changes, and vice versa. */\nconst useLocationStateHandler = <TState,>(\n\tvalidator: (state: unknown) => state is TState,\n\taccessor: IStateAccessor<TState>,\n\tonStateChange: ((event: StateChangeEvent<TState>) => void) | undefined,\n): void => {\n\tconst codec = useLocationStateCodec();\n\tuseStateHandler(codec, validator, accessor, onStateChange);\n};\n\nconst useLocationStateGetter = <TState,>(\n\tstore: IStateStore<TState>,\n): (() => TState) => {\n\treturn useCallback(() => store.state, [store]);\n};\n\nconst useLocationStateSetter = <TState,>(\n\tstore: IStateStore<TState>,\n): ((state: TState) => void) => {\n\treturn useCallback(\n\t\t(state: TState) => {\n\t\t\tstore.state = state;\n\t\t},\n\t\t[store],\n\t);\n};\n\nconst useLocationStateAccessor = <TState,>(\n\tstore: IStateStore<TState>,\n): IStateAccessor<TState> => {\n\tconst getter = useLocationStateGetter(store);\n\tconst setter = useLocationStateSetter(store);\n\tconst accessor = useMemo(\n\t\t(): IStateAccessor<TState> => ({ get: getter, set: setter }),\n\t\t[getter, setter],\n\t);\n\treturn accessor;\n};\n\n/** Updates a store that implements the {@link LocationStateStore} interface when a route changes, and vice versa. */\nexport const useLocationState = <TState,>(store: IStateStore<TState>): void => {\n\tconst accessor = useLocationStateAccessor(store);\n\tuseLocationStateHandler(store.validateState, accessor, store.onStateChange);\n};\n"],"names":["useLocationStateDeserializer","location","useLocation","useCallback","parse","useLocationStateSerializer","navigate","useNavigate","state","useLocationStateCodec","deserializer","serializer","useMemo","useLocationStateHandler","validator","accessor","onStateChange","codec","useStateHandler","useLocationStateGetter","store","useLocationStateSetter","useLocationStateAccessor","getter","setter","useLocationState"],"mappings":";;;;AASA,MAAMA,IAA+B,MAAwB;AAC5D,QAAMC,IAAWC,EAAA;AAGjB,SAAOC;AAAA,IACN,MAAgBC,EAAMH,EAAS,UAAU,MAAM,CAAC,CAAC;AAAA,IACjD,CAACA,CAAQ;AAAA,EAAA;AAEX,GAEMI,IAA6B,MAA0C;AAC5E,QAAMC,IAAWC,EAAA;AAEjB,SAAOJ;AAAA,IACN,OAAOK,MAAiC;AACvC,YAAMF,EAAS;AAAA,QAAE,QAAQE;AAAA;AAAA,MAAA,CAA0B;AAAA,IACpD;AAAA,IACA,CAACF,CAAQ;AAAA,EAAA;AAEX,GAEMG,IAAwB,MAAoC;AACjE,QAAMC,IAAeV,EAAA,GACfW,IAAaN,EAAA;AAQnB,SAPcO;AAAA,IACb,OAA4B;AAAA,MAC3B,aAAaF;AAAA,MACb,WAAWC;AAAA,IAAA;AAAA,IAEZ,CAACD,GAAcC,CAAU;AAAA,EAAA;AAG3B,GAGME,IAA0B,CAC/BC,GACAC,GACAC,MACU;AACV,QAAMC,IAAQR,EAAA;AACd,EAAAS,EAAgBD,GAAOH,GAAWC,GAAUC,CAAa;AAC1D,GAEMG,IAAyB,CAC9BC,MAEOjB,EAAY,MAAMiB,EAAM,OAAO,CAACA,CAAK,CAAC,GAGxCC,IAAyB,CAC9BD,MAEOjB;AAAA,EACN,CAACK,MAAkB;AAClB,IAAAY,EAAM,QAAQZ;AAAA,EACf;AAAA,EACA,CAACY,CAAK;AAAA,GAIFE,IAA2B,CAChCF,MAC4B;AAC5B,QAAMG,IAASJ,EAAuBC,CAAK,GACrCI,IAASH,EAAuBD,CAAK;AAK3C,SAJiBR;AAAA,IAChB,OAA+B,EAAE,KAAKW,GAAQ,KAAKC,EAAA;AAAA,IACnD,CAACD,GAAQC,CAAM;AAAA,EAAA;AAGjB,GAGaC,IAAmB,CAAUL,MAAqC;AAC9E,QAAML,IAAWO,EAAyBF,CAAK;AAC/C,EAAAP,EAAwBO,EAAM,eAAeL,GAAUK,EAAM,aAAa;AAC3E;"}
@@ -0,0 +1,2 @@
1
+ "use strict";const f=require("lodash-es"),i=require("mobx"),c=require("react"),y=(t,e,s,u)=>{c.useEffect(()=>{const r=e.deserialize();s(r)&&(t.current=!0,u.set(r),t.current=!1)},[e,s,t,u])},a=(t,e,s)=>{c.useEffect(()=>{if(e)return i.reaction(s.get,(u,r)=>{const o=f.omitBy(u,(l,E)=>f.isEqual(r[E],l)),n=Object.keys(o);console.assert(n.length>0),e({keys:n,popState:t.current})})},[s,e,t]),c.useEffect(()=>{if(!e)return;const u=Object.keys(s.get());e({keys:u,popState:!0})},[s,e])},k=(t,e,s)=>{c.useEffect(()=>i.reaction(e.get,u=>{t.current||s.serialize(u)}),[e,t,s])},q=(t,e,s,u)=>{const r=c.useRef(!1);y(r,t,e,s),a(r,u,s),k(r,s,t)};exports.useStateHandler=q;
2
+ //# sourceMappingURL=useStateHandler-B54QKldW.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStateHandler-B54QKldW.cjs","sources":["../src/components/useStateHandler.tsx"],"sourcesContent":["import type { StateChangeEvent } from '@/stores/StateChangeEvent';\nimport { isEqual, omitBy } from 'lodash-es';\nimport { reaction } from 'mobx';\nimport { type MutableRefObject, useEffect, useRef } from 'react';\n\nimport type {\n\tIStateAccessor,\n\tIStateGetter,\n\tIStateSetter,\n} from './IStateAccessor';\nimport type {\n\tIStateCodec,\n\tIStateDeserializer,\n\tIStateSerializer,\n} from './IStateCodec';\n\nconst useRestoreState = <TState,>(\n\tpopStateRef: MutableRefObject<boolean>,\n\tdeserializer: IStateDeserializer /*<TState>*/,\n\tvalidator: (state: unknown) => state is TState,\n\tsetter: IStateSetter<TState>,\n): void => {\n\tuseEffect(() => {\n\t\tconst state = deserializer.deserialize();\n\n\t\tif (validator(state)) {\n\t\t\tpopStateRef.current = true;\n\n\t\t\tsetter.set(state);\n\n\t\t\tpopStateRef.current = false;\n\t\t}\n\t}, [deserializer, validator, popStateRef, setter]);\n};\n\nconst useHandleStateChange = <TState extends Partial<TState>>(\n\tpopStateRef: MutableRefObject<boolean>,\n\tonStateChange: ((event: StateChangeEvent<TState>) => void) | undefined,\n\tgetter: IStateGetter<TState>,\n): void => {\n\tuseEffect(() => {\n\t\tif (!onStateChange) return;\n\n\t\t// Returns the disposer.\n\t\treturn reaction(getter.get, (state, previousState) => {\n\t\t\t// Compare the current and previous values.\n\t\t\tconst diff = omitBy(state, (v, k) =>\n\t\t\t\tisEqual(previousState[k as keyof typeof previousState], v),\n\t\t\t);\n\n\t\t\t// Assuming that the current value is `{ filter: 'Miku', page: 3939, searchType: 'Artist' }`, and the previous one is `{ filter: 'Miku', page: 1 }`,\n\t\t\t// then the diff will be `{ page: 3939, searchType: 'Artist' }`, which results in `['page', 'searchType']`.\n\t\t\tconst keys = Object.keys(diff) as (keyof TState)[];\n\t\t\tconsole.assert(keys.length > 0);\n\n\t\t\tonStateChange({ keys: keys, popState: popStateRef.current });\n\t\t});\n\t}, [getter, onStateChange, popStateRef]);\n\n\t// This is called when the page is first loaded.\n\tuseEffect(() => {\n\t\tif (!onStateChange) return;\n\n\t\tconst keys = Object.keys(getter.get()) as (keyof TState)[];\n\n\t\tonStateChange({ keys: keys, popState: true /* Always true. */ });\n\t}, [getter, onStateChange]);\n};\n\nconst useSaveState = <TState,>(\n\tpopStateRef: MutableRefObject<boolean>,\n\tgetter: IStateGetter<TState>,\n\tserializer: IStateSerializer<TState>,\n): void => {\n\tuseEffect(() => {\n\t\t// Returns the disposer.\n\t\treturn reaction(getter.get, (state) => {\n\t\t\tif (popStateRef.current) return;\n\n\t\t\tserializer.serialize(state);\n\t\t});\n\t}, [getter, popStateRef, serializer]);\n};\n\nexport const useStateHandler = <TState,>(\n\tcodec: IStateCodec<TState>,\n\tvalidator: (state: unknown) => state is TState,\n\taccessor: IStateAccessor<TState>,\n\tonStateChange: ((event: StateChangeEvent<TState>) => void) | undefined,\n): void => {\n\t// Whether currently processing popstate. This is to prevent adding the previous state to history.\n\tconst popStateRef = useRef(false);\n\n\tuseRestoreState(popStateRef, codec, validator, accessor);\n\n\t// This must be called before `useSaveState`, so that state can be changed in the `onStateChange` callback.\n\tuseHandleStateChange(popStateRef, onStateChange, accessor);\n\n\tuseSaveState(popStateRef, accessor, codec);\n};\n"],"names":["useRestoreState","popStateRef","deserializer","validator","setter","useEffect","state","useHandleStateChange","onStateChange","getter","reaction","previousState","diff","omitBy","v","k","isEqual","keys","useSaveState","serializer","useStateHandler","codec","accessor","useRef"],"mappings":"+EAgBMA,EAAkB,CACvBC,EACAC,EACAC,EACAC,IACU,CACVC,EAAAA,UAAU,IAAM,CACf,MAAMC,EAAQJ,EAAa,YAAA,EAEvBC,EAAUG,CAAK,IAClBL,EAAY,QAAU,GAEtBG,EAAO,IAAIE,CAAK,EAEhBL,EAAY,QAAU,GAExB,EAAG,CAACC,EAAcC,EAAWF,EAAaG,CAAM,CAAC,CAClD,EAEMG,EAAuB,CAC5BN,EACAO,EACAC,IACU,CACVJ,EAAAA,UAAU,IAAM,CACf,GAAKG,EAGL,OAAOE,EAAAA,SAASD,EAAO,IAAK,CAACH,EAAOK,IAAkB,CAErD,MAAMC,EAAOC,EAAAA,OAAOP,EAAO,CAACQ,EAAGC,IAC9BC,EAAAA,QAAQL,EAAcI,CAA+B,EAAGD,CAAC,CAAA,EAKpDG,EAAO,OAAO,KAAKL,CAAI,EAC7B,QAAQ,OAAOK,EAAK,OAAS,CAAC,EAE9BT,EAAc,CAAE,KAAAS,EAAY,SAAUhB,EAAY,QAAS,CAC5D,CAAC,CACF,EAAG,CAACQ,EAAQD,EAAeP,CAAW,CAAC,EAGvCI,EAAAA,UAAU,IAAM,CACf,GAAI,CAACG,EAAe,OAEpB,MAAMS,EAAO,OAAO,KAAKR,EAAO,KAAK,EAErCD,EAAc,CAAE,KAAAS,EAAY,SAAU,EAAA,CAAyB,CAChE,EAAG,CAACR,EAAQD,CAAa,CAAC,CAC3B,EAEMU,EAAe,CACpBjB,EACAQ,EACAU,IACU,CACVd,EAAAA,UAAU,IAEFK,WAASD,EAAO,IAAMH,GAAU,CAClCL,EAAY,SAEhBkB,EAAW,UAAUb,CAAK,CAC3B,CAAC,EACC,CAACG,EAAQR,EAAakB,CAAU,CAAC,CACrC,EAEaC,EAAkB,CAC9BC,EACAlB,EACAmB,EACAd,IACU,CAEV,MAAMP,EAAcsB,EAAAA,OAAO,EAAK,EAEhCvB,EAAgBC,EAAaoB,EAAOlB,EAAWmB,CAAQ,EAGvDf,EAAqBN,EAAaO,EAAec,CAAQ,EAEzDJ,EAAajB,EAAaqB,EAAUD,CAAK,CAC1C"}
@@ -0,0 +1,39 @@
1
+ import { omitBy as l, isEqual as y } from "lodash-es";
2
+ import { reaction as f } from "mobx";
3
+ import { useRef as k, useEffect as n } from "react";
4
+ const b = (r, s, t, e) => {
5
+ n(() => {
6
+ const u = s.deserialize();
7
+ t(u) && (r.current = !0, e.set(u), r.current = !1);
8
+ }, [s, t, r, e]);
9
+ }, j = (r, s, t) => {
10
+ n(() => {
11
+ if (s)
12
+ return f(t.get, (e, u) => {
13
+ const o = l(
14
+ e,
15
+ (i, m) => y(u[m], i)
16
+ ), c = Object.keys(o);
17
+ console.assert(c.length > 0), s({ keys: c, popState: r.current });
18
+ });
19
+ }, [t, s, r]), n(() => {
20
+ if (!s) return;
21
+ const e = Object.keys(t.get());
22
+ s({
23
+ keys: e,
24
+ popState: !0
25
+ /* Always true. */
26
+ });
27
+ }, [t, s]);
28
+ }, p = (r, s, t) => {
29
+ n(() => f(s.get, (e) => {
30
+ r.current || t.serialize(e);
31
+ }), [s, r, t]);
32
+ }, d = (r, s, t, e) => {
33
+ const u = k(!1);
34
+ b(u, r, s, t), j(u, e, t), p(u, t, r);
35
+ };
36
+ export {
37
+ d as u
38
+ };
39
+ //# sourceMappingURL=useStateHandler-Cmr_YOo4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStateHandler-Cmr_YOo4.js","sources":["../src/components/useStateHandler.tsx"],"sourcesContent":["import type { StateChangeEvent } from '@/stores/StateChangeEvent';\nimport { isEqual, omitBy } from 'lodash-es';\nimport { reaction } from 'mobx';\nimport { type MutableRefObject, useEffect, useRef } from 'react';\n\nimport type {\n\tIStateAccessor,\n\tIStateGetter,\n\tIStateSetter,\n} from './IStateAccessor';\nimport type {\n\tIStateCodec,\n\tIStateDeserializer,\n\tIStateSerializer,\n} from './IStateCodec';\n\nconst useRestoreState = <TState,>(\n\tpopStateRef: MutableRefObject<boolean>,\n\tdeserializer: IStateDeserializer /*<TState>*/,\n\tvalidator: (state: unknown) => state is TState,\n\tsetter: IStateSetter<TState>,\n): void => {\n\tuseEffect(() => {\n\t\tconst state = deserializer.deserialize();\n\n\t\tif (validator(state)) {\n\t\t\tpopStateRef.current = true;\n\n\t\t\tsetter.set(state);\n\n\t\t\tpopStateRef.current = false;\n\t\t}\n\t}, [deserializer, validator, popStateRef, setter]);\n};\n\nconst useHandleStateChange = <TState extends Partial<TState>>(\n\tpopStateRef: MutableRefObject<boolean>,\n\tonStateChange: ((event: StateChangeEvent<TState>) => void) | undefined,\n\tgetter: IStateGetter<TState>,\n): void => {\n\tuseEffect(() => {\n\t\tif (!onStateChange) return;\n\n\t\t// Returns the disposer.\n\t\treturn reaction(getter.get, (state, previousState) => {\n\t\t\t// Compare the current and previous values.\n\t\t\tconst diff = omitBy(state, (v, k) =>\n\t\t\t\tisEqual(previousState[k as keyof typeof previousState], v),\n\t\t\t);\n\n\t\t\t// Assuming that the current value is `{ filter: 'Miku', page: 3939, searchType: 'Artist' }`, and the previous one is `{ filter: 'Miku', page: 1 }`,\n\t\t\t// then the diff will be `{ page: 3939, searchType: 'Artist' }`, which results in `['page', 'searchType']`.\n\t\t\tconst keys = Object.keys(diff) as (keyof TState)[];\n\t\t\tconsole.assert(keys.length > 0);\n\n\t\t\tonStateChange({ keys: keys, popState: popStateRef.current });\n\t\t});\n\t}, [getter, onStateChange, popStateRef]);\n\n\t// This is called when the page is first loaded.\n\tuseEffect(() => {\n\t\tif (!onStateChange) return;\n\n\t\tconst keys = Object.keys(getter.get()) as (keyof TState)[];\n\n\t\tonStateChange({ keys: keys, popState: true /* Always true. */ });\n\t}, [getter, onStateChange]);\n};\n\nconst useSaveState = <TState,>(\n\tpopStateRef: MutableRefObject<boolean>,\n\tgetter: IStateGetter<TState>,\n\tserializer: IStateSerializer<TState>,\n): void => {\n\tuseEffect(() => {\n\t\t// Returns the disposer.\n\t\treturn reaction(getter.get, (state) => {\n\t\t\tif (popStateRef.current) return;\n\n\t\t\tserializer.serialize(state);\n\t\t});\n\t}, [getter, popStateRef, serializer]);\n};\n\nexport const useStateHandler = <TState,>(\n\tcodec: IStateCodec<TState>,\n\tvalidator: (state: unknown) => state is TState,\n\taccessor: IStateAccessor<TState>,\n\tonStateChange: ((event: StateChangeEvent<TState>) => void) | undefined,\n): void => {\n\t// Whether currently processing popstate. This is to prevent adding the previous state to history.\n\tconst popStateRef = useRef(false);\n\n\tuseRestoreState(popStateRef, codec, validator, accessor);\n\n\t// This must be called before `useSaveState`, so that state can be changed in the `onStateChange` callback.\n\tuseHandleStateChange(popStateRef, onStateChange, accessor);\n\n\tuseSaveState(popStateRef, accessor, codec);\n};\n"],"names":["useRestoreState","popStateRef","deserializer","validator","setter","useEffect","state","useHandleStateChange","onStateChange","getter","reaction","previousState","diff","omitBy","v","k","isEqual","keys","useSaveState","serializer","useStateHandler","codec","accessor","useRef"],"mappings":";;;AAgBA,MAAMA,IAAkB,CACvBC,GACAC,GACAC,GACAC,MACU;AACV,EAAAC,EAAU,MAAM;AACf,UAAMC,IAAQJ,EAAa,YAAA;AAE3B,IAAIC,EAAUG,CAAK,MAClBL,EAAY,UAAU,IAEtBG,EAAO,IAAIE,CAAK,GAEhBL,EAAY,UAAU;AAAA,EAExB,GAAG,CAACC,GAAcC,GAAWF,GAAaG,CAAM,CAAC;AAClD,GAEMG,IAAuB,CAC5BN,GACAO,GACAC,MACU;AACV,EAAAJ,EAAU,MAAM;AACf,QAAKG;AAGL,aAAOE,EAASD,EAAO,KAAK,CAACH,GAAOK,MAAkB;AAErD,cAAMC,IAAOC;AAAA,UAAOP;AAAA,UAAO,CAACQ,GAAGC,MAC9BC,EAAQL,EAAcI,CAA+B,GAAGD,CAAC;AAAA,QAAA,GAKpDG,IAAO,OAAO,KAAKL,CAAI;AAC7B,gBAAQ,OAAOK,EAAK,SAAS,CAAC,GAE9BT,EAAc,EAAE,MAAAS,GAAY,UAAUhB,EAAY,SAAS;AAAA,MAC5D,CAAC;AAAA,EACF,GAAG,CAACQ,GAAQD,GAAeP,CAAW,CAAC,GAGvCI,EAAU,MAAM;AACf,QAAI,CAACG,EAAe;AAEpB,UAAMS,IAAO,OAAO,KAAKR,EAAO,KAAK;AAErC,IAAAD,EAAc;AAAA,MAAE,MAAAS;AAAA,MAAY,UAAU;AAAA;AAAA,IAAA,CAAyB;AAAA,EAChE,GAAG,CAACR,GAAQD,CAAa,CAAC;AAC3B,GAEMU,IAAe,CACpBjB,GACAQ,GACAU,MACU;AACV,EAAAd,EAAU,MAEFK,EAASD,EAAO,KAAK,CAACH,MAAU;AACtC,IAAIL,EAAY,WAEhBkB,EAAW,UAAUb,CAAK;AAAA,EAC3B,CAAC,GACC,CAACG,GAAQR,GAAakB,CAAU,CAAC;AACrC,GAEaC,IAAkB,CAC9BC,GACAlB,GACAmB,GACAd,MACU;AAEV,QAAMP,IAAcsB,EAAO,EAAK;AAEhC,EAAAvB,EAAgBC,GAAaoB,GAAOlB,GAAWmB,CAAQ,GAGvDf,EAAqBN,GAAaO,GAAec,CAAQ,GAEzDJ,EAAajB,GAAaqB,GAAUD,CAAK;AAC1C;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aigamo/route-sphere",
3
- "version": "2.1.0-4",
3
+ "version": "2.1.0-6",
4
4
  "type": "module",
5
5
  "dependencies": {},
6
6
  "devDependencies": {
@@ -1,2 +0,0 @@
1
- "use strict";const t=require("lodash-es"),i=require("mobx"),f=require("react"),y=(u,s,c,r)=>{f.useEffect(()=>{const e=s();c(e)&&(u.current=!0,r(e),u.current=!1)},[s,c,u,r])},k=(u,s,c)=>{f.useEffect(()=>{if(s)return i.reaction(c,(r,e)=>{const o=t.omitBy(r,(l,E)=>t.isEqual(e[E],l)),n=Object.keys(o);console.assert(n.length>0),s({keys:n,popState:u.current})})},[c,s,u]),f.useEffect(()=>{if(!s)return;const r=Object.keys(c());s({keys:r,popState:!0})},[c,s])},q=(u,s,c)=>{f.useEffect(()=>i.reaction(s,r=>{u.current||c(r)}),[s,u,c])},b=(u,s,c,r,e,o)=>{const n=f.useRef(!1);y(n,u,s,c),k(n,r,e),q(n,e,o)};exports.useStateHandler=b;
2
- //# sourceMappingURL=useStateHandler-BKLDeBsK.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useStateHandler-BKLDeBsK.cjs","sources":["../src/components/useStateHandler.tsx"],"sourcesContent":["import type { StateChangeEvent } from '@/stores/StateChangeEvent';\nimport { isEqual, omitBy } from 'lodash-es';\nimport { reaction } from 'mobx';\nimport { type MutableRefObject, useEffect, useRef } from 'react';\n\nconst useRestoreState = <TState,>(\n\tpopStateRef: MutableRefObject<boolean>,\n\tdeserializer: () => any,\n\tstateValidator: (state: any) => state is TState,\n\tstateSetter: (state: TState) => void,\n): void => {\n\tuseEffect(() => {\n\t\tconst state = deserializer();\n\n\t\tif (stateValidator(state)) {\n\t\t\tpopStateRef.current = true;\n\n\t\t\tstateSetter(state);\n\n\t\t\tpopStateRef.current = false;\n\t\t}\n\t}, [deserializer, stateValidator, popStateRef, stateSetter]);\n};\n\nconst useHandleStateChange = <TState extends Partial<TState>>(\n\tpopStateRef: MutableRefObject<boolean>,\n\tonStateChange: ((event: StateChangeEvent<TState>) => void) | undefined,\n\tstateGetter: () => TState,\n): void => {\n\tuseEffect(() => {\n\t\tif (!onStateChange) return;\n\n\t\t// Returns the disposer.\n\t\treturn reaction(stateGetter, (state, previousState) => {\n\t\t\t// Compare the current and previous values.\n\t\t\tconst diff = omitBy(state, (v, k) =>\n\t\t\t\tisEqual(previousState[k as keyof typeof previousState], v),\n\t\t\t);\n\n\t\t\t// Assuming that the current value is `{ filter: 'Miku', page: 3939, searchType: 'Artist' }`, and the previous one is `{ filter: 'Miku', page: 1 }`,\n\t\t\t// then the diff will be `{ page: 3939, searchType: 'Artist' }`, which results in `['page', 'searchType']`.\n\t\t\tconst keys = Object.keys(diff) as (keyof TState)[];\n\t\t\tconsole.assert(keys.length > 0);\n\n\t\t\tonStateChange({ keys: keys, popState: popStateRef.current });\n\t\t});\n\t}, [stateGetter, onStateChange, popStateRef]);\n\n\t// This is called when the page is first loaded.\n\tuseEffect(() => {\n\t\tif (!onStateChange) return;\n\n\t\tconst keys = Object.keys(stateGetter()) as (keyof TState)[];\n\n\t\tonStateChange({ keys: keys, popState: true /* Always true. */ });\n\t}, [stateGetter, onStateChange]);\n};\n\nconst useSaveState = <TState,>(\n\tpopStateRef: MutableRefObject<boolean>,\n\tstateGetter: () => TState,\n\tserializer: (state: TState) => void,\n): void => {\n\tuseEffect(() => {\n\t\t// Returns the disposer.\n\t\treturn reaction(stateGetter, (state) => {\n\t\t\tif (popStateRef.current) return;\n\n\t\t\tserializer(state);\n\t\t});\n\t}, [stateGetter, popStateRef, serializer]);\n};\n\nexport const useStateHandler = <TState,>(\n\tdeserializer: () => any,\n\tstateValidator: (state: any) => state is TState,\n\tstateSetter: (state: TState) => void,\n\tonStateChange: ((event: StateChangeEvent<TState>) => void) | undefined,\n\tstateGetter: () => TState,\n\tserializer: (state: TState) => void,\n): void => {\n\t// Whether currently processing popstate. This is to prevent adding the previous state to history.\n\tconst popStateRef = useRef(false);\n\n\tuseRestoreState(popStateRef, deserializer, stateValidator, stateSetter);\n\n\t// This must be called before `useSaveState`, so that state can be changed in the `onStateChange` callback.\n\tuseHandleStateChange(popStateRef, onStateChange, stateGetter);\n\n\tuseSaveState(popStateRef, stateGetter, serializer);\n};\n"],"names":["useRestoreState","popStateRef","deserializer","stateValidator","stateSetter","useEffect","state","useHandleStateChange","onStateChange","stateGetter","reaction","previousState","diff","omitBy","v","k","isEqual","keys","useSaveState","serializer","useStateHandler","useRef"],"mappings":"+EAKMA,EAAkB,CACvBC,EACAC,EACAC,EACAC,IACU,CACVC,EAAAA,UAAU,IAAM,CACf,MAAMC,EAAQJ,EAAA,EAEVC,EAAeG,CAAK,IACvBL,EAAY,QAAU,GAEtBG,EAAYE,CAAK,EAEjBL,EAAY,QAAU,GAExB,EAAG,CAACC,EAAcC,EAAgBF,EAAaG,CAAW,CAAC,CAC5D,EAEMG,EAAuB,CAC5BN,EACAO,EACAC,IACU,CACVJ,EAAAA,UAAU,IAAM,CACf,GAAKG,EAGL,OAAOE,WAASD,EAAa,CAACH,EAAOK,IAAkB,CAEtD,MAAMC,EAAOC,EAAAA,OAAOP,EAAO,CAACQ,EAAGC,IAC9BC,EAAAA,QAAQL,EAAcI,CAA+B,EAAGD,CAAC,CAAA,EAKpDG,EAAO,OAAO,KAAKL,CAAI,EAC7B,QAAQ,OAAOK,EAAK,OAAS,CAAC,EAE9BT,EAAc,CAAE,KAAAS,EAAY,SAAUhB,EAAY,QAAS,CAC5D,CAAC,CACF,EAAG,CAACQ,EAAaD,EAAeP,CAAW,CAAC,EAG5CI,EAAAA,UAAU,IAAM,CACf,GAAI,CAACG,EAAe,OAEpB,MAAMS,EAAO,OAAO,KAAKR,EAAA,CAAa,EAEtCD,EAAc,CAAE,KAAAS,EAAY,SAAU,EAAA,CAAyB,CAChE,EAAG,CAACR,EAAaD,CAAa,CAAC,CAChC,EAEMU,EAAe,CACpBjB,EACAQ,EACAU,IACU,CACVd,EAAAA,UAAU,IAEFK,EAAAA,SAASD,EAAcH,GAAU,CACnCL,EAAY,SAEhBkB,EAAWb,CAAK,CACjB,CAAC,EACC,CAACG,EAAaR,EAAakB,CAAU,CAAC,CAC1C,EAEaC,EAAkB,CAC9BlB,EACAC,EACAC,EACAI,EACAC,EACAU,IACU,CAEV,MAAMlB,EAAcoB,EAAAA,OAAO,EAAK,EAEhCrB,EAAgBC,EAAaC,EAAcC,EAAgBC,CAAW,EAGtEG,EAAqBN,EAAaO,EAAeC,CAAW,EAE5DS,EAAajB,EAAaQ,EAAaU,CAAU,CAClD"}
@@ -1,39 +0,0 @@
1
- import { omitBy as k, isEqual as l } from "lodash-es";
2
- import { reaction as i } from "mobx";
3
- import { useRef as t, useEffect as f } from "react";
4
- const b = (u, r, s, c) => {
5
- f(() => {
6
- const n = r();
7
- s(n) && (u.current = !0, c(n), u.current = !1);
8
- }, [r, s, u, c]);
9
- }, j = (u, r, s) => {
10
- f(() => {
11
- if (r)
12
- return i(s, (c, n) => {
13
- const m = k(
14
- c,
15
- (e, y) => l(n[y], e)
16
- ), o = Object.keys(m);
17
- console.assert(o.length > 0), r({ keys: o, popState: u.current });
18
- });
19
- }, [s, r, u]), f(() => {
20
- if (!r) return;
21
- const c = Object.keys(s());
22
- r({
23
- keys: c,
24
- popState: !0
25
- /* Always true. */
26
- });
27
- }, [s, r]);
28
- }, p = (u, r, s) => {
29
- f(() => i(r, (c) => {
30
- u.current || s(c);
31
- }), [r, u, s]);
32
- }, d = (u, r, s, c, n, m) => {
33
- const o = t(!1);
34
- b(o, u, r, s), j(o, c, n), p(o, n, m);
35
- };
36
- export {
37
- d as u
38
- };
39
- //# sourceMappingURL=useStateHandler-CdocwC8x.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useStateHandler-CdocwC8x.js","sources":["../src/components/useStateHandler.tsx"],"sourcesContent":["import type { StateChangeEvent } from '@/stores/StateChangeEvent';\nimport { isEqual, omitBy } from 'lodash-es';\nimport { reaction } from 'mobx';\nimport { type MutableRefObject, useEffect, useRef } from 'react';\n\nconst useRestoreState = <TState,>(\n\tpopStateRef: MutableRefObject<boolean>,\n\tdeserializer: () => any,\n\tstateValidator: (state: any) => state is TState,\n\tstateSetter: (state: TState) => void,\n): void => {\n\tuseEffect(() => {\n\t\tconst state = deserializer();\n\n\t\tif (stateValidator(state)) {\n\t\t\tpopStateRef.current = true;\n\n\t\t\tstateSetter(state);\n\n\t\t\tpopStateRef.current = false;\n\t\t}\n\t}, [deserializer, stateValidator, popStateRef, stateSetter]);\n};\n\nconst useHandleStateChange = <TState extends Partial<TState>>(\n\tpopStateRef: MutableRefObject<boolean>,\n\tonStateChange: ((event: StateChangeEvent<TState>) => void) | undefined,\n\tstateGetter: () => TState,\n): void => {\n\tuseEffect(() => {\n\t\tif (!onStateChange) return;\n\n\t\t// Returns the disposer.\n\t\treturn reaction(stateGetter, (state, previousState) => {\n\t\t\t// Compare the current and previous values.\n\t\t\tconst diff = omitBy(state, (v, k) =>\n\t\t\t\tisEqual(previousState[k as keyof typeof previousState], v),\n\t\t\t);\n\n\t\t\t// Assuming that the current value is `{ filter: 'Miku', page: 3939, searchType: 'Artist' }`, and the previous one is `{ filter: 'Miku', page: 1 }`,\n\t\t\t// then the diff will be `{ page: 3939, searchType: 'Artist' }`, which results in `['page', 'searchType']`.\n\t\t\tconst keys = Object.keys(diff) as (keyof TState)[];\n\t\t\tconsole.assert(keys.length > 0);\n\n\t\t\tonStateChange({ keys: keys, popState: popStateRef.current });\n\t\t});\n\t}, [stateGetter, onStateChange, popStateRef]);\n\n\t// This is called when the page is first loaded.\n\tuseEffect(() => {\n\t\tif (!onStateChange) return;\n\n\t\tconst keys = Object.keys(stateGetter()) as (keyof TState)[];\n\n\t\tonStateChange({ keys: keys, popState: true /* Always true. */ });\n\t}, [stateGetter, onStateChange]);\n};\n\nconst useSaveState = <TState,>(\n\tpopStateRef: MutableRefObject<boolean>,\n\tstateGetter: () => TState,\n\tserializer: (state: TState) => void,\n): void => {\n\tuseEffect(() => {\n\t\t// Returns the disposer.\n\t\treturn reaction(stateGetter, (state) => {\n\t\t\tif (popStateRef.current) return;\n\n\t\t\tserializer(state);\n\t\t});\n\t}, [stateGetter, popStateRef, serializer]);\n};\n\nexport const useStateHandler = <TState,>(\n\tdeserializer: () => any,\n\tstateValidator: (state: any) => state is TState,\n\tstateSetter: (state: TState) => void,\n\tonStateChange: ((event: StateChangeEvent<TState>) => void) | undefined,\n\tstateGetter: () => TState,\n\tserializer: (state: TState) => void,\n): void => {\n\t// Whether currently processing popstate. This is to prevent adding the previous state to history.\n\tconst popStateRef = useRef(false);\n\n\tuseRestoreState(popStateRef, deserializer, stateValidator, stateSetter);\n\n\t// This must be called before `useSaveState`, so that state can be changed in the `onStateChange` callback.\n\tuseHandleStateChange(popStateRef, onStateChange, stateGetter);\n\n\tuseSaveState(popStateRef, stateGetter, serializer);\n};\n"],"names":["useRestoreState","popStateRef","deserializer","stateValidator","stateSetter","useEffect","state","useHandleStateChange","onStateChange","stateGetter","reaction","previousState","diff","omitBy","v","k","isEqual","keys","useSaveState","serializer","useStateHandler","useRef"],"mappings":";;;AAKA,MAAMA,IAAkB,CACvBC,GACAC,GACAC,GACAC,MACU;AACV,EAAAC,EAAU,MAAM;AACf,UAAMC,IAAQJ,EAAA;AAEd,IAAIC,EAAeG,CAAK,MACvBL,EAAY,UAAU,IAEtBG,EAAYE,CAAK,GAEjBL,EAAY,UAAU;AAAA,EAExB,GAAG,CAACC,GAAcC,GAAgBF,GAAaG,CAAW,CAAC;AAC5D,GAEMG,IAAuB,CAC5BN,GACAO,GACAC,MACU;AACV,EAAAJ,EAAU,MAAM;AACf,QAAKG;AAGL,aAAOE,EAASD,GAAa,CAACH,GAAOK,MAAkB;AAEtD,cAAMC,IAAOC;AAAA,UAAOP;AAAA,UAAO,CAACQ,GAAGC,MAC9BC,EAAQL,EAAcI,CAA+B,GAAGD,CAAC;AAAA,QAAA,GAKpDG,IAAO,OAAO,KAAKL,CAAI;AAC7B,gBAAQ,OAAOK,EAAK,SAAS,CAAC,GAE9BT,EAAc,EAAE,MAAAS,GAAY,UAAUhB,EAAY,SAAS;AAAA,MAC5D,CAAC;AAAA,EACF,GAAG,CAACQ,GAAaD,GAAeP,CAAW,CAAC,GAG5CI,EAAU,MAAM;AACf,QAAI,CAACG,EAAe;AAEpB,UAAMS,IAAO,OAAO,KAAKR,EAAA,CAAa;AAEtC,IAAAD,EAAc;AAAA,MAAE,MAAAS;AAAA,MAAY,UAAU;AAAA;AAAA,IAAA,CAAyB;AAAA,EAChE,GAAG,CAACR,GAAaD,CAAa,CAAC;AAChC,GAEMU,IAAe,CACpBjB,GACAQ,GACAU,MACU;AACV,EAAAd,EAAU,MAEFK,EAASD,GAAa,CAACH,MAAU;AACvC,IAAIL,EAAY,WAEhBkB,EAAWb,CAAK;AAAA,EACjB,CAAC,GACC,CAACG,GAAaR,GAAakB,CAAU,CAAC;AAC1C,GAEaC,IAAkB,CAC9BlB,GACAC,GACAC,GACAI,GACAC,GACAU,MACU;AAEV,QAAMlB,IAAcoB,EAAO,EAAK;AAEhC,EAAArB,EAAgBC,GAAaC,GAAcC,GAAgBC,CAAW,GAGtEG,EAAqBN,GAAaO,GAAeC,CAAW,GAE5DS,EAAajB,GAAaQ,GAAaU,CAAU;AAClD;"}