use-sharable-state
Version:
This packages makes sharing states simpler
1 lines • 5.19 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../src/store.ts","../src/useSharableState.ts"],"sourcesContent":["const store = (<F extends (state: any) => void, S = any>() => {\n const generateId = () => {\n return (Date.now().toString(36) + Math.random().toString(36)).replace(\n /\\./g,\n \"\",\n );\n };\n\n const mappedData: { [K: string]: { value: S; setters: { [K: string]: F } } } =\n {};\n\n const addSetter = ({\n stateKey,\n setterKey,\n setter,\n initialValue,\n }: {\n stateKey: string;\n setterKey: string;\n setter: F;\n initialValue?: any;\n }) => {\n if (mappedData[stateKey]) {\n mappedData[stateKey].setters[setterKey] = setter;\n } else {\n mappedData[stateKey] = {\n value: initialValue,\n setters: { [setterKey]: setter },\n };\n }\n };\n\n const removeSetter = ({\n stateKey,\n setterKey,\n }: {\n stateKey: string;\n setterKey: string;\n }) => {\n if (mappedData[stateKey]?.setters[setterKey]) {\n delete mappedData[stateKey].setters[setterKey];\n }\n };\n\n const updateState = ({\n stateKey,\n value,\n }: {\n stateKey: string;\n value: any;\n }) => {\n const data = mappedData[stateKey];\n\n if (data) {\n data.value = value;\n\n Object.entries(data.setters).forEach(([, setter]) => {\n setter(value);\n });\n }\n };\n\n const getCurrentState = (stateKey: string) => {\n return mappedData[stateKey]?.value;\n };\n\n const getCurrentSetter = ({\n stateKey,\n setterKey,\n }: {\n stateKey: string;\n setterKey: string;\n }) => {\n return mappedData[stateKey]?.setters[setterKey];\n };\n\n const clearStates = () => {\n Object.entries(mappedData).forEach(([stateKey, state]) => {\n if (state.setters) {\n Object.entries(state.setters).forEach(([, setter]) => {\n setter(undefined);\n });\n }\n\n delete mappedData[stateKey];\n });\n };\n\n return {\n mappedData,\n\n addSetter,\n removeSetter,\n updateState,\n getCurrentState,\n getCurrentSetter,\n generateId,\n clearStates,\n };\n})();\n\nexport default store;\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport store from \"./store\";\n\ntype Action<S> = (prevState: S) => S;\nexport type Dispatch<S> = (value: S | Action<S>) => void;\n\nexport const useSharableState = <S>(\n stateKey: string,\n initialState?: S,\n): [S, Dispatch<S>] => {\n const setterKey = useRef(store.generateId());\n\n const initialValue = useMemo(\n () => store.getCurrentState(stateKey) || initialState,\n [initialState, stateKey],\n );\n\n const [state, setState] = useState<S>(initialValue);\n\n useEffect(() => {\n const stk = setterKey.current;\n\n if (!store.getCurrentSetter({ stateKey, setterKey: setterKey.current })) {\n store.addSetter({\n stateKey,\n initialValue,\n setter: setState,\n setterKey: stk,\n });\n }\n\n return () => store.removeSetter({ stateKey, setterKey: stk });\n }, [initialValue, stateKey]);\n\n const updateState: Dispatch<S> = useCallback(\n (value) => {\n if (typeof value === \"function\") {\n store.updateState({\n stateKey,\n value: (value as Action<S>)(store.getCurrentState(stateKey)),\n });\n } else {\n store.updateState({ stateKey, value });\n }\n },\n [stateKey],\n );\n\n return [state, updateState];\n};\n"],"names":["mappedData","_ref","stateKey","setterKey","setter","initialValue","setters","value","_setters","_mappedData$stateKey2","initialState","useRef","Date","now","toString","Math","random","replace","useMemo","store","useState","state","setState","useEffect","_ref5","stk","current","_mappedData$stateKey3","_ref2","_mappedData$stateKey","useCallback","data","Object","entries","forEach"],"mappings":"IAQkBA,wBAAAA,EACd,CAAA,EAEgB,SAAAC,OAcdD,EAJCE,EAAAD,EATHC,SACAC,EAAAA,EAAAA,UACAC,EAOGH,EAPHG,OACAC,EAAAA,EAAAA,aAOIL,EAAWE,GACbF,EAAWE,GAAUI,QAAQH,GAAaC,EAE1CJ,EAAWE,GAAY,CACrBK,MAAOF,EACPC,gBAAYH,GAAYC,EAFHI,GAK1B,KAgCuB,SAACN,GAAoB,IAAAO,EAC3C,gBAAOT,EAAWE,WAAXO,EAAsBF,KAC9B,2BCzD6B,SAC9BL,EACAQ,GAEA,IAAMP,EAAYQ,EAAAA,QDTRC,KAAKC,MAAMC,SAAS,IAAMC,KAAKC,SAASF,SAAS,KAAKG,QAC5D,MACA,KCScZ,EAAGa,EAAAA,QACnB,WAAMC,OAAAA,EAAsBjB,IAAaQ,CAAzC,EACA,CAACA,EAAcR,IAGSkB,EAAAA,EAAQA,SAAIf,GAA/BgB,EAAOC,EAAAA,GAAAA,EAEdC,EAAAA,GA6BA,OA7BAA,EAASA,UAAC,WACR,ID6CuBC,IC7CjBC,EAAMtB,EAAUuB,QAWtB,cDyCO1B,EAAAA,GAPgBwB,EC3CK,CAAEtB,SAAAA,EAAUC,UAAWA,EAAUuB,UD4C7DxB,kBAMOyB,EAAsBrB,UAL7BH,aC5CEgB,EAAgB,CACdjB,SAAAA,EACAG,aAAAA,EACAD,OAAQkB,EACRnB,UAAWsB,IAIFN,WAAAA,ODAM,YACnBjB,IAAAA,EAAAA,IAAAA,SACAC,EAIGyB,EAJHzB,UAKI,OAAJ0B,EAAI7B,EAAWE,KAAX2B,EAAsBvB,QAAQH,WACzBH,EAAWE,GAAUI,QAAQH,EAEvC,CCVcgB,CAAmB,CAAEjB,SAAAA,EAAUC,UAAWsB,GAAhD,CACR,EAAE,CAACpB,EAAcH,IAgBX,CAACmB,EAdyBS,EAAWA,YAC1C,SAACvB,IDQiB,YAClBL,IACAK,EAAAA,EAAAA,QAKaP,IANbE,UAQI6B,IACFA,EAAKxB,MAAQA,EAEbyB,OAAOC,QAAQF,EAAKzB,SAAS4B,QAAQ,aACnC9B,EAAAA,EAAAA,IAAOG,EACR,GAEJ,CCtBKY,CADmB,mBAAVZ,EACS,CAChBL,SAAAA,EACAK,MAAQA,EAAoBY,EAAsBjB,KAGlC,CAAEA,SAAAA,EAAUK,MAAAA,GAEjC,EACD,CAACL,IAIJ"}