@bloc-js/react-bloc
Version:
React components for implementing the BLoC pattern.
38 lines (37 loc) • 1.33 kB
JavaScript
import * as React from "react";
import { useEffect, useState } from "react";
import { BlocRootContext } from "./bloc-root";
import { blocGetter, } from "./registry";
export function useBloc(fn, ...args) {
const registry = React.useContext(BlocRootContext);
const bloc = React.useMemo(() => fn(registry, ...args), [registry, ...args]);
return bloc;
}
export function useBlocScoped(fn, done, ...args) {
const registry = React.useContext(BlocRootContext);
const bloc = React.useMemo(() => fn(registry, ...args), [registry, ...args]);
React.useEffect(() => {
return () => done(registry);
}, [registry]);
return bloc;
}
export function useBlocState(bloc) {
const [state, setState] = useState(bloc.value);
useEffect(() => {
const subscription = bloc.subscribe(setState);
return () => subscription.unsubscribe();
}, [bloc]);
return state;
}
export function createHooks(id, factory) {
const [getBloc, done] = blocGetter(id, factory);
const useBlocHook = (...args) => useBloc(getBloc, ...args);
const useBlocScopedHook = (...args) => useBlocScoped(getBloc, done, ...args);
const useState = () => useBlocState(useBlocHook());
return {
getBloc,
useBloc: useBlocHook,
useBlocScoped: useBlocScopedHook,
useState,
};
}