UNPKG

3.89 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
8
9exports.useRoot = useRoot;
10exports.useBranch = useBranch;
11
12var _react = require('react');
13
14var _react2 = _interopRequireDefault(_react);
15
16var _helpers = require('./utils/helpers');
17
18var _baobab = require('baobab');
19
20var _baobab2 = _interopRequireDefault(_baobab);
21
22var _context = require('./context');
23
24var _context2 = _interopRequireDefault(_context);
25
26function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
28var makeError = _baobab2.default.helpers.makeError,
29 isPlainObject = _baobab2.default.type.object;
30
31function invalidMapping(name, mapping) {
32 throw makeError('baobab-react/hooks.useBranch: given cursors mapping is invalid (check the "' + name + '" component).', { mapping: mapping });
33}
34
35function useRoot(tree) {
36 if (!(0, _helpers.isBaobabTree)(tree)) throw makeError('baobab-react/hooks.useRoot: given tree is not a Baobab.', { target: tree });
37
38 var _useState = (0, _react.useState)(function () {
39 return function (_ref) {
40 var children = _ref.children;
41
42 return _react2.default.createElement(_context2.default.Provider, {
43 value: { tree: tree }
44 }, children);
45 };
46 }),
47 _useState2 = _slicedToArray(_useState, 2),
48 state = _useState2[0],
49 setState = _useState2[1];
50
51 (0, _react.useEffect)(function () {
52 setState(function () {
53 return function (_ref2) {
54 var children = _ref2.children;
55
56 return _react2.default.createElement(_context2.default.Provider, {
57 value: { tree: tree }
58 }, children);
59 };
60 });
61 }, [tree]);
62
63 return state;
64}
65
66function useBranch(cursors) {
67 if (!isPlainObject(cursors) && typeof cursors !== 'function') invalidMapping(name, cursors);
68
69 var context = (0, _react.useContext)(_context2.default);
70
71 if (!context || !(0, _helpers.isBaobabTree)(context.tree)) throw makeError('baobab-react/hooks.useBranch: tree is not available.');
72
73 var _useState3 = (0, _react.useState)(function () {
74 var mapping = typeof cursors === 'function' ? cursors(context) : cursors;
75 var obj = context.tree.project(mapping);
76 obj.dispatch = function (fn) {
77 for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
78 args[_key - 1] = arguments[_key];
79 }
80
81 return fn.apply(undefined, [context.tree].concat(args));
82 };
83 return obj;
84 }),
85 _useState4 = _slicedToArray(_useState3, 2),
86 state = _useState4[0],
87 setState = _useState4[1];
88
89 (0, _react.useEffect)(function () {
90 var mapping = typeof cursors === 'function' ? cursors(context) : cursors;
91 var watcher = context.tree.watch(mapping);
92
93 watcher.on('update', function () {
94 var obj = watcher.get();
95 obj.dispatch = function (fn) {
96 for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
97 args[_key2 - 1] = arguments[_key2];
98 }
99
100 return fn.apply(undefined, [context.tree].concat(args));
101 };
102 setState(obj);
103 });
104
105 return function () {
106 return watcher.release();
107 };
108 }, [cursors]);
109
110 return state;
111}
\No newline at end of file