@pie-element/hotspot 9.1.0 → 9.2.0-mui-update.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/configure/CHANGELOG.md +66 -0
  3. package/configure/lib/DeleteWidget.js +31 -44
  4. package/configure/lib/DeleteWidget.js.map +1 -1
  5. package/configure/lib/__tests__/DeleteWidget.test.js +60 -0
  6. package/configure/lib/__tests__/hotspot-container.test.js +377 -0
  7. package/configure/lib/__tests__/hotspot-drawable.test.js +233 -0
  8. package/configure/lib/__tests__/index.test.js +211 -0
  9. package/configure/lib/__tests__/root.test.js +440 -0
  10. package/configure/lib/__tests__/utils.test.js +287 -0
  11. package/configure/lib/button.js +27 -46
  12. package/configure/lib/button.js.map +1 -1
  13. package/configure/lib/buttons/circle.js +21 -28
  14. package/configure/lib/buttons/circle.js.map +1 -1
  15. package/configure/lib/buttons/polygon.js +27 -34
  16. package/configure/lib/buttons/polygon.js.map +1 -1
  17. package/configure/lib/buttons/rectangle.js +27 -34
  18. package/configure/lib/buttons/rectangle.js.map +1 -1
  19. package/configure/lib/defaults.js +3 -4
  20. package/configure/lib/defaults.js.map +1 -1
  21. package/configure/lib/hotspot-circle.js +133 -199
  22. package/configure/lib/hotspot-circle.js.map +1 -1
  23. package/configure/lib/hotspot-container.js +251 -356
  24. package/configure/lib/hotspot-container.js.map +1 -1
  25. package/configure/lib/hotspot-drawable.js +361 -473
  26. package/configure/lib/hotspot-drawable.js.map +1 -1
  27. package/configure/lib/hotspot-palette.js +93 -140
  28. package/configure/lib/hotspot-palette.js.map +1 -1
  29. package/configure/lib/hotspot-polygon.js +213 -318
  30. package/configure/lib/hotspot-polygon.js.map +1 -1
  31. package/configure/lib/hotspot-rectangle.js +129 -193
  32. package/configure/lib/hotspot-rectangle.js.map +1 -1
  33. package/configure/lib/icons.js +1 -1
  34. package/configure/lib/icons.js.map +1 -1
  35. package/configure/lib/image-konva.js +47 -87
  36. package/configure/lib/image-konva.js.map +1 -1
  37. package/configure/lib/index.js +163 -223
  38. package/configure/lib/index.js.map +1 -1
  39. package/configure/lib/root.js +302 -394
  40. package/configure/lib/root.js.map +1 -1
  41. package/configure/lib/shapes/circle.js +70 -102
  42. package/configure/lib/shapes/circle.js.map +1 -1
  43. package/configure/lib/shapes/index.js +5 -13
  44. package/configure/lib/shapes/index.js.map +1 -1
  45. package/configure/lib/shapes/polygon.js +65 -97
  46. package/configure/lib/shapes/polygon.js.map +1 -1
  47. package/configure/lib/shapes/rectagle.js +70 -102
  48. package/configure/lib/shapes/rectagle.js.map +1 -1
  49. package/configure/lib/shapes/utils.js +3 -9
  50. package/configure/lib/shapes/utils.js.map +1 -1
  51. package/configure/lib/upload-control.js +26 -53
  52. package/configure/lib/upload-control.js.map +1 -1
  53. package/configure/lib/utils.js +85 -138
  54. package/configure/lib/utils.js.map +1 -1
  55. package/configure/package.json +11 -10
  56. package/configure/src/__tests__/index.test.js +11 -5
  57. package/configure/src/button.jsx +12 -20
  58. package/configure/src/hotspot-circle.jsx +5 -18
  59. package/configure/src/hotspot-container.jsx +82 -98
  60. package/configure/src/hotspot-drawable.jsx +43 -45
  61. package/configure/src/hotspot-palette.jsx +45 -37
  62. package/configure/src/hotspot-polygon.jsx +4 -20
  63. package/configure/src/hotspot-rectangle.jsx +4 -17
  64. package/configure/src/index.js +12 -2
  65. package/configure/src/root.jsx +85 -79
  66. package/configure/src/upload-control.jsx +6 -16
  67. package/controller/CHANGELOG.md +52 -0
  68. package/controller/lib/__tests__/index.test.js +586 -0
  69. package/controller/lib/__tests__/utils.test.js +8 -0
  70. package/controller/lib/defaults.js +3 -4
  71. package/controller/lib/defaults.js.map +1 -1
  72. package/controller/lib/index.js +152 -206
  73. package/controller/lib/index.js.map +1 -1
  74. package/controller/lib/utils.js +15 -35
  75. package/controller/lib/utils.js.map +1 -1
  76. package/controller/package.json +2 -2
  77. package/docs/demo/pie.manifest.json +11 -0
  78. package/lib/__tests__/container.test.js +221 -0
  79. package/lib/__tests__/index.test.js +113 -0
  80. package/lib/__tests__/polygon.test.js +245 -0
  81. package/lib/__tests__/rectangle.test.js +236 -0
  82. package/lib/__tests__/session-updater.test.js +69 -0
  83. package/lib/hotspot/circle.js +111 -170
  84. package/lib/hotspot/circle.js.map +1 -1
  85. package/lib/hotspot/container.js +175 -261
  86. package/lib/hotspot/container.js.map +1 -1
  87. package/lib/hotspot/icons.js +1 -1
  88. package/lib/hotspot/icons.js.map +1 -1
  89. package/lib/hotspot/image-konva-tooltip.js +66 -113
  90. package/lib/hotspot/image-konva-tooltip.js.map +1 -1
  91. package/lib/hotspot/index.js +136 -199
  92. package/lib/hotspot/index.js.map +1 -1
  93. package/lib/hotspot/polygon.js +151 -215
  94. package/lib/hotspot/polygon.js.map +1 -1
  95. package/lib/hotspot/rectangle.js +130 -186
  96. package/lib/hotspot/rectangle.js.map +1 -1
  97. package/lib/index.js +188 -257
  98. package/lib/index.js.map +1 -1
  99. package/lib/session-updater.js +13 -19
  100. package/lib/session-updater.js.map +1 -1
  101. package/package.json +14 -11
  102. package/src/hotspot/circle.jsx +2 -13
  103. package/src/hotspot/container.jsx +35 -50
  104. package/src/hotspot/index.jsx +16 -28
  105. package/src/hotspot/polygon.jsx +4 -13
  106. package/src/hotspot/rectangle.jsx +4 -13
  107. package/src/index.js +21 -12
  108. package/LICENSE.md +0 -5
  109. package/configure/node_modules/debug/CHANGELOG.md +0 -395
  110. package/configure/node_modules/debug/LICENSE +0 -19
  111. package/configure/node_modules/debug/README.md +0 -437
  112. package/configure/node_modules/debug/node.js +0 -1
  113. package/configure/node_modules/debug/package.json +0 -51
  114. package/configure/node_modules/debug/src/browser.js +0 -180
  115. package/configure/node_modules/debug/src/common.js +0 -249
  116. package/configure/node_modules/debug/src/index.js +0 -12
  117. package/configure/node_modules/debug/src/node.js +0 -177
package/lib/index.js CHANGED
@@ -1,282 +1,213 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
- exports["default"] = void 0;
9
-
10
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
-
12
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
-
14
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
15
-
16
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
17
-
18
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
19
-
20
- var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapNativeSuper"));
21
-
7
+ exports.default = void 0;
22
8
  var _react = _interopRequireDefault(require("react"));
23
-
24
- var _reactDom = _interopRequireDefault(require("react-dom"));
25
-
9
+ var _client = require("react-dom/client");
26
10
  var _mathRendering = require("@pie-lib/math-rendering");
27
-
28
11
  var _renderUi = require("@pie-lib/render-ui");
29
-
30
12
  var _piePlayerEvents = require("@pie-framework/pie-player-events");
31
-
32
13
  var _hotspot = _interopRequireDefault(require("./hotspot"));
33
-
34
14
  var _sessionUpdater = require("./session-updater");
35
-
36
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
37
-
38
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
39
-
40
- var Hotspot = /*#__PURE__*/function (_HTMLElement) {
41
- (0, _inherits2["default"])(Hotspot, _HTMLElement);
42
-
43
- var _super = _createSuper(Hotspot);
44
-
45
- function Hotspot() {
46
- var _this;
47
-
48
- (0, _classCallCheck2["default"])(this, Hotspot);
49
- _this = _super.call(this);
50
- _this._model = null;
51
- _this._session = null;
52
- _this._audioInitialized = false;
53
- _this.audioComplete = false;
54
- return _this;
15
+ class Hotspot extends HTMLElement {
16
+ constructor() {
17
+ super();
18
+ this._model = null;
19
+ this._session = null;
20
+ this._audioInitialized = false;
21
+ this.audioComplete = false;
22
+ this._root = null;
55
23
  }
56
-
57
- (0, _createClass2["default"])(Hotspot, [{
58
- key: "model",
59
- set: function set(m) {
60
- this._model = m;
61
- this.dispatchEvent(new _piePlayerEvents.ModelSetEvent(this.tagName.toLowerCase(), this.isComplete(), !!this._model));
62
- this._audioInitialized = false;
63
-
64
- this._render();
24
+ set model(m) {
25
+ this._model = m;
26
+ this.dispatchEvent(new _piePlayerEvents.ModelSetEvent(this.tagName.toLowerCase(), this.isComplete(), !!this._model));
27
+ this._audioInitialized = false;
28
+ this._render();
29
+ }
30
+ isComplete() {
31
+ if (!this._session || !this._session.answers) {
32
+ return false;
65
33
  }
66
- }, {
67
- key: "isComplete",
68
- value: function isComplete() {
69
- if (!this._session || !this._session.answers) {
70
- return false;
71
- }
72
-
73
- var _ref = this._model || {},
74
- autoplayAudioEnabled = _ref.autoplayAudioEnabled,
75
- completeAudioEnabled = _ref.completeAudioEnabled;
76
-
77
- var elementContext = this; // check audio completion if audio settings are enabled and audio actually exists
78
-
79
- if (autoplayAudioEnabled && completeAudioEnabled && !this.audioComplete) {
80
- if (elementContext) {
81
- var audio = elementContext.querySelector('audio');
82
- var isInsidePrompt = audio && audio.closest('#preview-prompt'); // only require audio completion if audio exists and is inside the prompt
83
-
84
- if (audio && isInsidePrompt) {
85
- return false;
86
- }
34
+ const {
35
+ autoplayAudioEnabled,
36
+ completeAudioEnabled
37
+ } = this._model || {};
38
+ const elementContext = this;
39
+
40
+ // check audio completion if audio settings are enabled and audio actually exists
41
+ if (autoplayAudioEnabled && completeAudioEnabled && !this.audioComplete) {
42
+ if (elementContext) {
43
+ const audio = elementContext.querySelector('audio');
44
+ const isInsidePrompt = audio && audio.closest('#preview-prompt');
45
+
46
+ // only require audio completion if audio exists and is inside the prompt
47
+ if (audio && isInsidePrompt) {
48
+ return false;
87
49
  }
88
50
  }
89
-
90
- if (!Array.isArray(this._session.answers)) {
91
- return false;
92
- }
93
-
94
- return this._session.answers.length > 0;
95
- }
96
- }, {
97
- key: "session",
98
- get: function get() {
99
- return this._session;
100
- },
101
- set: function set(s) {
102
- if (s && !s.answers) {
103
- s.answers = [];
104
- }
105
-
106
- this._session = s;
107
-
108
- this._render();
109
51
  }
110
- }, {
111
- key: "onSelectChoice",
112
- value: function onSelectChoice(data) {
113
- (0, _sessionUpdater.updateSessionValue)(this._session, this._model, data);
114
- this.dispatchEvent(new _piePlayerEvents.SessionChangedEvent(this.tagName.toLowerCase(), this.isComplete()));
115
-
116
- this._render();
52
+ if (!Array.isArray(this._session.answers)) {
53
+ return false;
117
54
  }
118
- }, {
119
- key: "_createAudioInfoToast",
120
- value: function _createAudioInfoToast() {
121
- var info = document.createElement('div');
122
- info.id = 'play-audio-info';
123
- Object.assign(info.style, {
124
- position: 'absolute',
125
- top: 0,
126
- width: '100%',
127
- height: '100%',
128
- display: 'flex',
129
- justifyContent: 'center',
130
- alignItems: 'center',
131
- background: 'white',
132
- zIndex: '1000',
133
- cursor: 'pointer'
134
- });
135
- var img = document.createElement('img');
136
- img.src = _renderUi.EnableAudioAutoplayImage;
137
- img.alt = 'Click anywhere to enable audio autoplay';
138
- img.width = 500;
139
- img.height = 300;
140
- info.appendChild(img);
141
- return info;
55
+ return this._session.answers.length > 0;
56
+ }
57
+ set session(s) {
58
+ if (s && !s.answers) {
59
+ s.answers = [];
142
60
  }
143
- }, {
144
- key: "connectedCallback",
145
- value: function connectedCallback() {
146
- var _this2 = this;
147
-
148
- this._render(); // Observation: audio in Chrome will have the autoplay attribute,
149
- // while other browsers will not have the autoplay attribute and will need a user interaction to play the audio
150
- // This workaround fixes the issue of audio being cached and played on any user interaction in Safari and Firefox
151
-
152
-
153
- var observer = new MutationObserver(function (mutationsList, observer) {
154
- mutationsList.forEach(function (mutation) {
155
- if (mutation.type === 'childList') {
156
- if (_this2._audioInitialized) return;
157
-
158
- var audio = _this2.querySelector('audio');
159
-
160
- var isInsidePrompt = audio && audio.closest('#preview-prompt');
161
- if (!_this2._model) return;
162
- if (!_this2._model.autoplayAudioEnabled) return;
163
- if (audio && !isInsidePrompt) return;
164
- if (!audio) return;
165
-
166
- var info = _this2._createAudioInfoToast();
167
-
168
- var container = _this2.querySelector('#main-container');
169
-
170
- var enableAudio = function enableAudio() {
171
- if (_this2.querySelector('#play-audio-info')) {
172
- audio.play();
173
- container.removeChild(info);
174
- }
175
-
61
+ this._session = s;
62
+ this._render();
63
+ }
64
+ get session() {
65
+ return this._session;
66
+ }
67
+ onSelectChoice(data) {
68
+ (0, _sessionUpdater.updateSessionValue)(this._session, this._model, data);
69
+ this.dispatchEvent(new _piePlayerEvents.SessionChangedEvent(this.tagName.toLowerCase(), this.isComplete()));
70
+ this._render();
71
+ }
72
+ _createAudioInfoToast() {
73
+ const info = document.createElement('div');
74
+ info.id = 'play-audio-info';
75
+ Object.assign(info.style, {
76
+ position: 'absolute',
77
+ top: 0,
78
+ width: '100%',
79
+ height: '100%',
80
+ display: 'flex',
81
+ justifyContent: 'center',
82
+ alignItems: 'center',
83
+ background: 'white',
84
+ zIndex: '1000',
85
+ cursor: 'pointer'
86
+ });
87
+ const img = document.createElement('img');
88
+ img.src = _renderUi.EnableAudioAutoplayImage;
89
+ img.alt = 'Click anywhere to enable audio autoplay';
90
+ img.width = 500;
91
+ img.height = 300;
92
+ info.appendChild(img);
93
+ return info;
94
+ }
95
+ connectedCallback() {
96
+ this._render();
97
+
98
+ // Observation: audio in Chrome will have the autoplay attribute,
99
+ // while other browsers will not have the autoplay attribute and will need a user interaction to play the audio
100
+ // This workaround fixes the issue of audio being cached and played on any user interaction in Safari and Firefox
101
+ const observer = new MutationObserver((mutationsList, observer) => {
102
+ mutationsList.forEach(mutation => {
103
+ if (mutation.type === 'childList') {
104
+ if (this._audioInitialized) return;
105
+ const audio = this.querySelector('audio');
106
+ const isInsidePrompt = audio && audio.closest('#preview-prompt');
107
+ if (!this._model) return;
108
+ if (!this._model.autoplayAudioEnabled) return;
109
+ if (audio && !isInsidePrompt) return;
110
+ if (!audio) return;
111
+ const info = this._createAudioInfoToast();
112
+ const container = this.querySelector('#main-container');
113
+ const enableAudio = () => {
114
+ if (this.querySelector('#play-audio-info')) {
115
+ audio.play();
116
+ container.removeChild(info);
117
+ }
118
+ document.removeEventListener('click', enableAudio);
119
+ };
120
+
121
+ // if the audio is paused, it means the user has not interacted with the page yet and the audio will not play
122
+ // FIX FOR SAFARI: play with a slight delay to check if autoplay was blocked
123
+ setTimeout(() => {
124
+ if (audio.paused && !this.querySelector('#play-audio-info')) {
125
+ // add info message as a toast to enable audio playback
126
+ container.appendChild(info);
127
+ document.addEventListener('click', enableAudio);
128
+ } else {
176
129
  document.removeEventListener('click', enableAudio);
177
- }; // if the audio is paused, it means the user has not interacted with the page yet and the audio will not play
178
- // FIX FOR SAFARI: play with a slight delay to check if autoplay was blocked
179
-
180
-
181
- setTimeout(function () {
182
- if (audio.paused && !_this2.querySelector('#play-audio-info')) {
183
- // add info message as a toast to enable audio playback
184
- container.appendChild(info);
185
- document.addEventListener('click', enableAudio);
186
- } else {
187
- document.removeEventListener('click', enableAudio);
188
- }
189
- }, 500); // we need to listen for the playing event to remove the toast in case the audio plays because of re-rendering
190
-
191
- var handlePlaying = function handlePlaying() {
192
- //timestamp when auto-played audio started playing
193
- (0, _sessionUpdater.updateSessionMetadata)(_this2._session, {
194
- audioStartTime: new Date().getTime()
195
- });
196
-
197
- var info = _this2.querySelector('#play-audio-info');
198
-
199
- if (info) {
200
- container.removeChild(info);
201
- }
202
-
203
- audio.removeEventListener('playing', handlePlaying);
204
- };
205
-
206
- audio.addEventListener('playing', handlePlaying); // we need to listen for the ended event to update the isComplete state
207
-
208
- var handleEnded = function handleEnded() {
209
- //timestamp when auto-played audio completed playing
210
- (0, _sessionUpdater.updateSessionMetadata)(_this2._session, {
211
- audioEndTime: new Date().getTime()
212
- });
213
- var _this2$_session = _this2._session,
214
- audioStartTime = _this2$_session.audioStartTime,
215
- audioEndTime = _this2$_session.audioEndTime,
216
- waitTime = _this2$_session.waitTime;
217
-
218
- if (!waitTime && audioStartTime && audioEndTime) {
219
- // waitTime is elapsed time the user waited for auto-played audio to finish
220
- _this2._session.waitTime = audioEndTime - audioStartTime;
221
- }
222
-
223
- _this2.audioComplete = true;
224
-
225
- _this2.dispatchEvent(new _piePlayerEvents.SessionChangedEvent(_this2.tagName.toLowerCase(), _this2.isComplete()));
226
-
227
- audio.removeEventListener('ended', handleEnded);
228
- };
229
-
230
- audio.addEventListener('ended', handleEnded); // store references to remove later
231
-
232
- _this2._audio = audio;
233
- _this2._handlePlaying = handlePlaying;
234
- _this2._handleEnded = handleEnded;
235
- _this2._enableAudio = enableAudio; // set to true to prevent multiple initializations
236
-
237
- _this2._audioInitialized = true;
238
- observer.disconnect();
239
- }
240
- });
130
+ }
131
+ }, 500);
132
+
133
+ // we need to listen for the playing event to remove the toast in case the audio plays because of re-rendering
134
+ const handlePlaying = () => {
135
+ //timestamp when auto-played audio started playing
136
+ (0, _sessionUpdater.updateSessionMetadata)(this._session, {
137
+ audioStartTime: new Date().getTime()
138
+ });
139
+ const info = this.querySelector('#play-audio-info');
140
+ if (info) {
141
+ container.removeChild(info);
142
+ }
143
+ audio.removeEventListener('playing', handlePlaying);
144
+ };
145
+ audio.addEventListener('playing', handlePlaying);
146
+
147
+ // we need to listen for the ended event to update the isComplete state
148
+ const handleEnded = () => {
149
+ //timestamp when auto-played audio completed playing
150
+ (0, _sessionUpdater.updateSessionMetadata)(this._session, {
151
+ audioEndTime: new Date().getTime()
152
+ });
153
+ let {
154
+ audioStartTime,
155
+ audioEndTime,
156
+ waitTime
157
+ } = this._session;
158
+ if (!waitTime && audioStartTime && audioEndTime) {
159
+ // waitTime is elapsed time the user waited for auto-played audio to finish
160
+ this._session.waitTime = audioEndTime - audioStartTime;
161
+ }
162
+ this.audioComplete = true;
163
+ this.dispatchEvent(new _piePlayerEvents.SessionChangedEvent(this.tagName.toLowerCase(), this.isComplete()));
164
+ audio.removeEventListener('ended', handleEnded);
165
+ };
166
+ audio.addEventListener('ended', handleEnded);
167
+
168
+ // store references to remove later
169
+ this._audio = audio;
170
+ this._handlePlaying = handlePlaying;
171
+ this._handleEnded = handleEnded;
172
+ this._enableAudio = enableAudio;
173
+ // set to true to prevent multiple initializations
174
+ this._audioInitialized = true;
175
+ observer.disconnect();
176
+ }
241
177
  });
242
- observer.observe(this, {
243
- childList: true,
244
- subtree: true
178
+ });
179
+ observer.observe(this, {
180
+ childList: true,
181
+ subtree: true
182
+ });
183
+ }
184
+ _render() {
185
+ if (this._model && this._session) {
186
+ const el = /*#__PURE__*/_react.default.createElement(_hotspot.default, {
187
+ model: this._model,
188
+ session: this._session,
189
+ onSelectChoice: this.onSelectChoice.bind(this)
245
190
  });
246
- }
247
- }, {
248
- key: "disconnectedCallback",
249
- value: function disconnectedCallback() {
250
- document.removeEventListener('click', this._enableAudio);
251
-
252
- if (this._audio) {
253
- this._audio.removeEventListener('playing', this._handlePlaying);
254
-
255
- this._audio.removeEventListener('ended', this._handleEnded);
256
-
257
- this._audio = null;
191
+ if (!this._root) {
192
+ this._root = (0, _client.createRoot)(this);
258
193
  }
194
+ this._root.render(el);
195
+ queueMicrotask(() => {
196
+ (0, _mathRendering.renderMath)(this);
197
+ });
259
198
  }
260
- }, {
261
- key: "_render",
262
- value: function _render() {
263
- var _this3 = this;
264
-
265
- if (this._model && this._session) {
266
- var el = /*#__PURE__*/_react["default"].createElement(_hotspot["default"], {
267
- model: this._model,
268
- session: this._session,
269
- onSelectChoice: this.onSelectChoice.bind(this)
270
- });
271
-
272
- _reactDom["default"].render(el, this, function () {
273
- (0, _mathRendering.renderMath)(_this3);
274
- });
275
- }
199
+ }
200
+ disconnectedCallback() {
201
+ document.removeEventListener('click', this._enableAudio);
202
+ if (this._audio) {
203
+ this._audio.removeEventListener('playing', this._handlePlaying);
204
+ this._audio.removeEventListener('ended', this._handleEnded);
205
+ this._audio = null;
276
206
  }
277
- }]);
278
- return Hotspot;
279
- }( /*#__PURE__*/(0, _wrapNativeSuper2["default"])(HTMLElement));
280
-
281
- exports["default"] = Hotspot;
282
- //# sourceMappingURL=index.js.map
207
+ if (this._root) {
208
+ this._root.unmount();
209
+ }
210
+ }
211
+ }
212
+ exports.default = Hotspot;
213
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9jbGllbnQiLCJfbWF0aFJlbmRlcmluZyIsIl9yZW5kZXJVaSIsIl9waWVQbGF5ZXJFdmVudHMiLCJfaG90c3BvdCIsIl9zZXNzaW9uVXBkYXRlciIsIkhvdHNwb3QiLCJIVE1MRWxlbWVudCIsImNvbnN0cnVjdG9yIiwiX21vZGVsIiwiX3Nlc3Npb24iLCJfYXVkaW9Jbml0aWFsaXplZCIsImF1ZGlvQ29tcGxldGUiLCJfcm9vdCIsIm1vZGVsIiwibSIsImRpc3BhdGNoRXZlbnQiLCJNb2RlbFNldEV2ZW50IiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwiaXNDb21wbGV0ZSIsIl9yZW5kZXIiLCJhbnN3ZXJzIiwiYXV0b3BsYXlBdWRpb0VuYWJsZWQiLCJjb21wbGV0ZUF1ZGlvRW5hYmxlZCIsImVsZW1lbnRDb250ZXh0IiwiYXVkaW8iLCJxdWVyeVNlbGVjdG9yIiwiaXNJbnNpZGVQcm9tcHQiLCJjbG9zZXN0IiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwic2Vzc2lvbiIsInMiLCJvblNlbGVjdENob2ljZSIsImRhdGEiLCJ1cGRhdGVTZXNzaW9uVmFsdWUiLCJTZXNzaW9uQ2hhbmdlZEV2ZW50IiwiX2NyZWF0ZUF1ZGlvSW5mb1RvYXN0IiwiaW5mbyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImlkIiwiT2JqZWN0IiwiYXNzaWduIiwic3R5bGUiLCJwb3NpdGlvbiIsInRvcCIsIndpZHRoIiwiaGVpZ2h0IiwiZGlzcGxheSIsImp1c3RpZnlDb250ZW50IiwiYWxpZ25JdGVtcyIsImJhY2tncm91bmQiLCJ6SW5kZXgiLCJjdXJzb3IiLCJpbWciLCJzcmMiLCJFbmFibGVBdWRpb0F1dG9wbGF5SW1hZ2UiLCJhbHQiLCJhcHBlbmRDaGlsZCIsImNvbm5lY3RlZENhbGxiYWNrIiwib2JzZXJ2ZXIiLCJNdXRhdGlvbk9ic2VydmVyIiwibXV0YXRpb25zTGlzdCIsImZvckVhY2giLCJtdXRhdGlvbiIsInR5cGUiLCJjb250YWluZXIiLCJlbmFibGVBdWRpbyIsInBsYXkiLCJyZW1vdmVDaGlsZCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJzZXRUaW1lb3V0IiwicGF1c2VkIiwiYWRkRXZlbnRMaXN0ZW5lciIsImhhbmRsZVBsYXlpbmciLCJ1cGRhdGVTZXNzaW9uTWV0YWRhdGEiLCJhdWRpb1N0YXJ0VGltZSIsIkRhdGUiLCJnZXRUaW1lIiwiaGFuZGxlRW5kZWQiLCJhdWRpb0VuZFRpbWUiLCJ3YWl0VGltZSIsIl9hdWRpbyIsIl9oYW5kbGVQbGF5aW5nIiwiX2hhbmRsZUVuZGVkIiwiX2VuYWJsZUF1ZGlvIiwiZGlzY29ubmVjdCIsIm9ic2VydmUiLCJjaGlsZExpc3QiLCJzdWJ0cmVlIiwiZWwiLCJSZWFjdCIsIkhvdHNwb3RDb21wb25lbnQiLCJiaW5kIiwiY3JlYXRlUm9vdCIsInJlbmRlciIsInF1ZXVlTWljcm90YXNrIiwicmVuZGVyTWF0aCIsImRpc2Nvbm5lY3RlZENhbGxiYWNrIiwidW5tb3VudCIsImV4cG9ydHMiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjcmVhdGVSb290IH0gZnJvbSAncmVhY3QtZG9tL2NsaWVudCc7XG5pbXBvcnQgeyByZW5kZXJNYXRoIH0gZnJvbSAnQHBpZS1saWIvbWF0aC1yZW5kZXJpbmcnO1xuaW1wb3J0IHsgRW5hYmxlQXVkaW9BdXRvcGxheUltYWdlIH0gZnJvbSAnQHBpZS1saWIvcmVuZGVyLXVpJztcbmltcG9ydCB7IFNlc3Npb25DaGFuZ2VkRXZlbnQsIE1vZGVsU2V0RXZlbnQgfSBmcm9tICdAcGllLWZyYW1ld29yay9waWUtcGxheWVyLWV2ZW50cyc7XG5cbmltcG9ydCBIb3RzcG90Q29tcG9uZW50IGZyb20gJy4vaG90c3BvdCc7XG5pbXBvcnQgeyB1cGRhdGVTZXNzaW9uVmFsdWUsIHVwZGF0ZVNlc3Npb25NZXRhZGF0YSB9IGZyb20gJy4vc2Vzc2lvbi11cGRhdGVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSG90c3BvdCBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9tb2RlbCA9IG51bGw7XG4gICAgdGhpcy5fc2Vzc2lvbiA9IG51bGw7XG4gICAgdGhpcy5fYXVkaW9Jbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIHRoaXMuYXVkaW9Db21wbGV0ZSA9IGZhbHNlO1xuICAgIHRoaXMuX3Jvb3QgPSBudWxsO1xuICB9XG5cbiAgc2V0IG1vZGVsKG0pIHtcbiAgICB0aGlzLl9tb2RlbCA9IG07XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IE1vZGVsU2V0RXZlbnQodGhpcy50YWdOYW1lLnRvTG93ZXJDYXNlKCksIHRoaXMuaXNDb21wbGV0ZSgpLCAhIXRoaXMuX21vZGVsKSk7XG4gICAgdGhpcy5fYXVkaW9Jbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIHRoaXMuX3JlbmRlcigpO1xuICB9XG5cbiAgaXNDb21wbGV0ZSgpIHtcbiAgICBpZiAoIXRoaXMuX3Nlc3Npb24gfHwgIXRoaXMuX3Nlc3Npb24uYW5zd2Vycykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHsgYXV0b3BsYXlBdWRpb0VuYWJsZWQsIGNvbXBsZXRlQXVkaW9FbmFibGVkIH0gPSB0aGlzLl9tb2RlbCB8fCB7fTtcbiAgICBjb25zdCBlbGVtZW50Q29udGV4dCA9IHRoaXM7XG5cbiAgICAvLyBjaGVjayBhdWRpbyBjb21wbGV0aW9uIGlmIGF1ZGlvIHNldHRpbmdzIGFyZSBlbmFibGVkIGFuZCBhdWRpbyBhY3R1YWxseSBleGlzdHNcbiAgICBpZiAoYXV0b3BsYXlBdWRpb0VuYWJsZWQgJiYgY29tcGxldGVBdWRpb0VuYWJsZWQgJiYgIXRoaXMuYXVkaW9Db21wbGV0ZSkge1xuICAgICAgaWYgKGVsZW1lbnRDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGF1ZGlvID0gZWxlbWVudENvbnRleHQucXVlcnlTZWxlY3RvcignYXVkaW8nKTtcbiAgICAgICAgY29uc3QgaXNJbnNpZGVQcm9tcHQgPSBhdWRpbyAmJiBhdWRpby5jbG9zZXN0KCcjcHJldmlldy1wcm9tcHQnKTtcblxuICAgICAgICAvLyBvbmx5IHJlcXVpcmUgYXVkaW8gY29tcGxldGlvbiBpZiBhdWRpbyBleGlzdHMgYW5kIGlzIGluc2lkZSB0aGUgcHJvbXB0XG4gICAgICAgIGlmIChhdWRpbyAmJiBpc0luc2lkZVByb21wdCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLl9zZXNzaW9uLmFuc3dlcnMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb24uYW5zd2Vycy5sZW5ndGggPiAwO1xuICB9XG5cbiAgc2V0IHNlc3Npb24ocykge1xuICAgIGlmIChzICYmICFzLmFuc3dlcnMpIHtcbiAgICAgIHMuYW5zd2VycyA9IFtdO1xuICAgIH1cblxuICAgIHRoaXMuX3Nlc3Npb24gPSBzO1xuICAgIHRoaXMuX3JlbmRlcigpO1xuICB9XG5cbiAgZ2V0IHNlc3Npb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb247XG4gIH1cblxuICBvblNlbGVjdENob2ljZShkYXRhKSB7XG4gICAgdXBkYXRlU2Vzc2lvblZhbHVlKHRoaXMuX3Nlc3Npb24sIHRoaXMuX21vZGVsLCBkYXRhKTtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgU2Vzc2lvbkNoYW5nZWRFdmVudCh0aGlzLnRhZ05hbWUudG9Mb3dlckNhc2UoKSwgdGhpcy5pc0NvbXBsZXRlKCkpKTtcblxuICAgIHRoaXMuX3JlbmRlcigpO1xuICB9XG5cbiAgX2NyZWF0ZUF1ZGlvSW5mb1RvYXN0KCkge1xuICAgIGNvbnN0IGluZm8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBpbmZvLmlkID0gJ3BsYXktYXVkaW8taW5mbyc7XG5cbiAgICBPYmplY3QuYXNzaWduKGluZm8uc3R5bGUsIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdG9wOiAwLFxuICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICBiYWNrZ3JvdW5kOiAnd2hpdGUnLFxuICAgICAgekluZGV4OiAnMTAwMCcsXG4gICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgIGltZy5zcmMgPSBFbmFibGVBdWRpb0F1dG9wbGF5SW1hZ2U7XG4gICAgaW1nLmFsdCA9ICdDbGljayBhbnl3aGVyZSB0byBlbmFibGUgYXVkaW8gYXV0b3BsYXknO1xuICAgIGltZy53aWR0aCA9IDUwMDtcbiAgICBpbWcuaGVpZ2h0ID0gMzAwO1xuXG4gICAgaW5mby5hcHBlbmRDaGlsZChpbWcpO1xuICAgIHJldHVybiBpbmZvO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5fcmVuZGVyKCk7XG5cbiAgICAvLyBPYnNlcnZhdGlvbjogIGF1ZGlvIGluIENocm9tZSB3aWxsIGhhdmUgdGhlIGF1dG9wbGF5IGF0dHJpYnV0ZSxcbiAgICAvLyB3aGlsZSBvdGhlciBicm93c2VycyB3aWxsIG5vdCBoYXZlIHRoZSBhdXRvcGxheSBhdHRyaWJ1dGUgYW5kIHdpbGwgbmVlZCBhIHVzZXIgaW50ZXJhY3Rpb24gdG8gcGxheSB0aGUgYXVkaW9cbiAgICAvLyBUaGlzIHdvcmthcm91bmQgZml4ZXMgdGhlIGlzc3VlIG9mIGF1ZGlvIGJlaW5nIGNhY2hlZCBhbmQgcGxheWVkIG9uIGFueSB1c2VyIGludGVyYWN0aW9uIGluIFNhZmFyaSBhbmQgRmlyZWZveFxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9uc0xpc3QsIG9ic2VydmVyKSA9PiB7XG4gICAgICBtdXRhdGlvbnNMaXN0LmZvckVhY2goKG11dGF0aW9uKSA9PiB7XG4gICAgICAgIGlmIChtdXRhdGlvbi50eXBlID09PSAnY2hpbGRMaXN0Jykge1xuICAgICAgICAgIGlmICh0aGlzLl9hdWRpb0luaXRpYWxpemVkKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgYXVkaW8gPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2F1ZGlvJyk7XG4gICAgICAgICAgY29uc3QgaXNJbnNpZGVQcm9tcHQgPSBhdWRpbyAmJiBhdWRpby5jbG9zZXN0KCcjcHJldmlldy1wcm9tcHQnKTtcblxuICAgICAgICAgIGlmICghdGhpcy5fbW9kZWwpIHJldHVybjtcbiAgICAgICAgICBpZiAoIXRoaXMuX21vZGVsLmF1dG9wbGF5QXVkaW9FbmFibGVkKSByZXR1cm47XG4gICAgICAgICAgaWYgKGF1ZGlvICYmICFpc0luc2lkZVByb21wdCkgcmV0dXJuO1xuICAgICAgICAgIGlmICghYXVkaW8pIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLl9jcmVhdGVBdWRpb0luZm9Ub2FzdCgpO1xuICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMucXVlcnlTZWxlY3RvcignI21haW4tY29udGFpbmVyJyk7XG4gICAgICAgICAgY29uc3QgZW5hYmxlQXVkaW8gPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWVyeVNlbGVjdG9yKCcjcGxheS1hdWRpby1pbmZvJykpIHtcbiAgICAgICAgICAgICAgYXVkaW8ucGxheSgpO1xuICAgICAgICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQoaW5mbyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZW5hYmxlQXVkaW8pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBpZiB0aGUgYXVkaW8gaXMgcGF1c2VkLCBpdCBtZWFucyB0aGUgdXNlciBoYXMgbm90IGludGVyYWN0ZWQgd2l0aCB0aGUgcGFnZSB5ZXQgYW5kIHRoZSBhdWRpbyB3aWxsIG5vdCBwbGF5XG4gICAgICAgICAgLy8gRklYIEZPUiBTQUZBUkk6IHBsYXkgd2l0aCBhIHNsaWdodCBkZWxheSB0byBjaGVjayBpZiBhdXRvcGxheSB3YXMgYmxvY2tlZFxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGF1ZGlvLnBhdXNlZCAmJiAhdGhpcy5xdWVyeVNlbGVjdG9yKCcjcGxheS1hdWRpby1pbmZvJykpIHtcbiAgICAgICAgICAgICAgLy8gYWRkIGluZm8gbWVzc2FnZSBhcyBhIHRvYXN0IHRvIGVuYWJsZSBhdWRpbyBwbGF5YmFja1xuICAgICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaW5mbyk7XG4gICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZW5hYmxlQXVkaW8pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlbmFibGVBdWRpbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgNTAwKTtcblxuICAgICAgICAgIC8vIHdlIG5lZWQgdG8gbGlzdGVuIGZvciB0aGUgcGxheWluZyBldmVudCB0byByZW1vdmUgdGhlIHRvYXN0IGluIGNhc2UgdGhlIGF1ZGlvIHBsYXlzIGJlY2F1c2Ugb2YgcmUtcmVuZGVyaW5nXG4gICAgICAgICAgY29uc3QgaGFuZGxlUGxheWluZyA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vdGltZXN0YW1wIHdoZW4gYXV0by1wbGF5ZWQgYXVkaW8gc3RhcnRlZCBwbGF5aW5nXG4gICAgICAgICAgICB1cGRhdGVTZXNzaW9uTWV0YWRhdGEodGhpcy5fc2Vzc2lvbiwgeyBhdWRpb1N0YXJ0VGltZTogbmV3IERhdGUoKS5nZXRUaW1lKCkgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJyNwbGF5LWF1ZGlvLWluZm8nKTtcbiAgICAgICAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChpbmZvKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXVkaW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGxheWluZycsIGhhbmRsZVBsYXlpbmcpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBhdWRpby5hZGRFdmVudExpc3RlbmVyKCdwbGF5aW5nJywgaGFuZGxlUGxheWluZyk7XG5cbiAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGxpc3RlbiBmb3IgdGhlIGVuZGVkIGV2ZW50IHRvIHVwZGF0ZSB0aGUgaXNDb21wbGV0ZSBzdGF0ZVxuICAgICAgICAgIGNvbnN0IGhhbmRsZUVuZGVkID0gKCkgPT4ge1xuICAgICAgICAgICAgLy90aW1lc3RhbXAgd2hlbiBhdXRvLXBsYXllZCBhdWRpbyBjb21wbGV0ZWQgcGxheWluZ1xuICAgICAgICAgICAgdXBkYXRlU2Vzc2lvbk1ldGFkYXRhKHRoaXMuX3Nlc3Npb24sIHsgYXVkaW9FbmRUaW1lOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSB9KTtcblxuICAgICAgICAgICAgbGV0IHsgYXVkaW9TdGFydFRpbWUsIGF1ZGlvRW5kVGltZSwgd2FpdFRpbWUgfSA9IHRoaXMuX3Nlc3Npb247XG4gICAgICAgICAgICBpZiAoIXdhaXRUaW1lICYmIGF1ZGlvU3RhcnRUaW1lICYmIGF1ZGlvRW5kVGltZSkge1xuICAgICAgICAgICAgICAvLyB3YWl0VGltZSBpcyBlbGFwc2VkIHRpbWUgdGhlIHVzZXIgd2FpdGVkIGZvciBhdXRvLXBsYXllZCBhdWRpbyB0byBmaW5pc2hcbiAgICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbi53YWl0VGltZSA9IGF1ZGlvRW5kVGltZSAtIGF1ZGlvU3RhcnRUaW1lO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmF1ZGlvQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBTZXNzaW9uQ2hhbmdlZEV2ZW50KHRoaXMudGFnTmFtZS50b0xvd2VyQ2FzZSgpLCB0aGlzLmlzQ29tcGxldGUoKSkpO1xuXG4gICAgICAgICAgICBhdWRpby5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmRlZCcsIGhhbmRsZUVuZGVkKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgYXVkaW8uYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCBoYW5kbGVFbmRlZCk7XG5cbiAgICAgICAgICAvLyBzdG9yZSByZWZlcmVuY2VzIHRvIHJlbW92ZSBsYXRlclxuICAgICAgICAgIHRoaXMuX2F1ZGlvID0gYXVkaW87XG4gICAgICAgICAgdGhpcy5faGFuZGxlUGxheWluZyA9IGhhbmRsZVBsYXlpbmc7XG4gICAgICAgICAgdGhpcy5faGFuZGxlRW5kZWQgPSBoYW5kbGVFbmRlZDtcbiAgICAgICAgICB0aGlzLl9lbmFibGVBdWRpbyA9IGVuYWJsZUF1ZGlvO1xuICAgICAgICAgIC8vIHNldCB0byB0cnVlIHRvIHByZXZlbnQgbXVsdGlwbGUgaW5pdGlhbGl6YXRpb25zXG4gICAgICAgICAgdGhpcy5fYXVkaW9Jbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIF9yZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuX21vZGVsICYmIHRoaXMuX3Nlc3Npb24pIHtcbiAgICAgIGNvbnN0IGVsID0gUmVhY3QuY3JlYXRlRWxlbWVudChIb3RzcG90Q29tcG9uZW50LCB7XG4gICAgICAgIG1vZGVsOiB0aGlzLl9tb2RlbCxcbiAgICAgICAgc2Vzc2lvbjogdGhpcy5fc2Vzc2lvbixcbiAgICAgICAgb25TZWxlY3RDaG9pY2U6IHRoaXMub25TZWxlY3RDaG9pY2UuYmluZCh0aGlzKSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXRoaXMuX3Jvb3QpIHtcbiAgICAgICAgdGhpcy5fcm9vdCA9IGNyZWF0ZVJvb3QodGhpcyk7XG4gICAgICB9XG4gICAgICB0aGlzLl9yb290LnJlbmRlcihlbCk7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIHJlbmRlck1hdGgodGhpcyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2VuYWJsZUF1ZGlvKTtcblxuICAgIGlmICh0aGlzLl9hdWRpbykge1xuICAgICAgdGhpcy5fYXVkaW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGxheWluZycsIHRoaXMuX2hhbmRsZVBsYXlpbmcpO1xuICAgICAgdGhpcy5fYXVkaW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZW5kZWQnLCB0aGlzLl9oYW5kbGVFbmRlZCk7XG4gICAgICB0aGlzLl9hdWRpbyA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3Jvb3QpIHtcbiAgICAgIHRoaXMuX3Jvb3QudW5tb3VudCgpO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsY0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsU0FBQSxH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
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["Hotspot","_model","_session","_audioInitialized","audioComplete","m","dispatchEvent","ModelSetEvent","tagName","toLowerCase","isComplete","_render","answers","autoplayAudioEnabled","completeAudioEnabled","elementContext","audio","querySelector","isInsidePrompt","closest","Array","isArray","length","s","data","SessionChangedEvent","info","document","createElement","id","Object","assign","style","position","top","width","height","display","justifyContent","alignItems","background","zIndex","cursor","img","src","EnableAudioAutoplayImage","alt","appendChild","observer","MutationObserver","mutationsList","forEach","mutation","type","_createAudioInfoToast","container","enableAudio","play","removeChild","removeEventListener","setTimeout","paused","addEventListener","handlePlaying","audioStartTime","Date","getTime","handleEnded","audioEndTime","waitTime","_audio","_handlePlaying","_handleEnded","_enableAudio","disconnect","observe","childList","subtree","el","React","HotspotComponent","model","session","onSelectChoice","bind","ReactDOM","render","HTMLElement"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;;;;;IAEqBA,O;;;;;AACnB,qBAAc;AAAA;;AAAA;AACZ;AACA,UAAKC,MAAL,GAAc,IAAd;AACA,UAAKC,QAAL,GAAgB,IAAhB;AACA,UAAKC,iBAAL,GAAyB,KAAzB;AACA,UAAKC,aAAL,GAAqB,KAArB;AALY;AAMb;;;;SAED,aAAUC,CAAV,EAAa;AACX,WAAKJ,MAAL,GAAcI,CAAd;AAEA,WAAKC,aAAL,CAAmB,IAAIC,8BAAJ,CAAkB,KAAKC,OAAL,CAAaC,WAAb,EAAlB,EAA8C,KAAKC,UAAL,EAA9C,EAAiE,CAAC,CAAC,KAAKT,MAAxE,CAAnB;AACA,WAAKE,iBAAL,GAAyB,KAAzB;;AACA,WAAKQ,OAAL;AACD;;;WAED,sBAAa;AACX,UAAI,CAAC,KAAKT,QAAN,IAAkB,CAAC,KAAKA,QAAL,CAAcU,OAArC,EAA8C;AAC5C,eAAO,KAAP;AACD;;AAED,iBAAuD,KAAKX,MAAL,IAAe,EAAtE;AAAA,UAAQY,oBAAR,QAAQA,oBAAR;AAAA,UAA8BC,oBAA9B,QAA8BA,oBAA9B;;AACA,UAAMC,cAAc,GAAG,IAAvB,CANW,CAQX;;AACA,UAAIF,oBAAoB,IAAIC,oBAAxB,IAAgD,CAAC,KAAKV,aAA1D,EAAyE;AACvE,YAAIW,cAAJ,EAAoB;AAClB,cAAMC,KAAK,GAAGD,cAAc,CAACE,aAAf,CAA6B,OAA7B,CAAd;AACA,cAAMC,cAAc,GAAGF,KAAK,IAAIA,KAAK,CAACG,OAAN,CAAc,iBAAd,CAAhC,CAFkB,CAIlB;;AACA,cAAIH,KAAK,IAAIE,cAAb,EAA6B;AAC3B,mBAAO,KAAP;AACD;AACF;AACF;;AAED,UAAI,CAACE,KAAK,CAACC,OAAN,CAAc,KAAKnB,QAAL,CAAcU,OAA5B,CAAL,EAA2C;AACzC,eAAO,KAAP;AACD;;AAED,aAAO,KAAKV,QAAL,CAAcU,OAAd,CAAsBU,MAAtB,GAA+B,CAAtC;AACD;;;SAWD,eAAc;AACZ,aAAO,KAAKpB,QAAZ;AACD,K;SAXD,aAAYqB,CAAZ,EAAe;AACb,UAAIA,CAAC,IAAI,CAACA,CAAC,CAACX,OAAZ,EAAqB;AACnBW,QAAAA,CAAC,CAACX,OAAF,GAAY,EAAZ;AACD;;AAED,WAAKV,QAAL,GAAgBqB,CAAhB;;AACA,WAAKZ,OAAL;AACD;;;WAMD,wBAAea,IAAf,EAAqB;AACnB,8CAAmB,KAAKtB,QAAxB,EAAkC,KAAKD,MAAvC,EAA+CuB,IAA/C;AAEA,WAAKlB,aAAL,CAAmB,IAAImB,oCAAJ,CAAwB,KAAKjB,OAAL,CAAaC,WAAb,EAAxB,EAAoD,KAAKC,UAAL,EAApD,CAAnB;;AAEA,WAAKC,OAAL;AACD;;;WAED,iCAAwB;AACtB,UAAMe,IAAI,GAAGC,QAAQ,CAACC,aAAT,CAAuB,KAAvB,CAAb;AACAF,MAAAA,IAAI,CAACG,EAAL,GAAU,iBAAV;AAEAC,MAAAA,MAAM,CAACC,MAAP,CAAcL,IAAI,CAACM,KAAnB,EAA0B;AACxBC,QAAAA,QAAQ,EAAE,UADc;AAExBC,QAAAA,GAAG,EAAE,CAFmB;AAGxBC,QAAAA,KAAK,EAAE,MAHiB;AAIxBC,QAAAA,MAAM,EAAE,MAJgB;AAKxBC,QAAAA,OAAO,EAAE,MALe;AAMxBC,QAAAA,cAAc,EAAE,QANQ;AAOxBC,QAAAA,UAAU,EAAE,QAPY;AAQxBC,QAAAA,UAAU,EAAE,OARY;AASxBC,QAAAA,MAAM,EAAE,MATgB;AAUxBC,QAAAA,MAAM,EAAE;AAVgB,OAA1B;AAaA,UAAMC,GAAG,GAAGhB,QAAQ,CAACC,aAAT,CAAuB,KAAvB,CAAZ;AACAe,MAAAA,GAAG,CAACC,GAAJ,GAAUC,kCAAV;AACAF,MAAAA,GAAG,CAACG,GAAJ,GAAU,yCAAV;AACAH,MAAAA,GAAG,CAACR,KAAJ,GAAY,GAAZ;AACAQ,MAAAA,GAAG,CAACP,MAAJ,GAAa,GAAb;AAEAV,MAAAA,IAAI,CAACqB,WAAL,CAAiBJ,GAAjB;AACA,aAAOjB,IAAP;AACD;;;WAED,6BAAoB;AAAA;;AAClB,WAAKf,OAAL,GADkB,CAGlB;AACA;AACA;;;AACA,UAAMqC,QAAQ,GAAG,IAAIC,gBAAJ,CAAqB,UAACC,aAAD,EAAgBF,QAAhB,EAA6B;AACjEE,QAAAA,aAAa,CAACC,OAAd,CAAsB,UAACC,QAAD,EAAc;AAClC,cAAIA,QAAQ,CAACC,IAAT,KAAkB,WAAtB,EAAmC;AACjC,gBAAI,MAAI,CAAClD,iBAAT,EAA4B;;AAC5B,gBAAMa,KAAK,GAAG,MAAI,CAACC,aAAL,CAAmB,OAAnB,CAAd;;AACA,gBAAMC,cAAc,GAAGF,KAAK,IAAIA,KAAK,CAACG,OAAN,CAAc,iBAAd,CAAhC;AAEA,gBAAI,CAAC,MAAI,CAAClB,MAAV,EAAkB;AAClB,gBAAI,CAAC,MAAI,CAACA,MAAL,CAAYY,oBAAjB,EAAuC;AACvC,gBAAIG,KAAK,IAAI,CAACE,cAAd,EAA8B;AAC9B,gBAAI,CAACF,KAAL,EAAY;;AAEZ,gBAAMU,IAAI,GAAG,MAAI,CAAC4B,qBAAL,EAAb;;AACA,gBAAMC,SAAS,GAAG,MAAI,CAACtC,aAAL,CAAmB,iBAAnB,CAAlB;;AACA,gBAAMuC,WAAW,GAAG,SAAdA,WAAc,GAAM;AACxB,kBAAI,MAAI,CAACvC,aAAL,CAAmB,kBAAnB,CAAJ,EAA4C;AAC1CD,gBAAAA,KAAK,CAACyC,IAAN;AACAF,gBAAAA,SAAS,CAACG,WAAV,CAAsBhC,IAAtB;AACD;;AAEDC,cAAAA,QAAQ,CAACgC,mBAAT,CAA6B,OAA7B,EAAsCH,WAAtC;AACD,aAPD,CAZiC,CAqBjC;AACA;;;AACAI,YAAAA,UAAU,CAAC,YAAM;AACf,kBAAI5C,KAAK,CAAC6C,MAAN,IAAgB,CAAC,MAAI,CAAC5C,aAAL,CAAmB,kBAAnB,CAArB,EAA6D;AAC3D;AACAsC,gBAAAA,SAAS,CAACR,WAAV,CAAsBrB,IAAtB;AACAC,gBAAAA,QAAQ,CAACmC,gBAAT,CAA0B,OAA1B,EAAmCN,WAAnC;AACD,eAJD,MAIO;AACL7B,gBAAAA,QAAQ,CAACgC,mBAAT,CAA6B,OAA7B,EAAsCH,WAAtC;AACD;AACF,aARS,EAQP,GARO,CAAV,CAvBiC,CAiCjC;;AACA,gBAAMO,aAAa,GAAG,SAAhBA,aAAgB,GAAM;AAC1B;AACA,yDAAsB,MAAI,CAAC7D,QAA3B,EAAqC;AAAE8D,gBAAAA,cAAc,EAAE,IAAIC,IAAJ,GAAWC,OAAX;AAAlB,eAArC;;AAEA,kBAAMxC,IAAI,GAAG,MAAI,CAACT,aAAL,CAAmB,kBAAnB,CAAb;;AACA,kBAAIS,IAAJ,EAAU;AACR6B,gBAAAA,SAAS,CAACG,WAAV,CAAsBhC,IAAtB;AACD;;AAEDV,cAAAA,KAAK,CAAC2C,mBAAN,CAA0B,SAA1B,EAAqCI,aAArC;AACD,aAVD;;AAYA/C,YAAAA,KAAK,CAAC8C,gBAAN,CAAuB,SAAvB,EAAkCC,aAAlC,EA9CiC,CAgDjC;;AACA,gBAAMI,WAAW,GAAG,SAAdA,WAAc,GAAM;AACxB;AACA,yDAAsB,MAAI,CAACjE,QAA3B,EAAqC;AAAEkE,gBAAAA,YAAY,EAAE,IAAIH,IAAJ,GAAWC,OAAX;AAAhB,eAArC;AAEA,oCAAiD,MAAI,CAAChE,QAAtD;AAAA,kBAAM8D,cAAN,mBAAMA,cAAN;AAAA,kBAAsBI,YAAtB,mBAAsBA,YAAtB;AAAA,kBAAoCC,QAApC,mBAAoCA,QAApC;;AACA,kBAAI,CAACA,QAAD,IAAaL,cAAb,IAA+BI,YAAnC,EAAiD;AAC/C;AACA,gBAAA,MAAI,CAAClE,QAAL,CAAcmE,QAAd,GAAyBD,YAAY,GAAGJ,cAAxC;AACD;;AAED,cAAA,MAAI,CAAC5D,aAAL,GAAqB,IAArB;;AACA,cAAA,MAAI,CAACE,aAAL,CAAmB,IAAImB,oCAAJ,CAAwB,MAAI,CAACjB,OAAL,CAAaC,WAAb,EAAxB,EAAoD,MAAI,CAACC,UAAL,EAApD,CAAnB;;AAEAM,cAAAA,KAAK,CAAC2C,mBAAN,CAA0B,OAA1B,EAAmCQ,WAAnC;AACD,aAdD;;AAgBAnD,YAAAA,KAAK,CAAC8C,gBAAN,CAAuB,OAAvB,EAAgCK,WAAhC,EAjEiC,CAmEjC;;AACA,YAAA,MAAI,CAACG,MAAL,GAActD,KAAd;AACA,YAAA,MAAI,CAACuD,cAAL,GAAsBR,aAAtB;AACA,YAAA,MAAI,CAACS,YAAL,GAAoBL,WAApB;AACA,YAAA,MAAI,CAACM,YAAL,GAAoBjB,WAApB,CAvEiC,CAwEjC;;AACA,YAAA,MAAI,CAACrD,iBAAL,GAAyB,IAAzB;AAEA6C,YAAAA,QAAQ,CAAC0B,UAAT;AACD;AACF,SA9ED;AA+ED,OAhFgB,CAAjB;AAkFA1B,MAAAA,QAAQ,CAAC2B,OAAT,CAAiB,IAAjB,EAAuB;AAAEC,QAAAA,SAAS,EAAE,IAAb;AAAmBC,QAAAA,OAAO,EAAE;AAA5B,OAAvB;AACD;;;WAED,gCAAuB;AACrBlD,MAAAA,QAAQ,CAACgC,mBAAT,CAA6B,OAA7B,EAAsC,KAAKc,YAA3C;;AAEA,UAAI,KAAKH,MAAT,EAAiB;AACf,aAAKA,MAAL,CAAYX,mBAAZ,CAAgC,SAAhC,EAA2C,KAAKY,cAAhD;;AACA,aAAKD,MAAL,CAAYX,mBAAZ,CAAgC,OAAhC,EAAyC,KAAKa,YAA9C;;AACA,aAAKF,MAAL,GAAc,IAAd;AACD;AACF;;;WAED,mBAAU;AAAA;;AACR,UAAI,KAAKrE,MAAL,IAAe,KAAKC,QAAxB,EAAkC;AAChC,YAAM4E,EAAE,gBAAGC,kBAAMnD,aAAN,CAAoBoD,mBAApB,EAAsC;AAC/CC,UAAAA,KAAK,EAAE,KAAKhF,MADmC;AAE/CiF,UAAAA,OAAO,EAAE,KAAKhF,QAFiC;AAG/CiF,UAAAA,cAAc,EAAE,KAAKA,cAAL,CAAoBC,IAApB,CAAyB,IAAzB;AAH+B,SAAtC,CAAX;;AAMAC,6BAASC,MAAT,CAAgBR,EAAhB,EAAoB,IAApB,EAA0B,YAAM;AAC9B,yCAAW,MAAX;AACD,SAFD;AAGD;AACF;;;kDA9MkCS,W","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport { EnableAudioAutoplayImage } from '@pie-lib/render-ui';\nimport { SessionChangedEvent, ModelSetEvent } from '@pie-framework/pie-player-events';\n\nimport HotspotComponent from './hotspot';\nimport { updateSessionValue, updateSessionMetadata } from './session-updater';\n\nexport default class Hotspot extends HTMLElement {\n constructor() {\n super();\n this._model = null;\n this._session = null;\n this._audioInitialized = false;\n this.audioComplete = false;\n }\n\n set model(m) {\n this._model = m;\n\n this.dispatchEvent(new ModelSetEvent(this.tagName.toLowerCase(), this.isComplete(), !!this._model));\n this._audioInitialized = false;\n this._render();\n }\n\n isComplete() {\n if (!this._session || !this._session.answers) {\n return false;\n }\n\n const { autoplayAudioEnabled, completeAudioEnabled } = this._model || {};\n const elementContext = this;\n\n // check audio completion if audio settings are enabled and audio actually exists\n if (autoplayAudioEnabled && completeAudioEnabled && !this.audioComplete) {\n if (elementContext) {\n const audio = elementContext.querySelector('audio');\n const isInsidePrompt = audio && audio.closest('#preview-prompt');\n\n // only require audio completion if audio exists and is inside the prompt\n if (audio && isInsidePrompt) {\n return false;\n }\n }\n }\n\n if (!Array.isArray(this._session.answers)) {\n return false;\n }\n\n return this._session.answers.length > 0;\n }\n\n set session(s) {\n if (s && !s.answers) {\n s.answers = [];\n }\n\n this._session = s;\n this._render();\n }\n\n get session() {\n return this._session;\n }\n\n onSelectChoice(data) {\n updateSessionValue(this._session, this._model, data);\n\n this.dispatchEvent(new SessionChangedEvent(this.tagName.toLowerCase(), this.isComplete()));\n\n this._render();\n }\n\n _createAudioInfoToast() {\n const info = document.createElement('div');\n info.id = 'play-audio-info';\n\n Object.assign(info.style, {\n position: 'absolute',\n top: 0,\n width: '100%',\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n background: 'white',\n zIndex: '1000',\n cursor: 'pointer',\n });\n\n const img = document.createElement('img');\n img.src = EnableAudioAutoplayImage;\n img.alt = 'Click anywhere to enable audio autoplay';\n img.width = 500;\n img.height = 300;\n\n info.appendChild(img);\n return info;\n }\n\n connectedCallback() {\n this._render();\n\n // Observation: audio in Chrome will have the autoplay attribute,\n // while other browsers will not have the autoplay attribute and will need a user interaction to play the audio\n // This workaround fixes the issue of audio being cached and played on any user interaction in Safari and Firefox\n const observer = new MutationObserver((mutationsList, observer) => {\n mutationsList.forEach((mutation) => {\n if (mutation.type === 'childList') {\n if (this._audioInitialized) return;\n const audio = this.querySelector('audio');\n const isInsidePrompt = audio && audio.closest('#preview-prompt');\n\n if (!this._model) return;\n if (!this._model.autoplayAudioEnabled) return;\n if (audio && !isInsidePrompt) return;\n if (!audio) return;\n\n const info = this._createAudioInfoToast();\n const container = this.querySelector('#main-container');\n const enableAudio = () => {\n if (this.querySelector('#play-audio-info')) {\n audio.play();\n container.removeChild(info);\n }\n\n document.removeEventListener('click', enableAudio);\n };\n\n // if the audio is paused, it means the user has not interacted with the page yet and the audio will not play\n // FIX FOR SAFARI: play with a slight delay to check if autoplay was blocked\n setTimeout(() => {\n if (audio.paused && !this.querySelector('#play-audio-info')) {\n // add info message as a toast to enable audio playback\n container.appendChild(info);\n document.addEventListener('click', enableAudio);\n } else {\n document.removeEventListener('click', enableAudio);\n }\n }, 500);\n\n // we need to listen for the playing event to remove the toast in case the audio plays because of re-rendering\n const handlePlaying = () => {\n //timestamp when auto-played audio started playing\n updateSessionMetadata(this._session, { audioStartTime: new Date().getTime() });\n\n const info = this.querySelector('#play-audio-info');\n if (info) {\n container.removeChild(info);\n }\n\n audio.removeEventListener('playing', handlePlaying);\n };\n\n audio.addEventListener('playing', handlePlaying);\n\n // we need to listen for the ended event to update the isComplete state\n const handleEnded = () => {\n //timestamp when auto-played audio completed playing\n updateSessionMetadata(this._session, { audioEndTime: new Date().getTime() });\n\n let { audioStartTime, audioEndTime, waitTime } = this._session;\n if (!waitTime && audioStartTime && audioEndTime) {\n // waitTime is elapsed time the user waited for auto-played audio to finish\n this._session.waitTime = audioEndTime - audioStartTime;\n }\n\n this.audioComplete = true;\n this.dispatchEvent(new SessionChangedEvent(this.tagName.toLowerCase(), this.isComplete()));\n\n audio.removeEventListener('ended', handleEnded);\n };\n\n audio.addEventListener('ended', handleEnded);\n\n // store references to remove later\n this._audio = audio;\n this._handlePlaying = handlePlaying;\n this._handleEnded = handleEnded;\n this._enableAudio = enableAudio;\n // set to true to prevent multiple initializations\n this._audioInitialized = true;\n\n observer.disconnect();\n }\n });\n });\n\n observer.observe(this, { childList: true, subtree: true });\n }\n\n disconnectedCallback() {\n document.removeEventListener('click', this._enableAudio);\n\n if (this._audio) {\n this._audio.removeEventListener('playing', this._handlePlaying);\n this._audio.removeEventListener('ended', this._handleEnded);\n this._audio = null;\n }\n }\n\n _render() {\n if (this._model && this._session) {\n const el = React.createElement(HotspotComponent, {\n model: this._model,\n session: this._session,\n onSelectChoice: this.onSelectChoice.bind(this),\n });\n\n ReactDOM.render(el, this, () => {\n renderMath(this);\n });\n }\n }\n}\n"],"file":"index.js"}
1
+ {"version":3,"file":"index.js","names":["_react","_interopRequireDefault","require","_client","_mathRendering","_renderUi","_piePlayerEvents","_hotspot","_sessionUpdater","Hotspot","HTMLElement","constructor","_model","_session","_audioInitialized","audioComplete","_root","model","m","dispatchEvent","ModelSetEvent","tagName","toLowerCase","isComplete","_render","answers","autoplayAudioEnabled","completeAudioEnabled","elementContext","audio","querySelector","isInsidePrompt","closest","Array","isArray","length","session","s","onSelectChoice","data","updateSessionValue","SessionChangedEvent","_createAudioInfoToast","info","document","createElement","id","Object","assign","style","position","top","width","height","display","justifyContent","alignItems","background","zIndex","cursor","img","src","EnableAudioAutoplayImage","alt","appendChild","connectedCallback","observer","MutationObserver","mutationsList","forEach","mutation","type","container","enableAudio","play","removeChild","removeEventListener","setTimeout","paused","addEventListener","handlePlaying","updateSessionMetadata","audioStartTime","Date","getTime","handleEnded","audioEndTime","waitTime","_audio","_handlePlaying","_handleEnded","_enableAudio","disconnect","observe","childList","subtree","el","React","HotspotComponent","bind","createRoot","render","queueMicrotask","renderMath","disconnectedCallback","unmount","exports","default"],"sources":["../src/index.js"],"sourcesContent":["import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport { EnableAudioAutoplayImage } from '@pie-lib/render-ui';\nimport { SessionChangedEvent, ModelSetEvent } from '@pie-framework/pie-player-events';\n\nimport HotspotComponent from './hotspot';\nimport { updateSessionValue, updateSessionMetadata } from './session-updater';\n\nexport default class Hotspot extends HTMLElement {\n constructor() {\n super();\n this._model = null;\n this._session = null;\n this._audioInitialized = false;\n this.audioComplete = false;\n this._root = null;\n }\n\n set model(m) {\n this._model = m;\n\n this.dispatchEvent(new ModelSetEvent(this.tagName.toLowerCase(), this.isComplete(), !!this._model));\n this._audioInitialized = false;\n this._render();\n }\n\n isComplete() {\n if (!this._session || !this._session.answers) {\n return false;\n }\n\n const { autoplayAudioEnabled, completeAudioEnabled } = this._model || {};\n const elementContext = this;\n\n // check audio completion if audio settings are enabled and audio actually exists\n if (autoplayAudioEnabled && completeAudioEnabled && !this.audioComplete) {\n if (elementContext) {\n const audio = elementContext.querySelector('audio');\n const isInsidePrompt = audio && audio.closest('#preview-prompt');\n\n // only require audio completion if audio exists and is inside the prompt\n if (audio && isInsidePrompt) {\n return false;\n }\n }\n }\n\n if (!Array.isArray(this._session.answers)) {\n return false;\n }\n\n return this._session.answers.length > 0;\n }\n\n set session(s) {\n if (s && !s.answers) {\n s.answers = [];\n }\n\n this._session = s;\n this._render();\n }\n\n get session() {\n return this._session;\n }\n\n onSelectChoice(data) {\n updateSessionValue(this._session, this._model, data);\n\n this.dispatchEvent(new SessionChangedEvent(this.tagName.toLowerCase(), this.isComplete()));\n\n this._render();\n }\n\n _createAudioInfoToast() {\n const info = document.createElement('div');\n info.id = 'play-audio-info';\n\n Object.assign(info.style, {\n position: 'absolute',\n top: 0,\n width: '100%',\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n background: 'white',\n zIndex: '1000',\n cursor: 'pointer',\n });\n\n const img = document.createElement('img');\n img.src = EnableAudioAutoplayImage;\n img.alt = 'Click anywhere to enable audio autoplay';\n img.width = 500;\n img.height = 300;\n\n info.appendChild(img);\n return info;\n }\n\n connectedCallback() {\n this._render();\n\n // Observation: audio in Chrome will have the autoplay attribute,\n // while other browsers will not have the autoplay attribute and will need a user interaction to play the audio\n // This workaround fixes the issue of audio being cached and played on any user interaction in Safari and Firefox\n const observer = new MutationObserver((mutationsList, observer) => {\n mutationsList.forEach((mutation) => {\n if (mutation.type === 'childList') {\n if (this._audioInitialized) return;\n const audio = this.querySelector('audio');\n const isInsidePrompt = audio && audio.closest('#preview-prompt');\n\n if (!this._model) return;\n if (!this._model.autoplayAudioEnabled) return;\n if (audio && !isInsidePrompt) return;\n if (!audio) return;\n\n const info = this._createAudioInfoToast();\n const container = this.querySelector('#main-container');\n const enableAudio = () => {\n if (this.querySelector('#play-audio-info')) {\n audio.play();\n container.removeChild(info);\n }\n\n document.removeEventListener('click', enableAudio);\n };\n\n // if the audio is paused, it means the user has not interacted with the page yet and the audio will not play\n // FIX FOR SAFARI: play with a slight delay to check if autoplay was blocked\n setTimeout(() => {\n if (audio.paused && !this.querySelector('#play-audio-info')) {\n // add info message as a toast to enable audio playback\n container.appendChild(info);\n document.addEventListener('click', enableAudio);\n } else {\n document.removeEventListener('click', enableAudio);\n }\n }, 500);\n\n // we need to listen for the playing event to remove the toast in case the audio plays because of re-rendering\n const handlePlaying = () => {\n //timestamp when auto-played audio started playing\n updateSessionMetadata(this._session, { audioStartTime: new Date().getTime() });\n\n const info = this.querySelector('#play-audio-info');\n if (info) {\n container.removeChild(info);\n }\n\n audio.removeEventListener('playing', handlePlaying);\n };\n\n audio.addEventListener('playing', handlePlaying);\n\n // we need to listen for the ended event to update the isComplete state\n const handleEnded = () => {\n //timestamp when auto-played audio completed playing\n updateSessionMetadata(this._session, { audioEndTime: new Date().getTime() });\n\n let { audioStartTime, audioEndTime, waitTime } = this._session;\n if (!waitTime && audioStartTime && audioEndTime) {\n // waitTime is elapsed time the user waited for auto-played audio to finish\n this._session.waitTime = audioEndTime - audioStartTime;\n }\n\n this.audioComplete = true;\n this.dispatchEvent(new SessionChangedEvent(this.tagName.toLowerCase(), this.isComplete()));\n\n audio.removeEventListener('ended', handleEnded);\n };\n\n audio.addEventListener('ended', handleEnded);\n\n // store references to remove later\n this._audio = audio;\n this._handlePlaying = handlePlaying;\n this._handleEnded = handleEnded;\n this._enableAudio = enableAudio;\n // set to true to prevent multiple initializations\n this._audioInitialized = true;\n\n observer.disconnect();\n }\n });\n });\n\n observer.observe(this, { childList: true, subtree: true });\n }\n\n _render() {\n if (this._model && this._session) {\n const el = React.createElement(HotspotComponent, {\n model: this._model,\n session: this._session,\n onSelectChoice: this.onSelectChoice.bind(this),\n });\n\n if (!this._root) {\n this._root = createRoot(this);\n }\n this._root.render(el);\n queueMicrotask(() => {\n renderMath(this);\n });\n }\n }\n\n disconnectedCallback() {\n document.removeEventListener('click', this._enableAudio);\n\n if (this._audio) {\n this._audio.removeEventListener('playing', this._handlePlaying);\n this._audio.removeEventListener('ended', this._handleEnded);\n this._audio = null;\n }\n\n if (this._root) {\n this._root.unmount();\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}