UNPKG

react-state-bucket

Version:

A lightweight and powerful package designed to manage states globally in React applications. It provides CRUD operations for your state data with ease, enabling developers to handle complex state management scenarios without the need for heavy libraries.

1 lines 7.44 kB
{"version":3,"file":"Bucket.mjs","sources":["../src/Bucket.ts"],"sourcesContent":["import { Infer, XVInstanceType } from \"xanv\"\nimport { getCookie, setCookie } from \"./Cookie\"\nexport type StoreType = \"memory\" | \"session\" | \"local\" | \"url\" | \"cookie\"\n\nexport type InitialBucketData = {\n [key: string]: XVInstanceType\n}\n\nexport type BucketOptions = {\n store?: StoreType;\n onChange?: (key: string, value: any) => void\n}\n\n\n\n\n\nclass Bucket<IT extends InitialBucketData> {\n private initial: IT\n private option: BucketOptions\n private hooks: Map<string, Function> = new Map()\n private data: Map<keyof IT, IT[keyof IT]> = new Map()\n readonly changes: Map<keyof IT, boolean> = new Map()\n\n constructor(initial: IT, option?: BucketOptions) {\n this.initial = initial\n this.option = { store: \"memory\", ...option }\n }\n\n subscribe(id: string, hook: Function) {\n if (!id.startsWith(\"rsb_\")) throw new Error(\"Invalid subscription\")\n this.hooks.set(id, hook)\n }\n\n unsubscribe(id: string) {\n this.hooks.delete(id)\n }\n\n set<T extends keyof IT>(key: T, value: Infer<IT[T]>, dispatch = true) {\n if (typeof window !== 'undefined') {\n value = JSON.stringify(value) as any\n if (this.option.store === 'session' || this.option.store === 'local') {\n let storage = this.option.store === \"session\" ? sessionStorage : localStorage\n storage.setItem(key as string, value)\n } else if (this.option.store === 'url') {\n let url = new URL(window.location.href)\n url.searchParams.set(key as string, encodeURIComponent(value))\n window.history.replaceState({}, '', url.toString())\n } else if (this.option.store === 'cookie') {\n setCookie(key as string, value)\n } else {\n this.data.set(key as any, value)\n }\n\n this.changes.set(key as string, true)\n if (this.option.onChange) {\n this.option.onChange(key as string, value)\n }\n\n if (dispatch) {\n this.hooks.forEach(h => h())\n }\n }\n }\n\n get<T extends keyof IT>(key: T) {\n let value;\n\n if (typeof window !== 'undefined') {\n if (this.option.store === 'session' || this.option.store === 'local') {\n let storage = this.option.store === \"session\" ? sessionStorage : localStorage\n value = storage.getItem(key as string)!\n } else if (this.option.store === 'url') {\n let url = new URL(window.location.href)\n let storedValue = url.searchParams.get(key as string)!\n value = decodeURIComponent(storedValue)\n } else if (this.option.store === 'cookie') {\n value = getCookie(key as string)\n } else {\n value = this.data.get(key as any)\n }\n\n try {\n value = JSON.parse(value as any)\n } catch (error) { }\n }\n\n try {\n value = this.initial[key].parse(value)\n } catch (error) {\n }\n return value\n }\n\n sets(state: { [key in keyof IT]?: Infer<IT[key]> }) {\n for (let k in state) {\n this.set(k as keyof IT, state[k as keyof IT]!, true)\n }\n this.hooks.forEach(h => h())\n }\n\n get state() {\n const state: { [key in keyof IT]: Infer<IT[key]> } = {} as any\n for (let k in this.initial) {\n state[k] = this.get(k as keyof IT)\n }\n return state\n }\n\n get errors() {\n const errors = new Map<keyof IT, string>()\n for (let k in this.initial) {\n try {\n // console.log(k, this.get(k as keyof IT));\n\n this.initial[k].parse(this.get(k as keyof IT))\n } catch (error: any) {\n errors.set(k, error.message)\n }\n }\n return errors\n }\n\n}\n\nexport default Bucket"],"names":[],"mappings":"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"}