UNPKG

quiz-interactions

Version:

A React UI component Library for quiz interaction types.

321 lines (272 loc) 9.57 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 _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 _lodash = require("lodash"); var _uiElements = require("@instructure/ui-elements"); var _uiThemeable = require("@instructure/ui-themeable"); var _Edit = _interopRequireDefault(require("../Edit")); var _Show = _interopRequireDefault(require("../Show")); var _Take = _interopRequireDefault(require("../Take")); var _Result = _interopRequireDefault(require("../Result")); var _defaultTheme = _interopRequireDefault(require("../../common/example/defaultTheme")); var _dec, _class, _class2, _temp; var styles = { componentId: 'ckcaF', template: function template(theme) { return "\n\n.egxol_dXOl{flex:1;padding:".concat(theme.panelPadding || 'inherit', "}\n\n.egxol_qOas{display:flex}"); }, 'panel': 'egxol_dXOl', 'row': 'egxol_qOas' }; var _ref = /*#__PURE__*/ _react.default.createElement(_uiElements.Heading, { level: "h2" }, "Edit"); var _ref2 = /*#__PURE__*/ _react.default.createElement(_uiElements.Heading, { level: "h2" }, "Show"); var _ref3 = /*#__PURE__*/ _react.default.createElement(_uiElements.Heading, { level: "h2" }, "Take"); var _ref4 = /*#__PURE__*/ _react.default.createElement(_uiElements.Heading, { level: "h2" }, "Result"); var HotSpotExample = ( /** --- category: HotSpot --- HotSpot Example. ```jsx_example <SettingsSwitcher locales={LOCALES}> <HotSpotExample /> </SettingsSwitcher> ``` **/ _dec = (0, _uiThemeable.themeable)(_defaultTheme.default, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/ function (_Component) { (0, _inherits2.default)(HotSpotExample, _Component); function HotSpotExample(props) { var _this; (0, _classCallCheck2.default)(this, HotSpotExample); _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(HotSpotExample).call(this, props)); _this.handleChangeItemState = function (itemState) { var newState = {}; if (itemState.interactionData) { newState.takeInteractionData = _this.transformTakeInteractionData(itemState.interactionData); } var updatedState = Object.assign({}, itemState, newState); _this.setState(updatedState); }; _this.handleResponseUpdate = function (userResponse) { _this.setState({ userResponse: { value: userResponse } }); }; _this.state = {}; if (props.useDefaultData) { Object.assign(_this.state, { itemBody: 'Which of these players is David Ferrer', interactionData: { imageUrl: 'https://i.ytimg.com/vi/LgkAebhJ7iE/maxresdefault.jpg' }, scoringData: { value: { type: 'square', coordinates: [{ x: 0.1, y: 0.13 }, { x: 0.07, y: 0.14 }] } }, userResponse: { value: { x: 0.3, y: 0.3 } } }); _this.state.scoredData = _this.transformScoredData(); _this.state.takeInteractionData = _this.transformTakeInteractionData(_this.state.interactionData); } return _this; } (0, _createClass2.default)(HotSpotExample, [{ key: "transformScoredData", value: function transformScoredData() { var coordinates = this.state.scoringData.value.coordinates; // fix coordinates length to do not break result view if (coordinates.length === 1) { coordinates.push(coordinates[0]); } else if (coordinates.length === 0) { coordinates = [{ x: 0, y: 0 }, { x: 0, y: 0 }]; } var resultScore = 0; var userResp = this.state.userResponse.value; var type = this.state.scoringData.value.type; if (type === 'square') { resultScore = this.isInsideSquare(userResp, coordinates) ? 1 : 0; } else if (type === 'oval') { resultScore = this.isInsideEllipse(userResp, coordinates) ? 1 : 0; } else if (type === 'polygon') { resultScore = this.isInsidePolygon(userResp, coordinates) ? 1 : 0; } return { value: { type: this.state.scoringData.value.type, resultScore: resultScore, userResponse: this.state.userResponse.value, correctAnswer: coordinates } }; } }, { key: "isInsideSquare", value: function isInsideSquare(userResp, coordinates) { var coord1 = coordinates[0]; var coord2 = coordinates[1]; // (x1 < px < x2) && (y1 < py < y2) if (coord1.x <= userResp.x && userResp.x <= coord2.x + coord1.x && coord1.y <= userResp.y && userResp.y <= coord2.y + coord1.y) { return true; } } }, { key: "isInsideEllipse", value: function isInsideEllipse(userResp, coordinates) { var coord1 = coordinates[0]; var coord2 = coordinates[1]; var radiusX = Math.abs((coord2.x - coord1.x) * 0.5); var radiusY = Math.abs((coord2.y - coord1.y) * 0.5); var centerX = coord1.x + radiusX; var centerY = coord1.y + radiusY; // fix the center var x = (userResp.x - centerX) * (userResp.x - centerX); var y = (userResp.y - centerY) * (userResp.y - centerY); // ((x*x)/(a*a) + (y*y)/(b*b)) <= 1 ellipse equation var resp = x / (radiusX * radiusX) + y / (radiusY * radiusY); if (resp <= 1) { return true; } } }, { key: "isInsidePolygon", value: function isInsidePolygon(point, vs) { var x = point.x; var y = point.y; // ray-casting algorithm based on // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html var inside = false; for (var i = 0, j = vs.length - 1; i < vs.length; j = i++) { var xi = vs[i].x; var yi = vs[i].y; var xj = vs[j].x; var yj = vs[j].y; var intersect = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi; if (intersect) { inside = !inside; } } return inside; } }, { key: "transformTakeInteractionData", value: function transformTakeInteractionData(interactionData) { return (0, _lodash.cloneDeep)(interactionData); } }, { key: "renderEdit", value: function renderEdit() { return _react.default.createElement("div", { title: "edit" }, _ref, _react.default.createElement(_Edit.default, { changeItemState: this.handleChangeItemState, interactionData: this.state.interactionData, itemBody: this.state.itemBody, scoringData: this.state.scoringData })); } }, { key: "renderShow", value: function renderShow() { return _react.default.createElement("div", { title: "show" }, _ref2, _react.default.createElement(_Show.default, { interactionData: this.state.interactionData, itemBody: this.state.itemBody, scoringData: this.state.scoringData })); } }, { key: "renderTake", value: function renderTake() { return _react.default.createElement("div", { title: "take" }, _ref3, _react.default.createElement(_Take.default, { interactionData: this.state.takeInteractionData, itemBody: this.state.itemBody, userResponse: this.state.userResponse, handleResponseUpdate: this.handleResponseUpdate })); } }, { key: "renderResult", value: function renderResult() { return _react.default.createElement("div", { title: "result" }, _ref4, _react.default.createElement(_Result.default, { interactionData: this.state.takeInteractionData, itemBody: this.state.itemBody, scoredData: this.transformScoredData() })); } }, { key: "render", value: function render() { return _react.default.createElement("div", null, _react.default.createElement("div", { className: styles.row }, _react.default.createElement("div", { className: styles.panel }, this.renderEdit()), _react.default.createElement("div", { className: styles.panel }, this.renderShow())), _react.default.createElement("div", { className: styles.row }, _react.default.createElement("div", { className: styles.panel }, this.renderTake()), _react.default.createElement("div", { className: styles.panel }, this.renderResult()))); } }]); HotSpotExample.displayName = "HotSpotExample"; return HotSpotExample; }(_react.Component), _class2.propTypes = { useDefaultData: _propTypes.default.bool }, _class2.defaultProps = { useDefaultData: true }, _temp)) || _class); exports.default = HotSpotExample;