diff --git a/package-lock.json b/package-lock.json index e196e0d..496d9c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "re-rxjs", - "version": "0.0.1", + "version": "0.0.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index bb0cae1..43efb97 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "0.0.1", + "version": "0.0.2", "sideEffects": false, "repository": { "type": "git", diff --git a/src/useObservable.ts b/src/useObservable.ts index f0c799e..c8d12e9 100644 --- a/src/useObservable.ts +++ b/src/useObservable.ts @@ -1,4 +1,4 @@ -import { useState, useEffect } from "react" +import { useEffect, useReducer } from "react" import delayUnsubscription from "./operators/delay-unsubscription" import { distinctShareReplay, @@ -26,20 +26,33 @@ const getEnhancedSource = ( return result } +const reducer = (_: any, action: any) => action +const init = (args: any) => { + try { + return getEnhancedSource(...(args as [any, any])).getValue() + } catch (e) { + return SUSPENSE + } +} + export const useObservable = ( source$: Observable, unsubscribeGraceTime = 200, ): Exclude => { - const [state, setState] = useState(SUSPENSE as any) + const [state, dispatch] = useReducer( + reducer, + [source$, unsubscribeGraceTime], + init, + ) useEffect(() => { const enhancedSource$ = getEnhancedSource(source$, unsubscribeGraceTime) try { - setState(enhancedSource$.getValue()) + dispatch(enhancedSource$.getValue()) } catch (e) { - setState(SUSPENSE as any) + dispatch(SUSPENSE) } - const subscription = enhancedSource$.subscribe(setState) + const subscription = enhancedSource$.subscribe(dispatch) return () => subscription.unsubscribe() }, [source$, unsubscribeGraceTime])