UNPKG

feeles-ide

Version:

The hackable and serializable IDE to make learning material

223 lines (188 loc) 7.95 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _setSrcDoc = require("./setSrcDoc"); var _ErrorMessage = _interopRequireDefault(require("./ErrorMessage")); var Padding = 1; var ScaleChangeMin = 0.02; var Screen = /*#__PURE__*/ function (_PureComponent) { (0, _inherits2.default)(Screen, _PureComponent); function Screen() { var _getPrototypeOf2; var _this; (0, _classCallCheck2.default)(this, Screen); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(Screen)).call.apply(_getPrototypeOf2, [this].concat(args))); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "state", { loading: false }); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "_scale", 0); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleUpdate", function () { var _this$props = _this.props, width = _this$props.width, height = _this$props.height; if (_this.iframe && _this.iframe.parentNode && _this.iframe.parentNode.parentNode) { var rect = _this.iframe.parentNode.getBoundingClientRect(); var containerWidth = Math.max(0, rect.width - Padding); var containerHeight = Math.max(0, rect.height - Padding); var scale = containerHeight / containerWidth > height / width ? containerWidth / width : containerHeight / height; if (Math.abs(_this._scale - scale) >= ScaleChangeMin) { _this.iframe.style.transform = "scale(".concat(scale, ")"); _this._scale = scale; } } if (_this.iframe) { requestAnimationFrame(_this.handleUpdate); } }); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleFrame", function (ref) { _this.iframe = ref; _this.props.frameRef(ref); _this._scale = 0; if (_this.iframe) { requestAnimationFrame(_this.handleUpdate); } }); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleClickReload", function (event) { _this.props.setLocation(); event.stopPropagation(); }); (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleClickExit", function (event) { _this.props.toggleFullScreen(); event.stopPropagation(); }); return _this; } (0, _createClass2.default)(Screen, [{ key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { var _this2 = this; if (prevProps.reboot !== this.props.reboot) { if (!this.props.reboot) { this.setState({ loading: true }, function () { setTimeout(function () { _this2.setState({ loading: false }); }, 250); }); } } if (this.iframe) { this.iframe.width = "".concat(this.props.width, "px"); this.iframe.height = "".concat(this.props.height, "px"); } } }, { key: "render", value: function render() { var display = this.props.display; var loading = this.state.loading; var sandbox = _setSrcDoc.SrcDocEnabled ? 'allow-scripts allow-modals allow-popups' : 'allow-scripts allow-modals allow-popups allow-same-origin'; // Screen は Popout されることもあるので, CSS の class は使えない var styles = { root: { position: 'absolute', width: '100%', height: '100%', left: 0, top: 0, background: 'linear-gradient(rgba(0,0,0,0.8), rgba(128,128,128,0.8))', boxSizing: 'border-box', overflow: 'hidden', zIndex: 10, display: display ? 'flex' : 'none', flexDirection: 'column', alignItems: 'stretch' }, parent: { flex: 1, width: '100%', height: '100%', display: 'flex', justifyContent: 'center', alignItems: 'center' }, frame: { border: '0 none', flex: '0 0 auto', opacity: loading ? 0 : 1, transition: loading ? 'none' : 'opacity 450ms cubic-bezier(0.23, 1, 0.32, 1) 0ms' }, button: { cursor: 'pointer', height: '10vh' } }; return _react.default.createElement("div", { style: styles.root }, _react.default.createElement(_ErrorMessage.default, { error: this.props.error }), _react.default.createElement("div", { style: styles.parent }, this.props.reboot ? null : _react.default.createElement("iframe", { sandbox: sandbox, style: styles.frame, ref: this.handleFrame, width: this.props.width, height: this.props.height })), _react.default.createElement("div", { style: { flex: 0 } }, this.props.setLocation ? _react.default.createElement("svg", { fill: "white", style: styles.button, viewBox: "0 0 24 24", onClick: this.handleClickReload }, _react.default.createElement("path", { d: "M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z" })) : null, this.props.toggleFullScreen ? _react.default.createElement("svg", { fill: "white", style: styles.button, viewBox: "0 0 24 24", onClick: this.handleClickExit }, _react.default.createElement("path", { d: "M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z" })) : null)); } }]); return Screen; }(_react.PureComponent); exports.default = Screen; (0, _defineProperty2.default)(Screen, "propTypes", { reboot: _propTypes.default.bool.isRequired, animation: _propTypes.default.bool.isRequired, display: _propTypes.default.bool.isRequired, frameRef: _propTypes.default.func.isRequired, setLocation: _propTypes.default.func, toggleFullScreen: _propTypes.default.func, error: _propTypes.default.object, width: _propTypes.default.number.isRequired, height: _propTypes.default.number.isRequired, isFullScreen: _propTypes.default.bool.isRequired }); (0, _defineProperty2.default)(Screen, "defaultProps", { animation: false, display: false, error: null, isFullScreen: false });