UNPKG

react-rails-mounter

Version:

Mounting react components in Rails off of the asset pipeline

154 lines (126 loc) 5.58 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var defaultConfig = { CLASS_NAME_ATTR: 'data-react-class', PROPS_ATTR: 'data-react-props' }; var ReactRailsMounter = function () { function ReactRailsMounter() { _classCallCheck(this, ReactRailsMounter); } _createClass(ReactRailsMounter, null, [{ key: 'mount', value: function mount() { var components = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$selector = _ref.selector, selector = _ref$selector === undefined ? undefined : _ref$selector, _ref$configs = _ref.configs, configs = _ref$configs === undefined ? {} : _ref$configs; var mergedConfigs = Object.assign({}, defaultConfig, configs); var nodes = this.findDOMNodes(selector, mergedConfigs); var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = nodes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var node = _step.value; var name = node.getAttribute(mergedConfigs.CLASS_NAME_ATTR); var component = components[name]; var props = JSON.parse(node.getAttribute(mergedConfigs.PROPS_ATTR) || null); if (typeof component === 'undefined') { var message = 'Cannot find component: \'' + name + '\''; if (console && console.log) { console.log('%c[react-rails-mounter] %c' + message + ' for element', "font-weight: bold", "", node); } throw new Error('[react-rails-mounter] ' + message); } else { _reactDom2.default.render(_react2.default.createElement(component, props), node); } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } } }, { key: 'unmount', value: function unmount(searchSelector, _ref2) { var _ref2$configs = _ref2.configs, configs = _ref2$configs === undefined ? {} : _ref2$configs; var mergedConfigs = Object.assign({}, defaultConfig, configs); var nodes = this.findDOMNodes(searchSelector, mergedConfigs); var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = nodes[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var node = _step2.value; _reactDom2.default.unmountComponentAtNode(node); } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } } /* -- Helper methods -- */ }, { key: 'findDOMNodes', value: function findDOMNodes(searchSelector, configs) { var selector = void 0, parent = void 0; switch (typeof searchSelector === 'undefined' ? 'undefined' : _typeof(searchSelector)) { case 'undefined': selector = '[' + configs.CLASS_NAME_ATTR + ']'; parent = document; break; case 'object': selector = '[' + configs.CLASS_NAME_ATTR + ']'; parent = selector; break; case 'string': selector = selector + '[' + configs.CLASS_NAME_ATTR + '], ' + selector + ' [' + configs.CLASS_NAME_ATTR + ']'; parent = document; break; default: break; } return parent.querySelectorAll(selector); } }]); return ReactRailsMounter; }(); exports.default = ReactRailsMounter; ;