@aigamo/route-sphere 2.0.8 → 2.1.0-1
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/dist/components/index.d.ts +1 -2
- package/dist/components/useLocalStorageState.d.ts +2 -0
- package/dist/components/useStateHandler.d.ts +0 -4
- package/dist/helpers/includesAny.d.ts +1 -0
- package/dist/helpers/index.d.ts +1 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.es.js +53 -106
- package/dist/index.es.js.map +1 -1
- package/dist/react-router/index.d.ts +1 -0
- package/dist/react-router/useLocationState.d.ts +3 -0
- package/dist/stores/IReactiveStateStore.d.ts +6 -0
- package/dist/stores/StateChangeEvent.d.ts +0 -1
- package/dist/stores/index.d.ts +1 -2
- package/dist/tanstack-router/index.d.ts +1 -0
- package/dist/tanstack-router/useLocationState.d.ts +3 -0
- package/package.json +24 -1
- package/dist/components/useLocalStorageStateHandler.d.ts +0 -8
- package/dist/components/useLocationStateHandler.d.ts +0 -11
- package/dist/stores/LocalStorageStateStore.d.ts +0 -6
- package/dist/stores/LocationStateStore.d.ts +0 -6
|
@@ -1,6 +1,2 @@
|
|
|
1
1
|
import { StateChangeEvent } from '../stores/StateChangeEvent';
|
|
2
|
-
import { default as React } from 'react';
|
|
3
|
-
export declare const useRestoreState: <TState>(popStateRef: React.MutableRefObject<boolean>, deserializer: () => any, stateValidator: (state: any) => state is TState, stateSetter: (state: TState) => void) => void;
|
|
4
|
-
export declare const useHandleStateChange: <TState extends Partial<TState>>(popStateRef: React.MutableRefObject<boolean>, onStateChange: ((event: StateChangeEvent<TState>) => void) | undefined, stateGetter: () => TState) => void;
|
|
5
|
-
export declare const useSaveState: <TState>(popStateRef: React.MutableRefObject<boolean>, stateGetter: () => TState, serializer: (state: TState) => void) => void;
|
|
6
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;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const includesAny: <T>(array: T[], values: T[]) => boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './includesAny';
|
package/dist/index.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react"),d=require("react-router-dom"),a=require("lodash-es"),l=require("mobx"),g=()=>{const e=d.useLocation();return o.useLayoutEffect(()=>{window.scrollTo(0,0)},[e]),null},y=(e,t,r,c)=>{o.useEffect(()=>{const s=t();r(s)&&(e.current=!0,c(s),e.current=!1)},[t,r,e,c])},b=(e,t,r)=>{o.useEffect(()=>{if(t)return l.reaction(r,(c,s)=>{const u=a.omitBy(c,(S,f)=>a.isEqual(s[f],S)),n=Object.keys(u);console.assert(n.length>0),t({keys:n,popState:e.current})})},[r,t,e]),o.useEffect(()=>{if(!t)return;const c=Object.keys(r());t({keys:c,popState:!0})},[r,t])},L=(e,t,r)=>{o.useEffect(()=>l.reaction(t,c=>{e.current||r(c)}),[t,e,r])},i=(e,t,r,c,s,u)=>{const n=o.useRef(!1);y(n,e,t,r),b(n,c,s),L(n,s,u)},m=e=>o.useCallback(()=>{try{return JSON.parse(window.localStorage.getItem(e)??JSON.stringify({}))}catch(t){return console.error(t),{}}},[e]),E=e=>o.useCallback(t=>{window.localStorage.setItem(e,JSON.stringify(t))},[e]),w=(e,t,r,c,s)=>{const u=m(e),n=E(e);i(u,t,r,c,s,n)},O=e=>o.useCallback(t=>{e.state=t},[e]),T=e=>o.useCallback(()=>e.state,[e]),k=(e,t)=>{const r=O(t),c=T(t);w(e,t.validateState,r,t.onStateChange,c)},q=(e,t)=>t.some(r=>e.includes(r));exports.ScrollToTop=g;exports.includesAny=q;exports.useLocalStorageState=k;exports.useStateHandler=i;
|
|
2
2
|
//# sourceMappingURL=index.cjs.js.map
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/components/ScrollToTop.tsx","../src/components/useStateHandler.tsx","../src/components/useLocalStorageStateHandler.tsx","../src/components/useLocationStateHandler.tsx","../src/stores/StateChangeEvent.ts"],"sourcesContent":["import React from 'react';\nimport { useLocation } from 'react-router-dom';\n\nexport const ScrollToTop = (): null => {\n\tconst location = useLocation();\n\n\tReact.useLayoutEffect(() => {\n\t\twindow.scrollTo(0, 0);\n\t}, [location]);\n\n\treturn null;\n};\n","import type { StateChangeEvent } from '@/stores/StateChangeEvent';\nimport { isEqual, omitBy } from 'lodash-es';\nimport { reaction } from 'mobx';\nimport React from 'react';\n\nexport const useRestoreState = <TState,>(\n\tpopStateRef: React.MutableRefObject<boolean>,\n\tdeserializer: () => any,\n\tstateValidator: (state: any) => state is TState,\n\tstateSetter: (state: TState) => void,\n): void => {\n\tReact.useEffect(() => {\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\nexport const useHandleStateChange = <TState extends Partial<TState>>(\n\tpopStateRef: React.MutableRefObject<boolean>,\n\tonStateChange: ((event: StateChangeEvent<TState>) => void) | undefined,\n\tstateGetter: () => TState,\n): void => {\n\tReact.useEffect(() => {\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\tReact.useEffect(() => {\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\nexport const useSaveState = <TState,>(\n\tpopStateRef: React.MutableRefObject<boolean>,\n\tstateGetter: () => TState,\n\tserializer: (state: TState) => void,\n): void => {\n\tReact.useEffect(() => {\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 = React.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","import type { LocalStorageStateStore } from '@/stores/LocalStorageStateStore';\nimport type { StateChangeEvent } from '@/stores/StateChangeEvent';\nimport React from 'react';\n\nimport { useStateHandler } from './useStateHandler';\n\nexport const useLocalStorageStateDeserializer = (key: string): (() => any) => {\n\treturn React.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\nexport const useLocalStorageStateSerializer = <TState,>(\n\tkey: string,\n): ((state: TState) => void) => {\n\treturn React.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\nexport const 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\nexport const useLocalStorageStateSetter = <TState,>(\n\tstore: LocalStorageStateStore<TState>,\n): ((state: TState) => void) => {\n\treturn React.useCallback(\n\t\t(state: TState): void => {\n\t\t\tstore.localStorageState = state;\n\t\t},\n\t\t[store],\n\t);\n};\n\nexport const useLocalStorageStateGetter = <TState,>(\n\tstore: LocalStorageStateStore<TState>,\n): (() => TState) => {\n\treturn React.useCallback((): TState => store.localStorageState, [store]);\n};\n\nexport const useLocalStorageStateStore = <TState,>(\n\tkey: string,\n\tstore: LocalStorageStateStore<TState>,\n): void => {\n\tconst stateSetter = useLocalStorageStateSetter(store);\n\tconst stateGetter = useLocalStorageStateGetter(store);\n\tuseLocalStorageStateHandler(\n\t\tkey,\n\t\tstore.validateLocalStorageState,\n\t\tstateSetter,\n\t\tstore.onLocalStorageStateChange,\n\t\tstateGetter,\n\t);\n};\n","import type { LocationStateStore } from '@/stores/LocationStateStore';\nimport type { StateChangeEvent } from '@/stores/StateChangeEvent';\nimport { type ParsedQs, parse, stringify } from 'qs';\nimport React from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\n\nimport { useStateHandler } from './useStateHandler';\n\nexport const useLocationStateDeserializer = (): (() => ParsedQs) => {\n\tconst location = useLocation();\n\n\t// Pass `location` as deps instead of `location.search`.\n\treturn React.useCallback(\n\t\t(): ParsedQs => parse(location.search.slice(1)),\n\t\t[location],\n\t);\n};\n\nexport const useLocationStateSerializer = <TState,>(): ((\n\tstate: TState,\n) => void) => {\n\tconst navigate = useNavigate();\n\n\treturn React.useCallback(\n\t\t(state: TState): void => {\n\t\t\tconst newUrl = `?${stringify(state)}`;\n\t\t\tnavigate(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. */\nexport const 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\nexport const useLocationStateSetter = <TState,>(\n\tstore: LocationStateStore<TState>,\n): ((state: TState) => void) => {\n\treturn React.useCallback(\n\t\t(state: TState): void => {\n\t\t\tstore.locationState = state;\n\t\t},\n\t\t[store],\n\t);\n};\n\nexport const useLocationStateGetter = <TState,>(\n\tstore: LocationStateStore<TState>,\n): (() => TState) => {\n\treturn React.useCallback((): TState => store.locationState, [store]);\n};\n\n/** Updates a store that implements the {@link LocationStateStore} interface when a route changes, and vice versa. */\nexport const useLocationStateStore = <TState,>(\n\tstore: LocationStateStore<TState>,\n): void => {\n\tconst stateSetter = useLocationStateSetter(store);\n\tconst stateGetter = useLocationStateGetter(store);\n\tuseLocationStateHandler(\n\t\tstore.validateLocationState,\n\t\tstateSetter,\n\t\tstore.onLocationStateChange,\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\nexport interface StateChangeEvent<TState> {\n\tkeys: (keyof TState)[];\n\tpopState: boolean;\n}\n"],"names":["ScrollToTop","location","useLocation","React","useRestoreState","popStateRef","deserializer","stateValidator","stateSetter","state","useHandleStateChange","onStateChange","stateGetter","reaction","previousState","diff","omitBy","v","k","isEqual","keys","useSaveState","serializer","useStateHandler","useLocalStorageStateDeserializer","key","error","useLocalStorageStateSerializer","useLocalStorageStateHandler","useLocalStorageStateSetter","store","useLocalStorageStateGetter","useLocalStorageStateStore","useLocationStateDeserializer","parse","useLocationStateSerializer","navigate","useNavigate","newUrl","stringify","useLocationStateHandler","useLocationStateSetter","useLocationStateGetter","useLocationStateStore","includesAny","array","values","value"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/components/ScrollToTop.tsx","../src/components/useStateHandler.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 { 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","import type { IReactiveStateStore } from '@/stores/IReactiveStateStore';\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: IReactiveStateStore<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: IReactiveStateStore<TState>,\n): (() => TState) => {\n\treturn useCallback((): TState => store.state, [store]);\n};\n\nexport const useLocalStorageState = <TState,>(\n\tkey: string,\n\tstore: IReactiveStateStore<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","useRestoreState","popStateRef","deserializer","stateValidator","stateSetter","useEffect","state","useHandleStateChange","onStateChange","stateGetter","reaction","previousState","diff","omitBy","v","k","isEqual","keys","useSaveState","serializer","useStateHandler","useRef","useLocalStorageStateDeserializer","key","useCallback","error","useLocalStorageStateSerializer","useLocalStorageStateHandler","useLocalStorageStateSetter","store","useLocalStorageStateGetter","useLocalStorageState","includesAny","array","values","value"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.es.js
CHANGED
|
@@ -1,45 +1,44 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { useLocation as
|
|
3
|
-
import { omitBy as g, isEqual as
|
|
4
|
-
import { reaction as
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
return r.useLayoutEffect(() => {
|
|
1
|
+
import { useLayoutEffect as f, useRef as m, useEffect as u, useCallback as a } from "react";
|
|
2
|
+
import { useLocation as d } from "react-router-dom";
|
|
3
|
+
import { omitBy as g, isEqual as L } from "lodash-es";
|
|
4
|
+
import { reaction as l } from "mobx";
|
|
5
|
+
const z = () => {
|
|
6
|
+
const t = d();
|
|
7
|
+
return f(() => {
|
|
9
8
|
window.scrollTo(0, 0);
|
|
10
9
|
}, [t]), null;
|
|
11
|
-
},
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
}, [e,
|
|
16
|
-
},
|
|
17
|
-
|
|
10
|
+
}, y = (t, e, r, o) => {
|
|
11
|
+
u(() => {
|
|
12
|
+
const s = e();
|
|
13
|
+
r(s) && (t.current = !0, o(s), t.current = !1);
|
|
14
|
+
}, [e, r, t, o]);
|
|
15
|
+
}, w = (t, e, r) => {
|
|
16
|
+
u(() => {
|
|
18
17
|
if (e)
|
|
19
|
-
return
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
(
|
|
23
|
-
),
|
|
24
|
-
console.assert(
|
|
18
|
+
return l(r, (o, s) => {
|
|
19
|
+
const n = g(
|
|
20
|
+
o,
|
|
21
|
+
(i, S) => L(s[S], i)
|
|
22
|
+
), c = Object.keys(n);
|
|
23
|
+
console.assert(c.length > 0), e({ keys: c, popState: t.current });
|
|
25
24
|
});
|
|
26
|
-
}, [
|
|
25
|
+
}, [r, e, t]), u(() => {
|
|
27
26
|
if (!e) return;
|
|
28
|
-
const
|
|
27
|
+
const o = Object.keys(r());
|
|
29
28
|
e({
|
|
30
|
-
keys:
|
|
29
|
+
keys: o,
|
|
31
30
|
popState: !0
|
|
32
31
|
/* Always true. */
|
|
33
32
|
});
|
|
34
|
-
}, [
|
|
35
|
-
}, p = (t, e,
|
|
36
|
-
|
|
37
|
-
t.current || o
|
|
38
|
-
}), [e, t,
|
|
39
|
-
},
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
},
|
|
33
|
+
}, [r, e]);
|
|
34
|
+
}, p = (t, e, r) => {
|
|
35
|
+
u(() => l(e, (o) => {
|
|
36
|
+
t.current || r(o);
|
|
37
|
+
}), [e, t, r]);
|
|
38
|
+
}, O = (t, e, r, o, s, n) => {
|
|
39
|
+
const c = m(!1);
|
|
40
|
+
y(c, t, e, r), w(c, o, s), p(c, s, n);
|
|
41
|
+
}, b = (t) => a(() => {
|
|
43
42
|
try {
|
|
44
43
|
return JSON.parse(
|
|
45
44
|
window.localStorage.getItem(t) ?? JSON.stringify({})
|
|
@@ -47,92 +46,40 @@ const x = () => {
|
|
|
47
46
|
} catch (e) {
|
|
48
47
|
return console.error(e), {};
|
|
49
48
|
}
|
|
50
|
-
}, [t]),
|
|
49
|
+
}, [t]), E = (t) => a(
|
|
51
50
|
(e) => {
|
|
52
51
|
window.localStorage.setItem(t, JSON.stringify(e));
|
|
53
52
|
},
|
|
54
53
|
[t]
|
|
55
|
-
),
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
54
|
+
), H = (t, e, r, o, s) => {
|
|
55
|
+
const n = b(t), c = E(t);
|
|
56
|
+
O(
|
|
57
|
+
n,
|
|
59
58
|
e,
|
|
59
|
+
r,
|
|
60
60
|
o,
|
|
61
|
-
|
|
62
|
-
c
|
|
63
|
-
n
|
|
61
|
+
s,
|
|
62
|
+
c
|
|
64
63
|
);
|
|
65
|
-
},
|
|
64
|
+
}, J = (t) => a(
|
|
66
65
|
(e) => {
|
|
67
|
-
t.
|
|
66
|
+
t.state = e;
|
|
68
67
|
},
|
|
69
68
|
[t]
|
|
70
|
-
),
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
t,
|
|
74
|
-
e.validateLocalStorageState,
|
|
75
|
-
o,
|
|
76
|
-
e.onLocalStorageStateChange,
|
|
77
|
-
a
|
|
78
|
-
);
|
|
79
|
-
}, O = () => {
|
|
80
|
-
const t = l();
|
|
81
|
-
return r.useCallback(
|
|
82
|
-
() => d(t.search.slice(1)),
|
|
83
|
-
[t]
|
|
84
|
-
);
|
|
85
|
-
}, H = () => {
|
|
86
|
-
const t = L();
|
|
87
|
-
return r.useCallback(
|
|
88
|
-
(e) => {
|
|
89
|
-
const o = `?${b(e)}`;
|
|
90
|
-
t(o);
|
|
91
|
-
},
|
|
92
|
-
[t]
|
|
93
|
-
);
|
|
94
|
-
}, N = (t, e, o, a) => {
|
|
95
|
-
const c = O(), s = H();
|
|
96
|
-
i(
|
|
97
|
-
c,
|
|
69
|
+
), N = (t) => a(() => t.state, [t]), I = (t, e) => {
|
|
70
|
+
const r = J(e), o = N(e);
|
|
71
|
+
H(
|
|
98
72
|
t,
|
|
99
|
-
e,
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
s
|
|
103
|
-
);
|
|
104
|
-
}, J = (t) => r.useCallback(
|
|
105
|
-
(e) => {
|
|
106
|
-
t.locationState = e;
|
|
107
|
-
},
|
|
108
|
-
[t]
|
|
109
|
-
), T = (t) => r.useCallback(() => t.locationState, [t]), B = (t) => {
|
|
110
|
-
const e = J(t), o = T(t);
|
|
111
|
-
N(
|
|
112
|
-
t.validateLocationState,
|
|
113
|
-
e,
|
|
114
|
-
t.onLocationStateChange,
|
|
73
|
+
e.validateState,
|
|
74
|
+
r,
|
|
75
|
+
e.onStateChange,
|
|
115
76
|
o
|
|
116
77
|
);
|
|
117
|
-
},
|
|
78
|
+
}, q = (t, e) => e.some((r) => t.includes(r));
|
|
118
79
|
export {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
v as useLocalStorageStateGetter,
|
|
124
|
-
C as useLocalStorageStateHandler,
|
|
125
|
-
z as useLocalStorageStateSerializer,
|
|
126
|
-
E as useLocalStorageStateSetter,
|
|
127
|
-
A as useLocalStorageStateStore,
|
|
128
|
-
O as useLocationStateDeserializer,
|
|
129
|
-
T as useLocationStateGetter,
|
|
130
|
-
N as useLocationStateHandler,
|
|
131
|
-
H as useLocationStateSerializer,
|
|
132
|
-
J as useLocationStateSetter,
|
|
133
|
-
B as useLocationStateStore,
|
|
134
|
-
k as useRestoreState,
|
|
135
|
-
p as useSaveState,
|
|
136
|
-
i as useStateHandler
|
|
80
|
+
z as ScrollToTop,
|
|
81
|
+
q as includesAny,
|
|
82
|
+
I as useLocalStorageState,
|
|
83
|
+
O as useStateHandler
|
|
137
84
|
};
|
|
138
85
|
//# sourceMappingURL=index.es.js.map
|
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/components/ScrollToTop.tsx","../src/components/useStateHandler.tsx","../src/components/useLocalStorageStateHandler.tsx","../src/components/useLocationStateHandler.tsx","../src/stores/StateChangeEvent.ts"],"sourcesContent":["import React from 'react';\nimport { useLocation } from 'react-router-dom';\n\nexport const ScrollToTop = (): null => {\n\tconst location = useLocation();\n\n\tReact.useLayoutEffect(() => {\n\t\twindow.scrollTo(0, 0);\n\t}, [location]);\n\n\treturn null;\n};\n","import type { StateChangeEvent } from '@/stores/StateChangeEvent';\nimport { isEqual, omitBy } from 'lodash-es';\nimport { reaction } from 'mobx';\nimport React from 'react';\n\nexport const useRestoreState = <TState,>(\n\tpopStateRef: React.MutableRefObject<boolean>,\n\tdeserializer: () => any,\n\tstateValidator: (state: any) => state is TState,\n\tstateSetter: (state: TState) => void,\n): void => {\n\tReact.useEffect(() => {\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\nexport const useHandleStateChange = <TState extends Partial<TState>>(\n\tpopStateRef: React.MutableRefObject<boolean>,\n\tonStateChange: ((event: StateChangeEvent<TState>) => void) | undefined,\n\tstateGetter: () => TState,\n): void => {\n\tReact.useEffect(() => {\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\tReact.useEffect(() => {\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\nexport const useSaveState = <TState,>(\n\tpopStateRef: React.MutableRefObject<boolean>,\n\tstateGetter: () => TState,\n\tserializer: (state: TState) => void,\n): void => {\n\tReact.useEffect(() => {\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 = React.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","import type { LocalStorageStateStore } from '@/stores/LocalStorageStateStore';\nimport type { StateChangeEvent } from '@/stores/StateChangeEvent';\nimport React from 'react';\n\nimport { useStateHandler } from './useStateHandler';\n\nexport const useLocalStorageStateDeserializer = (key: string): (() => any) => {\n\treturn React.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\nexport const useLocalStorageStateSerializer = <TState,>(\n\tkey: string,\n): ((state: TState) => void) => {\n\treturn React.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\nexport const 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\nexport const useLocalStorageStateSetter = <TState,>(\n\tstore: LocalStorageStateStore<TState>,\n): ((state: TState) => void) => {\n\treturn React.useCallback(\n\t\t(state: TState): void => {\n\t\t\tstore.localStorageState = state;\n\t\t},\n\t\t[store],\n\t);\n};\n\nexport const useLocalStorageStateGetter = <TState,>(\n\tstore: LocalStorageStateStore<TState>,\n): (() => TState) => {\n\treturn React.useCallback((): TState => store.localStorageState, [store]);\n};\n\nexport const useLocalStorageStateStore = <TState,>(\n\tkey: string,\n\tstore: LocalStorageStateStore<TState>,\n): void => {\n\tconst stateSetter = useLocalStorageStateSetter(store);\n\tconst stateGetter = useLocalStorageStateGetter(store);\n\tuseLocalStorageStateHandler(\n\t\tkey,\n\t\tstore.validateLocalStorageState,\n\t\tstateSetter,\n\t\tstore.onLocalStorageStateChange,\n\t\tstateGetter,\n\t);\n};\n","import type { LocationStateStore } from '@/stores/LocationStateStore';\nimport type { StateChangeEvent } from '@/stores/StateChangeEvent';\nimport { type ParsedQs, parse, stringify } from 'qs';\nimport React from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\n\nimport { useStateHandler } from './useStateHandler';\n\nexport const useLocationStateDeserializer = (): (() => ParsedQs) => {\n\tconst location = useLocation();\n\n\t// Pass `location` as deps instead of `location.search`.\n\treturn React.useCallback(\n\t\t(): ParsedQs => parse(location.search.slice(1)),\n\t\t[location],\n\t);\n};\n\nexport const useLocationStateSerializer = <TState,>(): ((\n\tstate: TState,\n) => void) => {\n\tconst navigate = useNavigate();\n\n\treturn React.useCallback(\n\t\t(state: TState): void => {\n\t\t\tconst newUrl = `?${stringify(state)}`;\n\t\t\tnavigate(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. */\nexport const 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\nexport const useLocationStateSetter = <TState,>(\n\tstore: LocationStateStore<TState>,\n): ((state: TState) => void) => {\n\treturn React.useCallback(\n\t\t(state: TState): void => {\n\t\t\tstore.locationState = state;\n\t\t},\n\t\t[store],\n\t);\n};\n\nexport const useLocationStateGetter = <TState,>(\n\tstore: LocationStateStore<TState>,\n): (() => TState) => {\n\treturn React.useCallback((): TState => store.locationState, [store]);\n};\n\n/** Updates a store that implements the {@link LocationStateStore} interface when a route changes, and vice versa. */\nexport const useLocationStateStore = <TState,>(\n\tstore: LocationStateStore<TState>,\n): void => {\n\tconst stateSetter = useLocationStateSetter(store);\n\tconst stateGetter = useLocationStateGetter(store);\n\tuseLocationStateHandler(\n\t\tstore.validateLocationState,\n\t\tstateSetter,\n\t\tstore.onLocationStateChange,\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\nexport interface StateChangeEvent<TState> {\n\tkeys: (keyof TState)[];\n\tpopState: boolean;\n}\n"],"names":["ScrollToTop","location","useLocation","React","useRestoreState","popStateRef","deserializer","stateValidator","stateSetter","state","useHandleStateChange","onStateChange","stateGetter","reaction","previousState","diff","omitBy","v","k","isEqual","keys","useSaveState","serializer","useStateHandler","useLocalStorageStateDeserializer","key","error","useLocalStorageStateSerializer","useLocalStorageStateHandler","useLocalStorageStateSetter","store","useLocalStorageStateGetter","useLocalStorageStateStore","useLocationStateDeserializer","parse","useLocationStateSerializer","navigate","useNavigate","newUrl","stringify","useLocationStateHandler","useLocationStateSetter","useLocationStateGetter","useLocationStateStore","includesAny","array","values","value"],"mappings":";;;;;AAGO,MAAMA,IAAc,MAAY;AACtC,QAAMC,IAAWC,EAAA;AAEjB,SAAAC,EAAM,gBAAgB,MAAM;AAC3B,WAAO,SAAS,GAAG,CAAC;AAAA,EACrB,GAAG,CAACF,CAAQ,CAAC,GAEN;AACR,GCNaG,IAAkB,CAC9BC,GACAC,GACAC,GACAC,MACU;AACV,EAAAL,EAAM,UAAU,MAAM;AACrB,UAAMM,IAAQH,EAAA;AAEd,IAAIC,EAAeE,CAAK,MACvBJ,EAAY,UAAU,IAEtBG,EAAYC,CAAK,GAEjBJ,EAAY,UAAU;AAAA,EAExB,GAAG,CAACC,GAAcC,GAAgBF,GAAaG,CAAW,CAAC;AAC5D,GAEaE,IAAuB,CACnCL,GACAM,GACAC,MACU;AACV,EAAAT,EAAM,UAAU,MAAM;AACrB,QAAKQ;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,UAAUf,EAAY,SAAS;AAAA,MAC5D,CAAC;AAAA,EACF,GAAG,CAACO,GAAaD,GAAeN,CAAW,CAAC,GAG5CF,EAAM,UAAU,MAAM;AACrB,QAAI,CAACQ,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,GAEaU,IAAe,CAC3BhB,GACAO,GACAU,MACU;AACV,EAAAnB,EAAM,UAAU,MAERU,EAASD,GAAa,CAACH,MAAU;AACvC,IAAIJ,EAAY,WAEhBiB,EAAWb,CAAK;AAAA,EACjB,CAAC,GACC,CAACG,GAAaP,GAAaiB,CAAU,CAAC;AAC1C,GAEaC,IAAkB,CAC9BjB,GACAC,GACAC,GACAG,GACAC,GACAU,MACU;AAEV,QAAMjB,IAAcF,EAAM,OAAO,EAAK;AAEtC,EAAAC,EAAgBC,GAAaC,GAAcC,GAAgBC,CAAW,GAGtEE,EAAqBL,GAAaM,GAAeC,CAAW,GAE5DS,EAAahB,GAAaO,GAAaU,CAAU;AAClD,GCpFaE,IAAmC,CAACC,MACzCtB,EAAM,YAAY,MAAW;AACnC,MAAI;AACH,WAAO,KAAK;AAAA,MACX,OAAO,aAAa,QAAQsB,CAAG,KAAK,KAAK,UAAU,CAAA,CAAE;AAAA,IAAA;AAAA,EAEvD,SAASC,GAAO;AACf,mBAAQ,MAAMA,CAAK,GACZ,CAAA;AAAA,EACR;AACD,GAAG,CAACD,CAAG,CAAC,GAGIE,IAAiC,CAC7CF,MAEOtB,EAAM;AAAA,EACZ,CAACM,MAAwB;AACxB,WAAO,aAAa,QAAQgB,GAAK,KAAK,UAAUhB,CAAK,CAAC;AAAA,EACvD;AAAA,EACA,CAACgB,CAAG;AAAA,GAIOG,IAA8B,CAC1CH,GACAlB,GACAC,GACAG,GACAC,MACU;AACV,QAAMN,IAAekB,EAAiCC,CAAG,GACnDH,IAAaK,EAA+BF,CAAG;AACrD,EAAAF;AAAA,IACCjB;AAAA,IACAC;AAAA,IACAC;AAAA,IACAG;AAAA,IACAC;AAAA,IACAU;AAAA,EAAA;AAEF,GAEaO,IAA6B,CACzCC,MAEO3B,EAAM;AAAA,EACZ,CAACM,MAAwB;AACxB,IAAAqB,EAAM,oBAAoBrB;AAAA,EAC3B;AAAA,EACA,CAACqB,CAAK;AAAA,GAIKC,IAA6B,CACzCD,MAEO3B,EAAM,YAAY,MAAc2B,EAAM,mBAAmB,CAACA,CAAK,CAAC,GAG3DE,IAA4B,CACxCP,GACAK,MACU;AACV,QAAMtB,IAAcqB,EAA2BC,CAAK,GAC9ClB,IAAcmB,EAA2BD,CAAK;AACpD,EAAAF;AAAA,IACCH;AAAA,IACAK,EAAM;AAAA,IACNtB;AAAA,IACAsB,EAAM;AAAA,IACNlB;AAAA,EAAA;AAEF,GCvEaqB,IAA+B,MAAwB;AACnE,QAAMhC,IAAWC,EAAA;AAGjB,SAAOC,EAAM;AAAA,IACZ,MAAgB+B,EAAMjC,EAAS,OAAO,MAAM,CAAC,CAAC;AAAA,IAC9C,CAACA,CAAQ;AAAA,EAAA;AAEX,GAEakC,IAA6B,MAE5B;AACb,QAAMC,IAAWC,EAAA;AAEjB,SAAOlC,EAAM;AAAA,IACZ,CAACM,MAAwB;AACxB,YAAM6B,IAAS,IAAIC,EAAU9B,CAAK,CAAC;AACnC,MAAA2B,EAASE,CAAM;AAAA,IAChB;AAAA,IACA,CAACF,CAAQ;AAAA,EAAA;AAEX,GAGaI,IAA0B,CACtCjC,GACAC,GACAG,GACAC,MACU;AACV,QAAMN,IAAe2B,EAAA,GACfX,IAAaa,EAAA;AACnB,EAAAZ;AAAA,IACCjB;AAAA,IACAC;AAAA,IACAC;AAAA,IACAG;AAAA,IACAC;AAAA,IACAU;AAAA,EAAA;AAEF,GAEamB,IAAyB,CACrCX,MAEO3B,EAAM;AAAA,EACZ,CAACM,MAAwB;AACxB,IAAAqB,EAAM,gBAAgBrB;AAAA,EACvB;AAAA,EACA,CAACqB,CAAK;AAAA,GAIKY,IAAyB,CACrCZ,MAEO3B,EAAM,YAAY,MAAc2B,EAAM,eAAe,CAACA,CAAK,CAAC,GAIvDa,IAAwB,CACpCb,MACU;AACV,QAAMtB,IAAciC,EAAuBX,CAAK,GAC1ClB,IAAc8B,EAAuBZ,CAAK;AAChD,EAAAU;AAAA,IACCV,EAAM;AAAA,IACNtB;AAAA,IACAsB,EAAM;AAAA,IACNlB;AAAA,EAAA;AAEF,GChFagC,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/useStateHandler.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 { 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","import type { IReactiveStateStore } from '@/stores/IReactiveStateStore';\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: IReactiveStateStore<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: IReactiveStateStore<TState>,\n): (() => TState) => {\n\treturn useCallback((): TState => store.state, [store]);\n};\n\nexport const useLocalStorageState = <TState,>(\n\tkey: string,\n\tstore: IReactiveStateStore<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","useRestoreState","popStateRef","deserializer","stateValidator","stateSetter","useEffect","state","useHandleStateChange","onStateChange","stateGetter","reaction","previousState","diff","omitBy","v","k","isEqual","keys","useSaveState","serializer","useStateHandler","useRef","useLocalStorageStateDeserializer","key","useCallback","error","useLocalStorageStateSerializer","useLocalStorageStateHandler","useLocalStorageStateSetter","store","useLocalStorageStateGetter","useLocalStorageState","includesAny","array","values","value"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './useLocationState';
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { IReactiveStateStore } from '../stores/IReactiveStateStore';
|
|
2
|
+
/** Updates a store that implements the {@link LocationStateStore} interface when a route changes, and vice versa. */
|
|
3
|
+
export declare const useLocationState: <TState>(store: IReactiveStateStore<TState>) => void;
|
package/dist/stores/index.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './useLocationState';
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { IReactiveStateStore } from '../stores/IReactiveStateStore';
|
|
2
|
+
/** Updates a store that implements the {@link LocationStateStore} interface when a route changes, and vice versa. */
|
|
3
|
+
export declare const useLocationState: <TState>(store: IReactiveStateStore<TState>) => void;
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aigamo/route-sphere",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.1.0-1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"dependencies": {},
|
|
6
6
|
"devDependencies": {
|
|
7
7
|
"@eslint/compat": "^2.0.0",
|
|
8
8
|
"@eslint/eslintrc": "^3.3.3",
|
|
9
|
+
"@tanstack/react-router": "^1.144.0",
|
|
9
10
|
"@trivago/prettier-plugin-sort-imports": "^6.0.0",
|
|
10
11
|
"@types/lodash-es": "^4.17.12",
|
|
11
12
|
"@types/node": "^25.0.3",
|
|
@@ -39,6 +40,7 @@
|
|
|
39
40
|
"vitest": "^4.0.16"
|
|
40
41
|
},
|
|
41
42
|
"peerDependencies": {
|
|
43
|
+
"@tanstack/react-router": "^1.144.0",
|
|
42
44
|
"lodash-es": "^4.17.22",
|
|
43
45
|
"mobx": "^6.15.0",
|
|
44
46
|
"mobx-react-lite": "^3.0.0 || ^4.0.0",
|
|
@@ -63,6 +65,26 @@
|
|
|
63
65
|
"types": "./dist/index.d.ts",
|
|
64
66
|
"default": "./dist/index.cjs.js"
|
|
65
67
|
}
|
|
68
|
+
},
|
|
69
|
+
"./react-router": {
|
|
70
|
+
"import": {
|
|
71
|
+
"types": "./dist/react-router/index.d.ts",
|
|
72
|
+
"default": "./dist/react-router/index.es.js"
|
|
73
|
+
},
|
|
74
|
+
"require": {
|
|
75
|
+
"types": "./dist/react-router/index.d.ts",
|
|
76
|
+
"default": "./dist/react-router/index.cjs.js"
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
"./tanstack-router": {
|
|
80
|
+
"import": {
|
|
81
|
+
"types": "./dist/tanstack-router/index.d.ts",
|
|
82
|
+
"default": "./dist/tanstack-router/index.es.js"
|
|
83
|
+
},
|
|
84
|
+
"require": {
|
|
85
|
+
"types": "./dist/tanstack-router/index.d.ts",
|
|
86
|
+
"default": "./dist/tanstack-router/index.cjs.js"
|
|
87
|
+
}
|
|
66
88
|
}
|
|
67
89
|
},
|
|
68
90
|
"description": "Sync query parameters with a MobX store and React Router.",
|
|
@@ -83,6 +105,7 @@
|
|
|
83
105
|
"scripts": {
|
|
84
106
|
"clean": "rimraf ./dist",
|
|
85
107
|
"build": "pnpm clean && tsgo -b && vite build",
|
|
108
|
+
"build:watch": "pnpm build --watch",
|
|
86
109
|
"lint": "eslint ."
|
|
87
110
|
}
|
|
88
111
|
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { LocalStorageStateStore } from '../stores/LocalStorageStateStore';
|
|
2
|
-
import { StateChangeEvent } from '../stores/StateChangeEvent';
|
|
3
|
-
export declare const useLocalStorageStateDeserializer: (key: string) => (() => any);
|
|
4
|
-
export declare const useLocalStorageStateSerializer: <TState>(key: string) => ((state: TState) => void);
|
|
5
|
-
export declare const useLocalStorageStateHandler: <TState>(key: string, stateValidator: (state: any) => state is TState, stateSetter: (state: TState) => void, onStateChange: ((event: StateChangeEvent<TState>) => void) | undefined, stateGetter: () => TState) => void;
|
|
6
|
-
export declare const useLocalStorageStateSetter: <TState>(store: LocalStorageStateStore<TState>) => ((state: TState) => void);
|
|
7
|
-
export declare const useLocalStorageStateGetter: <TState>(store: LocalStorageStateStore<TState>) => (() => TState);
|
|
8
|
-
export declare const useLocalStorageStateStore: <TState>(key: string, store: LocalStorageStateStore<TState>) => void;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { LocationStateStore } from '../stores/LocationStateStore';
|
|
2
|
-
import { StateChangeEvent } from '../stores/StateChangeEvent';
|
|
3
|
-
import { ParsedQs } from 'qs';
|
|
4
|
-
export declare const useLocationStateDeserializer: () => (() => ParsedQs);
|
|
5
|
-
export declare const useLocationStateSerializer: <TState>() => ((state: TState) => void);
|
|
6
|
-
/** Updates a store that implements the {@link LocationStateStore} interface when a route changes, and vice versa. */
|
|
7
|
-
export declare const useLocationStateHandler: <TState>(stateValidator: (state: any) => state is TState, stateSetter: (state: TState) => void, onStateChange: ((event: StateChangeEvent<TState>) => void) | undefined, stateGetter: () => TState) => void;
|
|
8
|
-
export declare const useLocationStateSetter: <TState>(store: LocationStateStore<TState>) => ((state: TState) => void);
|
|
9
|
-
export declare const useLocationStateGetter: <TState>(store: LocationStateStore<TState>) => (() => TState);
|
|
10
|
-
/** Updates a store that implements the {@link LocationStateStore} interface when a route changes, and vice versa. */
|
|
11
|
-
export declare const useLocationStateStore: <TState>(store: LocationStateStore<TState>) => void;
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { StateChangeEvent } from './StateChangeEvent';
|
|
2
|
-
export interface LocalStorageStateStore<TState> {
|
|
3
|
-
localStorageState: TState;
|
|
4
|
-
validateLocalStorageState(localStorageState: any): localStorageState is TState;
|
|
5
|
-
onLocalStorageStateChange?(event: StateChangeEvent<TState>): void;
|
|
6
|
-
}
|