dash-renderer
Version:
render dash components in react
170 lines (169 loc) • 7.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.apiRequests = void 0;
exports.createReducer = createReducer;
var _ramda = require("ramda");
var _redux = require("redux");
var _dependencies_ts = require("../actions/dependencies_ts");
var _api = _interopRequireDefault(require("./api"));
var _appLifecycle = _interopRequireDefault(require("./appLifecycle"));
var _callbacks = _interopRequireDefault(require("./callbacks"));
var _config = _interopRequireDefault(require("./config"));
var _dependencyGraph = _interopRequireDefault(require("./dependencyGraph"));
var _error = _interopRequireDefault(require("./error"));
var _history = _interopRequireDefault(require("./history"));
var _hooks = _interopRequireDefault(require("./hooks"));
var _profile = _interopRequireDefault(require("./profile"));
var _changed = _interopRequireDefault(require("./changed"));
var _isLoading = _interopRequireDefault(require("./isLoading"));
var _layout = _interopRequireDefault(require("./layout"));
var _paths = _interopRequireDefault(require("./paths"));
var _callbackJobs = _interopRequireDefault(require("./callbackJobs"));
var _loading = _interopRequireDefault(require("./loading"));
var _wrapping = require("../wrapper/wrapping");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
var apiRequests = exports.apiRequests = ['dependenciesRequest', 'layoutRequest', 'reloadRequest', 'loginRequest'];
var layoutHashes = function layoutHashes() {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var action = arguments.length > 1 ? arguments[1] : undefined;
if ((0, _ramda.includes)(action.type, ['UNDO_PROP_CHANGE', 'REDO_PROP_CHANGE', 'ON_PROP_CHANGE'])) {
// Let us compare the paths sums to get updates without triggering
// render on the parent containers.
var actionPath = action.payload.itempath;
var strPath = (0, _wrapping.stringifyPath)(actionPath);
var prev = (0, _ramda.pathOr)(0, [strPath, 'hash'], state);
state = (0, _ramda.assoc)(strPath, {
hash: prev + 1,
changedProps: action.payload.props,
renderType: action.payload.renderType
}, state);
} else if (action.type === 'RESET_COMPONENT_STATE') {
var itempath = action.payload.itempath;
if (itempath) {
var prefixStr = (0, _wrapping.stringifyPath)(itempath);
// Remove all hashes for keys starting with prefixStr
return Object.fromEntries(Object.entries(state).filter(_ref => {
var _ref2 = _slicedToArray(_ref, 1),
key = _ref2[0];
return !key.startsWith(prefixStr);
}));
}
}
return state;
};
function mainReducer() {
var parts = {
appLifecycle: _appLifecycle.default,
callbacks: _callbacks.default,
config: _config.default,
error: _error.default,
graphs: _dependencyGraph.default,
history: _history.default,
hooks: _hooks.default,
profile: _profile.default,
changed: _changed.default,
isLoading: _isLoading.default,
layout: _layout.default,
paths: _paths.default,
layoutHashes,
loading: _loading.default
};
(0, _ramda.forEach)(r => {
parts[r] = (0, _api.default)(r);
}, apiRequests);
parts.callbackJobs = _callbackJobs.default;
return (0, _redux.combineReducers)(parts);
}
function getInputHistoryState(payload, state, recordChanges) {
var graphs = state.graphs,
paths = state.paths,
layout = state.layout;
var itempath = payload.itempath,
props = payload.props;
var refProps = (0, _ramda.path)(itempath.concat(['props']), layout) || {};
var id = refProps.id;
var historyEntry;
if (id) {
if (recordChanges) {
state.changed = {
id,
props
};
}
historyEntry = {
id,
props: {}
};
(0, _ramda.keys)(props).forEach(propKey => {
if ((0, _dependencies_ts.getCallbacksByInput)(graphs, paths, id, propKey).length) {
historyEntry.props[propKey] = refProps[propKey];
}
});
}
return historyEntry;
}
function recordHistory(reducer) {
return function (state, action) {
// Record initial state
var type = action.type,
payload = action.payload;
if (type === 'ON_PROP_CHANGE') {
// history records all prop changes that are inputs.
var historyEntry = getInputHistoryState(payload, state, true);
if (historyEntry && !(0, _ramda.isEmpty)(historyEntry.props)) {
state.history.present = historyEntry;
}
}
var nextState = reducer(state, action);
if (type === 'ON_PROP_CHANGE' && payload.source !== 'response') {
/*
* if the prop change is an input, then
* record it so that it can be played back
*/
var _historyEntry = getInputHistoryState(payload, nextState);
if (_historyEntry && !(0, _ramda.isEmpty)(_historyEntry.props)) {
nextState.history = {
past: [...nextState.history.past, state.history.present],
present: _historyEntry,
future: []
};
}
}
return nextState;
};
}
function reloaderReducer(reducer) {
return function (state, action) {
var _ref3 = state || {},
history = _ref3.history,
config = _ref3.config,
hooks = _ref3.hooks;
var newState = state;
if (action.type === 'RELOAD') {
newState = {
history,
config,
hooks
};
} else if (action.type === 'SET_CONFIG') {
// new config also reloads, and even clears history,
// in case there's a new user or even a totally different app!
// hooks are set at an even higher level than config though.
newState = {
hooks
};
}
return reducer(newState, action);
};
}
function createReducer() {
return reloaderReducer(recordHistory(mainReducer()));
}