Skip to content

Instantly share code, notes, and snippets.

@caasi
Created April 1, 2020 17:05
Show Gist options
  • Save caasi/6977b83ba882a7c9f58b07739bcaff50 to your computer and use it in GitHub Desktop.
Save caasi/6977b83ba882a7c9f58b07739bcaff50 to your computer and use it in GitHub Desktop.
import { useState, useMemo, useEffect } from 'react';
import { Observable, BehaviorSubject } from 'rxjs';
// It's like the `useObservable` from 'rxjs-hooks' but with a better interface.
function useObservable<State>(
input$: Observable<State>,
initialState?: State,
) {
const [state, setState] = useState(initialState);
const state$ = useMemo(() => new BehaviorSubject(initialState), []);
useEffect(() => {
const sub = state$.subscribe(x => setState(x));
return sub.unsubscribe.bind(sub);
}, [state$]);
useEffect(() => {
const sub = input$.subscribe(state$.next.bind(state$));
return sub.unsubscribe.bind(sub);
}, [input$]);
return state;
}
export default useObservable;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment