diff --git a/projects/juliette-react/src/lib/store-context.ts b/projects/juliette-react/src/lib/contexts.ts similarity index 100% rename from projects/juliette-react/src/lib/store-context.ts rename to projects/juliette-react/src/lib/contexts.ts diff --git a/projects/juliette-react/src/lib/use-store.ts b/projects/juliette-react/src/lib/hooks.ts similarity index 67% rename from projects/juliette-react/src/lib/use-store.ts rename to projects/juliette-react/src/lib/hooks.ts index e631f21..14a2baa 100644 --- a/projects/juliette-react/src/lib/use-store.ts +++ b/projects/juliette-react/src/lib/hooks.ts @@ -1,12 +1,23 @@ import { useContext, useEffect, useMemo, useState } from 'react'; -import { StoreContext } from './store-context'; +import { StoreContext } from './contexts'; import { Store, Dispatch, Selector } from 'juliette'; import { distinctUntilChanged, skip, take } from 'rxjs/operators'; -export function useStore(selector: Selector): [R, Dispatch] { - const store: Store = useContext(StoreContext); +export function useStore(): Store { + const store = useContext(StoreContext); if (!store) throw new Error('Store is not provided! Use StoreContext to provide it.'); + return store; +} + +export function useDispatch(): Dispatch { + const store = useStore(); + return store.dispatch.bind(store); +} + +export function useSelector(selector: Selector): R { + const store = useStore(); + const [state$, initialState] = useMemo(() => { let initialState: R = null as any; const state$ = store.select(selector).pipe(distinctUntilChanged()); @@ -21,5 +32,5 @@ export function useStore(selector: Selector): [R, Dispatch] { return () => subscription.unsubscribe(); }, [state$]); - return [state, store.dispatch.bind(store)]; + return state; } diff --git a/projects/juliette-react/src/public-api.ts b/projects/juliette-react/src/public-api.ts index d1ea017..bc8490d 100644 --- a/projects/juliette-react/src/public-api.ts +++ b/projects/juliette-react/src/public-api.ts @@ -1,2 +1,2 @@ -export * from './lib/store-context'; -export * from './lib/use-store'; +export * from './lib/contexts'; +export * from './lib/hooks';