UNPKG

exome

Version:

State manager for deeply nested states

8 lines (7 loc) 2 kB
{ "version": 3, "sources": ["../src/angular.ts"], "sourcesContent": ["/**\n * @module exome/angular\n */\nimport {\n\tDestroyRef,\n\ttype Signal,\n\tassertInInjectionContext,\n\tinject,\n\tsignal,\n} from \"@angular/core\";\nimport { type Exome, subscribe } from \"exome\";\n\n/**\n * Creates Angular signal and subscribes to store instance update events and trigger updates to component accordingly.\n *\n * @example:\n * ```ts\n * import { useStore } from \"exome/angular\"\n * import { counterStore } from \"./counter.store.ts\"\n *\n * @Component({\n * selector: 'my-app',\n * template: `\n * <button (click)=\"increment()\">\n * {{count}}\n * </button>\n * `,\n * })\n * export class App {\n * public count = useStore(counterStore, (s) => s.count)\n *\n * public increment() {\n * counterStore.increment()\n * }\n * }\n * ```\n */\nexport function useStore<T extends Exome, R = T>(\n\tstore: T,\n\tselector: (state: T) => R = (v) => v as any,\n): Signal<R> {\n\tconst writableSignal = signal(selector(store));\n\n\tfunction render() {\n\t\twritableSignal.set(selector(store));\n\t}\n\n\tconst unsubscribe = subscribe(store, render);\n\n\tconst requiresCleanup: any = assertInInjectionContext(useStore);\n\tconst cleanupRef = requiresCleanup ? inject(DestroyRef) : null;\n\n\tcleanupRef?.onDestroy(unsubscribe);\n\n\treturn writableSignal.asReadonly();\n}\n"], "mappings": ";AAGA;AAAA,EACC,cAAAA;AAAA,EAEA,4BAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,OACM;AACP,SAAqB,aAAAC,SAAiB;AA2B/B,SAASC,EACfC,GACAC,IAA4B,CAACC,MAAMA,GACvB;AACZ,MAAMC,IAAiBN,EAAOI,EAASD,CAAK,CAAC;AAE7C,WAASI,IAAS;AACjB,IAAAD,EAAe,IAAIF,EAASD,CAAK,CAAC;AAAA,EACnC;AAEA,MAAMK,IAAcP,EAAUE,GAAOI,CAAM,GAGrCE,IADuBX,EAAyBI,CAAQ,IACzBH,EAAOF,CAAU,IAAI;AAE1D,SAAAY,KAAA,QAAAA,EAAY,UAAUD,IAEfF,EAAe,WAAW;AAClC;", "names": ["DestroyRef", "assertInInjectionContext", "inject", "signal", "subscribe", "useStore", "store", "selector", "v", "writableSignal", "render", "unsubscribe", "cleanupRef"] }