UNPKG

@yamada-ui/react

Version:

React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion

1 lines 5.86 kB
{"version":3,"file":"store.cjs","names":[],"sources":["../../../src/utils/store.ts"],"sourcesContent":["\"use client\"\n\nimport type { Path, Value } from \"@yamada-ui/utils\"\nimport {\n getMemoizedObject,\n isArray,\n isObject,\n isUndefined,\n runIfFn,\n toArray,\n} from \"@yamada-ui/utils\"\nimport { useSyncExternalStore } from \"react\"\n\nconst DEFAULT_IDENTIFIER = \"default\"\n\ninterface Subscribe {\n (listener: () => void): () => void\n}\n\ninterface Store<Y> {\n ref: { current: Y }\n get: () => Y\n queue: Map<string, (() => void)[]>\n set: (nextState: ((prevState: Y) => Y) | Y, key?: string | string[]) => void\n update: (key?: string | string[]) => void\n key?: string\n}\n\ntype IndexOrPath<Y> = Y extends any[]\n ? number\n : Y extends object\n ? Path<Y>\n : undefined\n\ntype ReturnArrayValue<Y extends any[], D> = D extends number\n ? undefined | Y[D]\n : Y\n\ntype ReturnObjectValue<Y extends object, D> = D extends string ? Value<Y, D> : Y\n\ntype ReturnValue<Y, D> = Y extends any[]\n ? ReturnArrayValue<Y, D>\n : Y extends object\n ? ReturnObjectValue<Y, D>\n : Y\n\ninterface UseStore<Y> {\n <D extends IndexOrPath<Y>>(path?: D, key?: string): ReturnValue<Y, D>\n}\n\ninterface CreateMethod<Y, M extends Function> {\n (store: Store<Y>): M\n}\n\ntype Methods<Y, M extends CustomMethods<Y>> = {\n [D in keyof M]: ReturnType<M[D]>\n} & {\n get: () => Y\n set: (nextState: ((prevState: Y) => Y) | Y, key?: string | string[]) => void\n update: () => void\n}\n\ninterface CustomMethods<Y> {\n [key: string]: CreateMethod<Y, (...args: any[]) => Promise<void> | void>\n}\n\ninterface CreateStoreOptions<Y> {\n proxyHandler?: ProxyHandler<{ current: Y }>\n subscribe?: CreateMethod<Y, Subscribe>\n}\n\nexport function createStore<Y, M extends CustomMethods<Y>>(\n initialState: (() => Y) | Y,\n additionalMethods?: M,\n options: CreateStoreOptions<Y> = {},\n): [UseStore<Y>, Methods<Y, M>] {\n const queue = new Map<string, (() => void)[]>()\n const ref = new Proxy(\n { current: runIfFn(initialState) },\n { ...options.proxyHandler },\n )\n\n function get() {\n return ref.current\n }\n\n function executeQueue(key: string) {\n const listeners = queue.get(key) ?? []\n\n if (!listeners.length)\n console.warn(`createStore: ${key} is not subscribed.`)\n\n listeners.forEach((listener) => listener())\n }\n\n function update(key?: string | string[]) {\n if (!isUndefined(key)) {\n toArray(key).forEach(executeQueue)\n }\n\n executeQueue(DEFAULT_IDENTIFIER)\n }\n\n function set(nextState: ((prevState: Y) => Y) | Y, key?: string | string[]) {\n ref.current = runIfFn(nextState, ref.current)\n\n update(key)\n }\n\n const methods = { ref, get, queue, set, update }\n\n function useStore<D extends IndexOrPath<Y>>(path?: D, key?: string) {\n const customSubscribe = options.subscribe?.({\n key,\n ...methods,\n })\n\n const subscribe = function (listener: () => void) {\n if (key) {\n const listeners = queue.get(key) ?? []\n\n if (listeners.length)\n console.warn(`createStore: ${key} is already subscribed.`)\n\n queue.set(key, [listener])\n } else {\n const listeners = queue.get(DEFAULT_IDENTIFIER) ?? []\n\n queue.set(DEFAULT_IDENTIFIER, [...listeners, listener])\n }\n\n return function () {\n if (key) {\n queue.delete(key)\n } else {\n const listeners = queue.get(DEFAULT_IDENTIFIER) ?? []\n\n queue.set(\n DEFAULT_IDENTIFIER,\n listeners.filter((fn) => fn !== listener),\n )\n }\n }\n }\n\n function getSnapshot<H extends ReturnValue<Y, D>>(): H {\n if (!isUndefined(path)) {\n if (isObject(ref.current)) {\n return getMemoizedObject(ref.current, path) as H\n } else if (isArray(ref.current)) {\n return ref.current[path as number] as unknown as H\n }\n }\n\n return ref.current as unknown as H\n }\n\n return useSyncExternalStore(\n customSubscribe ?? subscribe,\n getSnapshot,\n getSnapshot,\n )\n }\n\n const customMethods = Object.fromEntries(\n Object.entries(additionalMethods ?? {}).map(([key, value]) => [\n key,\n value(methods),\n ]),\n ) as { [D in keyof M]: ReturnType<M[D]> }\n\n return [useStore, { ...methods, ...customMethods }]\n}\n"],"mappings":";;;;;;;;;;AAaA,MAAM,qBAAqB;AA0D3B,SAAgB,YACd,cACA,mBACA,UAAiC,EAAE,EACL;CAC9B,MAAM,wBAAQ,IAAI,KAA6B;CAC/C,MAAM,MAAM,IAAI,MACd,EAAE,wCAAiB,aAAa,EAAE,EAClC,EAAE,GAAG,QAAQ,cAAc,CAC5B;CAED,SAAS,MAAM;AACb,SAAO,IAAI;;CAGb,SAAS,aAAa,KAAa;EACjC,MAAM,YAAY,MAAM,IAAI,IAAI,IAAI,EAAE;AAEtC,MAAI,CAAC,UAAU,OACb,SAAQ,KAAK,gBAAgB,IAAI,qBAAqB;AAExD,YAAU,SAAS,aAAa,UAAU,CAAC;;CAG7C,SAAS,OAAO,KAAyB;AACvC,MAAI,oCAAa,IAAI,CACnB,gCAAQ,IAAI,CAAC,QAAQ,aAAa;AAGpC,eAAa,mBAAmB;;CAGlC,SAAS,IAAI,WAAsC,KAAyB;AAC1E,MAAI,yCAAkB,WAAW,IAAI,QAAQ;AAE7C,SAAO,IAAI;;CAGb,MAAM,UAAU;EAAE;EAAK;EAAK;EAAO;EAAK;EAAQ;CAEhD,SAAS,SAAmC,MAAU,KAAc;EAClE,MAAM,kBAAkB,QAAQ,YAAY;GAC1C;GACA,GAAG;GACJ,CAAC;EAEF,MAAM,YAAY,SAAU,UAAsB;AAChD,OAAI,KAAK;AAGP,SAFkB,MAAM,IAAI,IAAI,IAAI,EAAE,EAExB,OACZ,SAAQ,KAAK,gBAAgB,IAAI,yBAAyB;AAE5D,UAAM,IAAI,KAAK,CAAC,SAAS,CAAC;UACrB;IACL,MAAM,YAAY,MAAM,IAAI,mBAAmB,IAAI,EAAE;AAErD,UAAM,IAAI,oBAAoB,CAAC,GAAG,WAAW,SAAS,CAAC;;AAGzD,UAAO,WAAY;AACjB,QAAI,IACF,OAAM,OAAO,IAAI;SACZ;KACL,MAAM,YAAY,MAAM,IAAI,mBAAmB,IAAI,EAAE;AAErD,WAAM,IACJ,oBACA,UAAU,QAAQ,OAAO,OAAO,SAAS,CAC1C;;;;EAKP,SAAS,cAA8C;AACrD,OAAI,oCAAa,KAAK,EACpB;wCAAa,IAAI,QAAQ,CACvB,iDAAyB,IAAI,SAAS,KAAK;4CAC1B,IAAI,QAAQ,CAC7B,QAAO,IAAI,QAAQ;;AAIvB,UAAO,IAAI;;AAGb,yCACE,mBAAmB,WACnB,aACA,YACD;;CAGH,MAAM,gBAAgB,OAAO,YAC3B,OAAO,QAAQ,qBAAqB,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,CAC5D,KACA,MAAM,QAAQ,CACf,CAAC,CACH;AAED,QAAO,CAAC,UAAU;EAAE,GAAG;EAAS,GAAG;EAAe,CAAC"}