import { BehaviorSubject, Observable } from 'rxjs' import { useGuaranteedMemo, useImmediateEffect } from '@spicy-hooks/core' import { isBehaviorSubject } from '../utils' export function useSyncObservable (observable: Observable): BehaviorSubject export function useSyncObservable (observable: BehaviorSubject): BehaviorSubject export function useSyncObservable (observable: Observable, defaultValue: T): BehaviorSubject export function useSyncObservable (observable: Observable | null | undefined): BehaviorSubject | null export function useSyncObservable (observable: BehaviorSubject | null | undefined): BehaviorSubject | null export function useSyncObservable (observable: Observable | null | undefined, defaultValue: T): BehaviorSubject | null /** * TODO Needs more love: https://github.com/salsita/spicy-hooks/issues/13 * Converts the provided observable into a `BehaviorSubject`. * If the source observable is synchronous, its next emission will be immediately available through `getValue()` method of the returned `BehaviorSubject`. * @param observable source observable * @param defaultValue default value to be provided through `getValue()` until the source observable emits * @typeParam T type of the value emitted by the source observable * @category Hook */ export function useSyncObservable (observable: Observable | null | undefined, defaultValue: T | null = null): BehaviorSubject | null { const subject = useGuaranteedMemo( () => { if (!observable) { return null } return isBehaviorSubject(observable) ? observable : new BehaviorSubject(defaultValue) }, [observable] ) useImmediateEffect( () => { if (!observable || !subject || subject === observable) { return } const subscription = observable.subscribe(subject) return () => subscription.unsubscribe() }, [subject, observable] ) return subject }