|
|
@@ -39,6 +39,13 @@ let connectionIsInterrupted = false;
|
|
39
|
39
|
*/
|
|
40
|
40
|
let DSExternalInstallationInProgress = false;
|
|
41
|
41
|
|
|
|
42
|
+/**
|
|
|
43
|
+ * Listens whether conference had been left from local user when we are trying
|
|
|
44
|
+ * to navigate away from current page.
|
|
|
45
|
+ * @type {ConferenceLeftListener}
|
|
|
46
|
+ */
|
|
|
47
|
+let conferenceLeftListener = null;
|
|
|
48
|
+
|
|
42
|
49
|
import {VIDEO_CONTAINER_TYPE} from "./modules/UI/videolayout/VideoContainer";
|
|
43
|
50
|
|
|
44
|
51
|
/**
|
|
|
@@ -255,7 +262,7 @@ function disconnectAndShowFeedback(requestFeedback) {
|
|
255
|
262
|
* @param {boolean} [requestFeedback=false] if user feedback should be requested
|
|
256
|
263
|
*/
|
|
257
|
264
|
function hangup (requestFeedback = false) {
|
|
258
|
|
- const errCallback = (f, err) => {
|
|
|
265
|
+ const errCallback = (err) => {
|
|
259
|
266
|
|
|
260
|
267
|
// If we want to break out the chain in our error handler, it needs
|
|
261
|
268
|
// to return a rejected promise. In the case of feedback request
|
|
|
@@ -270,14 +277,69 @@ function hangup (requestFeedback = false) {
|
|
270
|
277
|
}
|
|
271
|
278
|
};
|
|
272
|
279
|
const disconnect = disconnectAndShowFeedback.bind(null, requestFeedback);
|
|
|
280
|
+
|
|
|
281
|
+ if (!conferenceLeftListener)
|
|
|
282
|
+ conferenceLeftListener = new ConferenceLeftListener();
|
|
|
283
|
+
|
|
|
284
|
+ // Make sure that leave is resolved successfully and the set the handlers
|
|
|
285
|
+ // to be invoked once conference had been left
|
|
273
|
286
|
APP.conference._room.leave()
|
|
274
|
|
- .then(disconnect)
|
|
275
|
|
- .catch(errCallback.bind(null, disconnect))
|
|
276
|
|
- .then(maybeRedirectToWelcomePage)
|
|
277
|
|
- .catch(function(err){
|
|
278
|
|
- console.log(err);
|
|
279
|
|
- });
|
|
|
287
|
+ .then(conferenceLeftListener.setHandler(disconnect, errCallback))
|
|
|
288
|
+ .catch(errCallback);
|
|
|
289
|
+}
|
|
280
|
290
|
|
|
|
291
|
+/**
|
|
|
292
|
+ * Listens for CONFERENCE_LEFT event so we can check whether it has finished.
|
|
|
293
|
+ * The handler will be called once the conference had been left or if it
|
|
|
294
|
+ * was already left when we are adding the handler.
|
|
|
295
|
+ */
|
|
|
296
|
+class ConferenceLeftListener {
|
|
|
297
|
+ /**
|
|
|
298
|
+ * Creates ConferenceLeftListener and start listening for conference
|
|
|
299
|
+ * failed event.
|
|
|
300
|
+ */
|
|
|
301
|
+ constructor() {
|
|
|
302
|
+ room.on(ConferenceEvents.CONFERENCE_LEFT,
|
|
|
303
|
+ this._handleConferenceLeft.bind(this));
|
|
|
304
|
+ }
|
|
|
305
|
+
|
|
|
306
|
+ /**
|
|
|
307
|
+ * Handles the conference left event, if we have a handler we invoke it.
|
|
|
308
|
+ * @private
|
|
|
309
|
+ */
|
|
|
310
|
+ _handleConferenceLeft() {
|
|
|
311
|
+ this.conferenceLeft = true;
|
|
|
312
|
+
|
|
|
313
|
+ if (this.handler)
|
|
|
314
|
+ this._handleLeave();
|
|
|
315
|
+ }
|
|
|
316
|
+
|
|
|
317
|
+ /**
|
|
|
318
|
+ * Sets the handlers. If we already left the conference invoke them.
|
|
|
319
|
+ * @param handler
|
|
|
320
|
+ * @param errCallback
|
|
|
321
|
+ */
|
|
|
322
|
+ setHandler (handler, errCallback) {
|
|
|
323
|
+ this.handler = handler;
|
|
|
324
|
+ this.errCallback = errCallback;
|
|
|
325
|
+
|
|
|
326
|
+ if (this.conferenceLeft)
|
|
|
327
|
+ this._handleLeave();
|
|
|
328
|
+ }
|
|
|
329
|
+
|
|
|
330
|
+ /**
|
|
|
331
|
+ * Invokes the handlers.
|
|
|
332
|
+ * @private
|
|
|
333
|
+ */
|
|
|
334
|
+ _handleLeave()
|
|
|
335
|
+ {
|
|
|
336
|
+ this.handler()
|
|
|
337
|
+ .catch(this.errCallback)
|
|
|
338
|
+ .then(maybeRedirectToWelcomePage)
|
|
|
339
|
+ .catch(function(err){
|
|
|
340
|
+ console.log(err);
|
|
|
341
|
+ });
|
|
|
342
|
+ }
|
|
281
|
343
|
}
|
|
282
|
344
|
|
|
283
|
345
|
/**
|