UNPKG

@bloc-js/react-bloc

Version:

React components for implementing the BLoC pattern.

67 lines (66 loc) 2.54 kB
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, }; }