UNPKG

quiz-interactions

Version:

A React UI component Library for quiz interaction types.

258 lines (225 loc) 8.49 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); 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 _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _uiThemeable = require("@instructure/ui-themeable"); var _pickBy = _interopRequireDefault(require("lodash/pickBy")); var _propTypes2 = _interopRequireWildcard(require("./propTypes")); var _theme = _interopRequireDefault(require("./theme")); var _dec, _class, _class2, _temp; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var styles = { componentId: 'fjxel', template: function template(theme) { return "\n\n.fjxel_eVTu{left:50%;max-height:100%;max-width:100%;position:absolute;top:50%;transform:translate(-50%,-50%)}\n\n.fjxel_cjLo:hover{cursor:crosshair}"; }, 'canvasWrapper': 'fjxel_eVTu', 'canvas': 'fjxel_cjLo' }; var Canvas = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/ function (_Component) { (0, _inherits2.default)(Canvas, _Component); function Canvas(props) { var _this; (0, _classCallCheck2.default)(this, Canvas); _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Canvas).call(this, props)); // these handlers shouldn't change, so set them once per initialization _this.state = { isDrawing: false }; _this.refCanvas = function (node) { _this.canvasElement = node; }; _this.drawShape = function (coordinates) { _this.clearCanvas(); _this.props.drawShape(coordinates); }; _this.onMouseOut = function (e) { // the mouse out event is handled by default as a click/release on the exiting canvas border _this.props.onMouseOut // eslint-disable-line no-unused-expressions ? _this.props.onMouseOut(e) : function (e) {}; }; _this.eventHandlers = _objectSpread({ onMouseOut: _this.onMouseOut }, (0, _pickBy.default)(props, function (prop, propName) { return prop !== null && propName.startsWith('on'); })); return _this; } (0, _createClass2.default)(Canvas, [{ key: "componentDidMount", value: function componentDidMount() { if (this.props.realRef) { this.props.realRef(this); } this.drawShape(this.props.coordinates); } }, { key: "componentDidUpdate", value: function componentDidUpdate() { this.drawShape(this.props.coordinates); if (this.isDrawing()) { this.canvasElement.focus(); } } // =========== // HELPERS // =========== }, { key: "isDrawing", value: function isDrawing() { return this.state.isDrawing; } }, { key: "getInitialCoordinate", value: function getInitialCoordinate() { return this.props.coordinates[0]; } }, { key: "getLastCoordinate", value: function getLastCoordinate() { return this.props.coordinates[this.props.coordinates.length - 1]; } }, { key: "getCurrentCoordinates", value: function getCurrentCoordinates(e) { var x = e.nativeEvent.offsetX; var y = e.nativeEvent.offsetY; return { x: x, y: y }; } }, { key: "convertTouchCoordinates", value: function convertTouchCoordinates(touchEvent) { var rect = this.canvasElement.getBoundingClientRect(); var x = touchEvent.changedTouches[0].pageX - rect.left; var y = touchEvent.changedTouches[0].pageY - rect.top; var evt = { nativeEvent: { offsetX: x, offsetY: y } }; return evt; } }, { key: "focus", value: function focus() { this.canvasElement.focus(); } }, { key: "clearCanvas", value: function clearCanvas() { var ctx = this.canvasElement.getContext('2d'); ctx.clearRect(0, 0, this.canvasElement.width, this.canvasElement.height); } }, { key: "setStrokeStyle", value: function setStrokeStyle() { var color = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : this.theme.shapeColor; var ctx = this.canvasElement.getContext('2d'); ctx.lineWidth = 2; ctx.strokeStyle = color; } }, { key: "setFillStyle", value: function setFillStyle() { var color = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : this.theme.shapeColor; var ctx = this.canvasElement.getContext('2d'); ctx.globalAlpha = 0.5; ctx.fillStyle = color; } }, { key: "startDrawing", value: function startDrawing(e) { var initialCoordinate = this.getCurrentCoordinates(e); this.props.handleSetCoordinates([initialCoordinate]); this.setState({ isDrawing: true }); } }, { key: "stopDrawing", value: function stopDrawing(coordinates) { this.props.handleSetCoordinates(coordinates); this.setState({ isDrawing: false }); } // =========== // HANDLERS // =========== }, { key: "renderCanvas", // =========== // RENDER // =========== value: function renderCanvas() { if (this.props.readOnly) { return _react.default.createElement("canvas", { height: this.props.height, ref: this.refCanvas, width: this.props.width }); } return ( /* eslint-disable jsx-a11y/no-interactive-element-to-noninteractive-role */ _react.default.createElement("canvas", Object.assign({ className: styles.canvas, height: this.props.height, ref: this.refCanvas, tabIndex: "0", width: this.props.width, onBlur: this.onMouseOut }, this.eventHandlers)) ); } }, { key: "render", value: function render() { return _react.default.createElement("div", { className: styles.canvasWrapper }, this.renderCanvas()); } }]); Canvas.displayName = "Canvas"; return Canvas; }(_react.Component), _class2.propTypes = _objectSpread({}, _propTypes2.default, { realRef: _propTypes.default.func, drawShape: _propTypes.default.func.isRequired, onMouseOut: _propTypes.default.func, onMouseMove: _propTypes.default.func, onDoubleClick: _propTypes.default.func, onClick: _propTypes.default.func, onKeyPress: _propTypes.default.func, onMouseDown: _propTypes.default.func, onMouseUp: _propTypes.default.func, onTouchStart: _propTypes.default.func, onTouchMove: _propTypes.default.func, onTouchEnd: _propTypes.default.func }), _class2.defaultProps = _objectSpread({ realRef: null, onMouseOut: null, onMouseMove: null, onDoubleClick: null, onClick: null, onKeyPress: null, onMouseDown: null, onMouseUp: null, onTouchStart: null, onTouchMove: null, onTouchEnd: null }, _propTypes2.defaultProps), _temp)) || _class); exports.default = Canvas;