UNPKG

4.61 kBJavaScriptView Raw
1'use strict';
2
3var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
4
5var _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; }; }();
6
7function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
8
9function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
10
11function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
12
13var omit = require('lodash.omit');
14var keys = require('lodash.keys');
15var React = require('react');
16var ReactDOM = require('react-dom');
17var PropTypes = require('prop-types');
18
19var UnsafeComponent = function (_React$Component) {
20 _inherits(UnsafeComponent, _React$Component);
21
22 function UnsafeComponent() {
23 _classCallCheck(this, UnsafeComponent);
24
25 return _possibleConstructorReturn(this, (UnsafeComponent.__proto__ || Object.getPrototypeOf(UnsafeComponent)).apply(this, arguments));
26 }
27
28 _createClass(UnsafeComponent, [{
29 key: 'componentDidMount',
30 value: function componentDidMount() {
31 this.renderInjected();
32 }
33 }, {
34 key: 'componentDidUpdate',
35 value: function componentDidUpdate() {
36 this.renderInjected();
37 }
38 }, {
39 key: 'componentWillUnmount',
40 value: function componentWillUnmount() {
41 this.unmountInjected();
42 }
43 }, {
44 key: 'unmountInjected',
45 value: function unmountInjected() {
46 try {
47 var node = ReactDOM.findDOMNode(this);
48 ReactDOM.unmountComponentAtNode(node);
49 } catch (error) {
50 /* eslint no-console:0 */
51 console.log(error);
52 }
53 }
54 }, {
55 key: 'renderLargeRole',
56 value: function renderLargeRole(stack) {
57 return React.createElement(
58 'div',
59 { className: 'unsafe-component-has-error' },
60 React.createElement(
61 'div',
62 { className: 'unsafe-component-message' },
63 React.createElement('i', { className: 'fa fa-exclamation-circle' }),
64 this.props.component.displayName,
65 ' could not be displayed.'
66 ),
67 React.createElement(
68 'div',
69 { className: 'unsafe-component-stack' },
70 stack
71 )
72 );
73 }
74 }, {
75 key: 'renderInjected',
76 value: function renderInjected() {
77 var element = void 0;
78 var node = ReactDOM.findDOMNode(this);
79 try {
80 var props = omit(this.props, keys(this.constructor.propTypes));
81 element = React.createElement(this.props.component, _extends({ key: name }, props));
82 this.injected = ReactDOM.render(element, node);
83 } catch (error) {
84 var stack = error.stack;
85 if (stack) {
86 var stackEnd = stack.indexOf('/react/');
87 if (stackEnd > 0) {
88 stackEnd = stack.lastIndexOf('\n', stackEnd);
89 stack = stack.substr(0, stackEnd);
90 }
91 }
92 element = this.renderLargeRole(stack);
93 }
94 this.injected = ReactDOM.render(element, node);
95 }
96 }, {
97 key: 'render',
98 value: function render() {
99 return React.createElement('div', { className: 'unsafe-component' });
100 }
101 }]);
102
103 return UnsafeComponent;
104}(React.Component);
105
106UnsafeComponent.propTypes = {
107 component: PropTypes.func.isRequired
108};
109
110UnsafeComponent.displayName = 'UnsafeComponent';
111
112module.exports = UnsafeComponent;
\No newline at end of file