@bloc-js/react-bloc
Version:
React components for implementing the BLoC pattern.
67 lines (66 loc) • 2.54 kB
JavaScript
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
import * as React from "react";
import { useEffect, useState } from "react";
import { BlocRootContext } from "./bloc-root";
import { blocGetter, } from "./registry";
export function useBloc(fn) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
var registry = React.useContext(BlocRootContext);
var bloc = React.useMemo(function () { return fn.apply(void 0, __spreadArray([registry], args, false)); }, __spreadArray([registry], args, true));
return bloc;
}
export function useBlocScoped(fn, done) {
var args = [];
for (var _i = 2; _i < arguments.length; _i++) {
args[_i - 2] = arguments[_i];
}
var registry = React.useContext(BlocRootContext);
var bloc = React.useMemo(function () { return fn.apply(void 0, __spreadArray([registry], args, false)); }, __spreadArray([registry], args, true));
React.useEffect(function () {
return function () { return done(registry); };
}, [registry]);
return bloc;
}
export function useBlocState(bloc) {
var _a = useState(bloc.value), state = _a[0], setState = _a[1];
useEffect(function () {
var subscription = bloc.subscribe(setState);
return function () { return subscription.unsubscribe(); };
}, [bloc]);
return state;
}
export function createHooks(id, factory) {
var _a = blocGetter(id, factory), getBloc = _a[0], done = _a[1];
var useBlocHook = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return useBloc.apply(void 0, __spreadArray([getBloc], args, false));
};
var useBlocScopedHook = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return useBlocScoped.apply(void 0, __spreadArray([getBloc, done], args, false));
};
var useState = function () { return useBlocState(useBlocHook()); };
return {
getBloc: getBloc,
useBloc: useBlocHook,
useBlocScoped: useBlocScopedHook,
useState: useState,
};
}