UNPKG

react-okr-ui

Version:

A React user interface toolkit for building OKR centric applications.

136 lines (115 loc) 4.05 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.default = void 0; var _react = _interopRequireDefault(require("react")); var _client = _interopRequireDefault(require("webpack-hot-middleware/client")); var _errorBoundary = _interopRequireDefault(require("./components/error-boundary")); var _portal = _interopRequireDefault(require("./components/portal")); var _style = _interopRequireDefault(require("./components/style")); var _buildError = _interopRequireDefault(require("./components/build-error")); var _runtimeError = _interopRequireDefault(require("./components/runtime-error")); class FastRefreshOverlay extends _react.default.Component { constructor(...args) { super(...args); this.state = { errors: [], buildError: null, currentIndex: 0 }; this._isMounted = false; this.dismiss = () => { // eslint-disable-next-line no-invalid-this this.setState({ errors: [], currenIndex: 0, buildError: null }); }; this.addBuildError = error => { // eslint-disable-next-line no-invalid-this this.setState({ buildError: error }); }; this.open = (file, lineNumber = 1) => { window.fetch(`/__open-stack-frame-in-editor?fileName=` + window.encodeURIComponent(file) + `&lineNumber=` + window.encodeURIComponent(lineNumber)); }; } componentDidMount() { this._isMounted = true; _client.default.useCustomOverlay({ showProblems: (type, data) => { if (this._isMounted) { this.addBuildError(data[0]); } }, // We rely on Fast Refresh notifying us on updates as HMR notification is "not at the right time" clear: () => { this.setState({ buildError: null }); } }); // TODO: Maybe only do this? Investigate if third-party stuff should be visible // window.addEventListener(`error`, error => { // setProblems(s => // s.concat({ // type: `RUNTIME_ERROR`, // error, // }) // ) // }) // TODO: Add e2e test case, e.g. useEffect in a component to fetch invalid URL // window.addEventListener(`unhandledrejection`, error => { // setProblems(s => // s.concat({ // type: `RUNTIME_ERROR`, // error: error.reason, // }) // ) // }) } componentWillUnmount() { this._isMounted = false; } render() { var _this$props$children; const { errors, currentIndex, buildError } = this.state; const error = errors[currentIndex]; const hasBuildError = buildError !== null; const hasRuntimeError = Boolean(errors.length); const hasErrors = hasBuildError || hasRuntimeError; return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_errorBoundary.default, { clearErrors: () => { this.setState({ errors: [], buildError: null }); }, onError: error => { this.setState(prevState => { const insertedError = { type: `RUNTIME_ERROR`, error }; return { errors: [...prevState.errors, insertedError] }; }); } }, (_this$props$children = this.props.children) !== null && _this$props$children !== void 0 ? _this$props$children : null), hasErrors ? /*#__PURE__*/_react.default.createElement(_portal.default, null, /*#__PURE__*/_react.default.createElement(_style.default, null), hasBuildError ? /*#__PURE__*/_react.default.createElement(_buildError.default, { error: buildError, open: this.open, dismiss: this.dismiss }) : hasRuntimeError ? /*#__PURE__*/_react.default.createElement(_runtimeError.default, { error: error, open: this.open, dismiss: this.dismiss }) : undefined) : undefined); } } exports.default = FastRefreshOverlay;