informed
Version:
A lightweight framework and utility for building powerful forms in React applications
143 lines (130 loc) • 4.41 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var _rollupPluginBabelHelpers = require('../_virtual/_rollupPluginBabelHelpers.js');
var React = require('react');
var debug$1 = require('../debug.js');
var Context = require('../Context.js');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
var debug = debug$1.Debug('informed:Informed' + '\t\t');
/* -------------------------------- Event Emitter ------------------------------ */
var Emitter = /*#__PURE__*/function () {
function Emitter() {
_rollupPluginBabelHelpers.classCallCheck(this, Emitter);
// Initialize listeners
this.subscriptions = new Map();
// This is the emitter lol
this.emitter = this;
// Bind functions that will be called externally
this.on = this.on.bind(this);
this.emit = this.emit.bind(this);
}
_rollupPluginBabelHelpers.createClass(Emitter, [{
key: "emit",
value: function emit(event) {
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
// Grab the set based on the event
var listeners = this.subscriptions.get(event);
// Only call if we have listeners on that event ( null check )
if (listeners) {
listeners.forEach(function (listener) {
return listener.apply(void 0, args);
});
}
}
}, {
key: "on",
value: function on(event, listener) {
// Singleton check
if (!this.subscriptions.get(event)) {
this.subscriptions.set(event, new Set());
}
// Add listener
var listeners = this.subscriptions.get(event);
listeners.add(listener);
}
}, {
key: "removeListener",
value: function removeListener(event, listener) {
// Remove listener
var listeners = this.subscriptions.get(event);
listeners["delete"](listener);
}
}]);
return Emitter;
}();
/* ----------------------- InformedController ----------------------- */
var InformedController = /*#__PURE__*/function () {
function InformedController() {
_rollupPluginBabelHelpers.classCallCheck(this, InformedController);
this.emitter = new Emitter();
// Map will store all forms by name
// Key => name
// Val => fieldMetaRef
// Why? so the form knows about field meta
this.formMap = new Map();
// For saving values
this.savedValues = new Map();
this.getController = this.getController.bind(this);
this.register = this.register.bind(this);
this.deregister = this.deregister.bind(this);
}
_rollupPluginBabelHelpers.createClass(InformedController, [{
key: "register",
value: function register(name, controller) {
debug('Register', name, controller);
// Clear out old controller
if (this.formMap.get(name)) {
this.formMap["delete"](name);
}
this.formMap.set(name, controller);
this.emitter.emit(name, '_ALL_');
}
}, {
key: "deregister",
value: function deregister(name) {
debug('De-Register', name);
if (this.formMap.get(name)) {
this.formMap["delete"](name);
this.emitter.emit(name, '_ALL_');
}
}
}, {
key: "getController",
value: function getController(name) {
return this.formMap.get(name);
}
}, {
key: "inform",
value: function inform(name, target) {
this.emitter.emit(name, target);
}
}, {
key: "getSavedValues",
value: function getSavedValues(name) {
return this.savedValues.get(name);
}
}, {
key: "setSavedValues",
value: function setSavedValues(name, values) {
return this.savedValues.set(name, values);
}
}]);
return InformedController;
}();
var Informed = function Informed(_ref) {
var children = _ref.children;
debug('Render Informed Provider');
// Create informed controller
var _useState = React.useState(function () {
return new InformedController();
}),
_useState2 = _rollupPluginBabelHelpers.slicedToArray(_useState, 1),
informedController = _useState2[0];
return /*#__PURE__*/React__default["default"].createElement(Context.InformedContext.Provider, {
value: informedController
}, children);
};
exports.Informed = Informed;