ソースを参照

Merge pull request #954 from jitsi/handle-conference-left

Waits for conference left event before navigating away from the page.
j8
Paweł Domas 9年前
コミット
ae2ea4f421
2個のファイルの変更70行の追加8行の削除
  1. 69
    7
      conference.js
  2. 1
    1
      modules/UI/UI.js

+ 69
- 7
conference.js ファイルの表示

39
  */
39
  */
40
 let DSExternalInstallationInProgress = false;
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
 import {VIDEO_CONTAINER_TYPE} from "./modules/UI/videolayout/VideoContainer";
49
 import {VIDEO_CONTAINER_TYPE} from "./modules/UI/videolayout/VideoContainer";
43
 
50
 
44
 /**
51
 /**
255
  * @param {boolean} [requestFeedback=false] if user feedback should be requested
262
  * @param {boolean} [requestFeedback=false] if user feedback should be requested
256
  */
263
  */
257
 function hangup (requestFeedback = false) {
264
 function hangup (requestFeedback = false) {
258
-    const errCallback = (f, err) => {
265
+    const errCallback = (err) => {
259
 
266
 
260
         // If we want to break out the chain in our error handler, it needs
267
         // If we want to break out the chain in our error handler, it needs
261
         // to return a rejected promise. In the case of feedback request
268
         // to return a rejected promise. In the case of feedback request
270
         }
277
         }
271
     };
278
     };
272
     const disconnect = disconnectAndShowFeedback.bind(null, requestFeedback);
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
     APP.conference._room.leave()
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
 /**

+ 1
- 1
modules/UI/UI.js ファイルの表示

1102
     if (Feedback.isVisible())
1102
     if (Feedback.isVisible())
1103
         return Promise.reject(UIErrors.FEEDBACK_REQUEST_IN_PROGRESS);
1103
         return Promise.reject(UIErrors.FEEDBACK_REQUEST_IN_PROGRESS);
1104
     // Feedback has been submitted already.
1104
     // Feedback has been submitted already.
1105
-    else if (Feedback.isSubmitted())
1105
+    else if (Feedback.isEnabled() && Feedback.isSubmitted())
1106
         return Promise.resolve();
1106
         return Promise.resolve();
1107
     else
1107
     else
1108
         return new Promise(function (resolve, reject) {
1108
         return new Promise(function (resolve, reject) {

読み込み中…
キャンセル
保存