UNPKG

informed

Version:

A lightweight framework and utility for building powerful forms in React applications

143 lines (130 loc) 4.41 kB
'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;