UNPKG

better-auth

Version:

The most comprehensive authentication framework for TypeScript.

1 lines 2.43 kB
{"version":3,"file":"react-store.mjs","names":[],"sources":["../../../src/client/react/react-store.ts"],"sourcesContent":["import type { Store, StoreValue } from \"nanostores\";\nimport { listenKeys } from \"nanostores\";\nimport type { DependencyList } from \"react\";\nimport { useCallback, useRef, useSyncExternalStore } from \"react\";\n\ntype StoreKeys<T> = T extends { setKey: (k: infer K, v: any) => unknown }\n\t? K\n\t: never;\n\nexport interface UseStoreOptions<SomeStore> {\n\t/**\n\t * @default\n\t * ```ts\n\t * [store, options.keys]\n\t * ```\n\t */\n\tdeps?: DependencyList | undefined;\n\n\t/**\n\t * Will re-render components only on specific key changes.\n\t */\n\tkeys?: StoreKeys<SomeStore>[] | undefined;\n}\n\n/**\n * Subscribe to store changes and get store's value.\n *\n * Can be used with store builder too.\n *\n * ```js\n * import { useStore } from 'nanostores/react'\n *\n * import { router } from '../store/router'\n *\n * export const Layout = () => {\n * let page = useStore(router)\n * if (page.route === 'home') {\n * return <HomePage />\n * } else {\n * return <Error404 />\n * }\n * }\n * ```\n *\n * @param store Store instance.\n * @returns Store value.\n */\nexport function useStore<SomeStore extends Store>(\n\tstore: SomeStore,\n\toptions: UseStoreOptions<SomeStore> = {},\n): StoreValue<SomeStore> {\n\tlet snapshotRef = useRef<StoreValue<SomeStore>>(store.get());\n\n\tconst { keys, deps = [store, keys] } = options;\n\n\tlet subscribe = useCallback((onChange: () => void) => {\n\t\tconst emitChange = (value: StoreValue<SomeStore>) => {\n\t\t\tif (snapshotRef.current === value) return;\n\t\t\tsnapshotRef.current = value;\n\t\t\tonChange();\n\t\t};\n\n\t\temitChange(store.value);\n\t\tif (keys?.length) {\n\t\t\treturn listenKeys(store as any, keys, emitChange);\n\t\t}\n\t\treturn store.listen(emitChange);\n\t}, deps);\n\n\tlet get = () => snapshotRef.current as StoreValue<SomeStore>;\n\n\treturn useSyncExternalStore(subscribe, get, get);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CA,SAAgB,SACf,OACA,UAAsC,EAAE,EAChB;CACxB,IAAI,cAAc,OAA8B,MAAM,KAAK,CAAC;CAE5D,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,KAAK,KAAK;CAEvC,IAAI,YAAY,aAAa,aAAyB;EACrD,MAAM,cAAc,UAAiC;AACpD,OAAI,YAAY,YAAY,MAAO;AACnC,eAAY,UAAU;AACtB,aAAU;;AAGX,aAAW,MAAM,MAAM;AACvB,MAAI,MAAM,OACT,QAAO,WAAW,OAAc,MAAM,WAAW;AAElD,SAAO,MAAM,OAAO,WAAW;IAC7B,KAAK;CAER,IAAI,YAAY,YAAY;AAE5B,QAAO,qBAAqB,WAAW,KAAK,IAAI"}