UNPKG

react-rx

Version:
1 lines 8.69 kB
{"version":3,"file":"index.cjs","sources":["../src/useObservable.ts","../src/useObservableEvent.ts"],"sourcesContent":["import {useCallback, useMemo, useSyncExternalStore} from 'react'\nimport {\n asapScheduler,\n catchError,\n finalize,\n type Observable,\n type ObservedValueOf,\n of,\n share,\n timer,\n} from 'rxjs'\nimport {map, tap} from 'rxjs/operators'\n\nfunction getValue<T>(value: T): T extends () => infer U ? U : T {\n return (typeof value === 'function' ? (value as () => any)() : value) as T extends () => infer U\n ? U\n : T\n}\n\ninterface ObservableState<T> {\n didEmit: boolean\n snapshot?: T\n error?: unknown\n}\n\ninterface CacheRecord<T> {\n observable: Observable<void>\n state: {\n didEmit: boolean\n snapshot?: T\n error?: unknown\n }\n getSnapshot: (initialValue: unknown) => T\n}\n\nconst cache = new WeakMap<Observable<any>, CacheRecord<any>>()\n\nconst EMPTY_OBJECT = {}\n\n/** @public */\nexport interface UseObservableOptions {\n disabled?: boolean\n}\n\n/** @public */\nexport function useObservable<ObservableType extends Observable<any>>(\n observable: ObservableType,\n initialValue: ObservedValueOf<ObservableType> | (() => ObservedValueOf<ObservableType>),\n options?: UseObservableOptions,\n): ObservedValueOf<ObservableType>\n/** @public */\nexport function useObservable<ObservableType extends Observable<any>>(\n observable: ObservableType,\n): undefined | ObservedValueOf<ObservableType>\n/** @public */\nexport function useObservable<ObservableType extends Observable<any>, InitialValue>(\n observable: ObservableType,\n initialValue: InitialValue | (() => InitialValue),\n options?: UseObservableOptions,\n): InitialValue | ObservedValueOf<ObservableType>\n/** @public */\nexport function useObservable<ObservableType extends Observable<any>, InitialValue>(\n observable: ObservableType,\n initialValue?: InitialValue | (() => InitialValue),\n options: UseObservableOptions = EMPTY_OBJECT,\n): InitialValue | ObservedValueOf<ObservableType> {\n const {disabled = false} = options\n\n const instance = useMemo(() => {\n if (!cache.has(observable)) {\n // This separate object is used as a stable reference to the cache entry's snapshot and error.\n // It's used by the `getSnapshot` closure.\n const state: ObservableState<ObservedValueOf<ObservableType>> = {\n didEmit: false,\n }\n const entry: CacheRecord<ObservedValueOf<ObservableType>> = {\n state,\n observable: observable.pipe(\n map((value) => ({snapshot: value, error: undefined})),\n catchError((error) => of({snapshot: undefined, error})),\n tap(({snapshot, error}) => {\n state.didEmit = true\n state.snapshot = snapshot\n state.error = error\n }),\n // Note: any value or error emitted by the provided observable will be mapped to the cache entry's mutable state\n // and the observable is thereafter only used as a notifier to call `onStoreChange`, hence the `void` return type.\n map((value) => void value),\n // Ensure that the cache entry is deleted when the observable completes or errors.\n finalize(() => cache.delete(observable)),\n share({resetOnRefCountZero: () => timer(0, asapScheduler)}),\n ),\n getSnapshot: (initialValue) => {\n if (state.error) {\n throw state.error\n }\n return (\n state.didEmit ? state.snapshot : getValue(initialValue)\n ) as ObservedValueOf<ObservableType>\n },\n }\n\n // Eagerly subscribe to sync set `state.snapshot` to what the observable returns, and keep the observable alive until the component unmounts.\n const subscription = entry.observable.subscribe()\n subscription.unsubscribe()\n\n cache.set(observable, entry)\n }\n return cache.get(observable)!\n }, [observable])\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n if (disabled) {\n return () => {}\n }\n\n const subscription = instance.observable.subscribe(onStoreChange)\n return () => {\n subscription.unsubscribe()\n }\n },\n [instance.observable, disabled],\n )\n\n return useSyncExternalStore<ObservedValueOf<ObservableType>>(\n subscribe,\n () => {\n return instance.getSnapshot(initialValue)\n },\n typeof initialValue === 'undefined'\n ? undefined\n : () => getValue(initialValue) as ObservedValueOf<ObservableType>,\n )\n}\n","import {observableCallback} from 'observable-callback'\nimport {useEffect, useState} from 'react'\nimport {type Observable} from 'rxjs'\nimport {useEffectEvent} from 'use-effect-event'\n\n/** @public */\nexport function useObservableEvent<T, U>(\n handleEvent: (arg: Observable<T>) => Observable<U>,\n): (arg: T) => void {\n const [[calls$, call]] = useState(() => observableCallback<T>())\n\n const onEvent = useEffectEvent((observable: Observable<T>) => handleEvent(observable))\n\n useEffect(() => {\n const subscription = calls$.pipe((observable) => onEvent(observable)).subscribe()\n return () => subscription.unsubscribe()\n }, [calls$])\n\n return call\n}\n"],"names":["getValue","value","cache","WeakMap","EMPTY_OBJECT","useObservable","observable","initialValue","t0","$","_c","options","undefined","disabled","t1","has","state","didEmit","entry","pipe","map","_temp","catchError","_temp2","tap","t2","snapshot","error","error_0","_temp3","finalize","delete","share","resetOnRefCountZero","_temp4","getSnapshot","initialValue_0","subscribe","unsubscribe","set","get","instance","t3","onStoreChange","_temp5","subscription_0","subscription","t4","t5","useSyncExternalStore","timer","asapScheduler","value_0","of","useObservableEvent","handleEvent","useState","calls$","call","onEvent","useEffectEvent","observable_0","useEffect","observableCallback"],"mappings":"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"}