UNPKG

5 kBJavaScriptView Raw
1'use strict';
2
3var _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"); } }; })();
4
5Object.defineProperty(exports, "__esModule", {
6 value: true
7});
8exports.forwardDispatch = undefined;
9exports.start = start;
10exports.initializeComponent = initializeComponent;
11
12var _curry = require('ramda/src/curry');
13
14var _curry2 = _interopRequireDefault(_curry);
15
16var _redux = require('redux');
17
18var _reduxThunk = require('redux-thunk');
19
20var _reduxThunk2 = _interopRequireDefault(_reduxThunk);
21
22var _diff = require('virtual-dom/diff');
23
24var _diff2 = _interopRequireDefault(_diff);
25
26var _patch = require('virtual-dom/patch');
27
28var _patch2 = _interopRequireDefault(_patch);
29
30var _createElement = require('virtual-dom/create-element');
31
32var _createElement2 = _interopRequireDefault(_createElement);
33
34var _domDelegator = require('dom-delegator');
35
36var _domDelegator2 = _interopRequireDefault(_domDelegator);
37
38var _Map = require('./Map');
39
40var _Map2 = _interopRequireDefault(_Map);
41
42function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
43
44var delegator = (0, _domDelegator2.default)();
45var createStoreWithMiddleware = (0, _redux.applyMiddleware)(_reduxThunk2.default)(_redux.createStore);
46
47// Component = {
48// init : _ -> Object
49// update : Map -> Action -> Map
50// view : Map -> (Action -> Action) -> VirtualNode
51// }
52
53// start :: Component -> Element
54function start(component) {
55 var init = component.init;
56 var update = component.update;
57 var view = component.view;
58
59 var _handleInit = handleInit(init);
60
61 var _handleInit2 = _slicedToArray(_handleInit, 2);
62
63 var initialState = _handleInit2[0];
64 var initialAction = _handleInit2[1];
65
66 // Initial call to update() will be @@redux/INIT so bogus dispatch() is okay
67
68 var dispatch = function dispatch(x) {
69 return x;
70 };
71
72 var store = createStoreWithMiddleware(function () {
73 var state = arguments.length <= 0 || arguments[0] === undefined ? initialState : arguments[0];
74 var action = arguments[1];
75
76 var newState = update(state, action, dispatch);
77
78 return typeof newState === 'undefined' ? state : newState;
79 });
80
81 dispatch = function (action) {
82 return function (event) {
83 if (event) {
84 action.event = event;
85 }
86
87 store.dispatch(action);
88 };
89 };
90
91 if (initialAction) {
92 store.dispatch(initialAction);
93 }
94
95 var tree = view(initialState, dispatch);
96 var rootNode = (0, _createElement2.default)(tree);
97
98 store.subscribe(function () {
99 tree = patchTree(rootNode, tree, view(store.getState(), dispatch));
100 });
101
102 return rootNode;
103}
104
105// patchTree :: Element -> VirtualNode -> VirtualNode -> VirtualNode
106function patchTree(rootNode, oldTree, newTree) {
107 (0, _patch2.default)(rootNode, (0, _diff2.default)(oldTree, newTree));
108
109 return newTree;
110}
111
112// initializeComponent :: Component -> Map
113function initializeComponent(_ref, dispatch) {
114 var init = _ref.init;
115
116 var _handleInit3 = handleInit(init);
117
118 var _handleInit4 = _slicedToArray(_handleInit3, 2);
119
120 var initialState = _handleInit4[0];
121 var initialAction = _handleInit4[1];
122
123 if (dispatch && initialAction) {
124 dispatch(initialState)(initialAction)();
125 }
126
127 return initialState;
128}
129
130// handleInit :: (_ -> Object) -> [Map, Maybe Action]
131function handleInit(init) {
132 var _res = init();
133 var res = Array.isArray(_res) ? _res : [_res];
134
135 return [new _Map2.default(res[0]), res[1]];
136}
137
138// Wrap a dispatcher, forwarding any actions onto the specified action by attaching
139// them to the __action property.
140//
141// Usually used by parent components to capture actions from child components.
142var forwardDispatch = exports.forwardDispatch = (0, _curry2.default)(function (action, dispatch, state) {
143 return function (forwardAction) {
144 if (typeof forwardAction === 'function') {
145 // In order to forward thunks, an intermediate thunk needs to be returned
146 // to gain access to the raw `action => <dispatch>` dispatcher rather than
147 // the application's wrapped `action => event => <dispatch>` dispatcher.
148 return dispatch(function (rawDispatch) {
149 var getState = function getState() {
150 return state;
151 };
152 var fwd = forwardDispatch(action, rawDispatch, state);
153
154 forwardAction(fwd, getState);
155 });
156 }
157
158 // Annotate and dispatch a simple action object
159 return dispatch(Object.assign({}, action, { __fwdAction: forwardAction }));
160 };
161});
\No newline at end of file