{"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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"}