juliette-react
Version:
React Plugin for Juliette
29 lines • 1.13 kB
JavaScript
import { useCallback, useContext, useEffect, useMemo, useState } from 'react';
import { StoreContext } from './contexts';
import { skip, take } from 'rxjs/operators';
export function useStore() {
const store = useContext(StoreContext);
if (!store)
throw new Error('Store is not provided! Use StoreContext to provide it.');
return store;
}
export function useDispatch() {
const store = useStore();
return useCallback(store.dispatch.bind(store), [store]);
}
export function useSelect(keyOrSelector) {
const store = useStore();
const [state$, initialState] = useMemo(() => {
let initialState = null;
const state$ = store.select(keyOrSelector);
state$.pipe(take(1)).subscribe(state => (initialState = state));
return [state$, initialState];
}, [store, keyOrSelector]);
const [state, setState] = useState(initialState);
useEffect(() => {
const subscription = state$.pipe(skip(1)).subscribe(setState);
return () => subscription.unsubscribe();
}, [state$]);
return state;
}
//# sourceMappingURL=hooks.js.map