2
0
Эх сурвалжийг харах

Leave MUC when bookmark is removed or when `autojoin` is changed to false

JC Brand 7 сар өмнө
parent
commit
b0896af25d

+ 18 - 8
src/headless/plugins/bookmarks/collection.js

@@ -26,8 +26,8 @@ class Bookmarks extends Collection {
                 .then((bm) => this.markRoomAsBookmarked(bm))
                 .catch((e) => log.fatal(e))
         );
-
-        this.on('remove', this.markRoomAsUnbookmarked, this);
+        this.on('remove', this.leaveRoom, this);
+        this.on('change:autojoin', this.onAutoJoinChanged, this);
         this.on('remove', this.sendBookmarkStanza, this);
 
         const { session } = _converse;
@@ -218,16 +218,26 @@ class Bookmarks extends Collection {
     /**
      * @param {Bookmark} bookmark
      */
-    markRoomAsUnbookmarked(bookmark) {
-        const { chatboxes } = _converse.state;
-        const groupchat = chatboxes.get(bookmark.get('jid'));
-        groupchat?.save('bookmarked', false);
+    onAutoJoinChanged(bookmark) {
+        if (bookmark.get('autojoin')) {
+            this.openBookmarkedRoom(bookmark);
+        } else {
+            this.leaveRoom(bookmark);
+        }
+    }
+
+    /**
+     * @param {Bookmark} bookmark
+     */
+    async leaveRoom(bookmark) {
+        const groupchat = await api.rooms.get(bookmark.get('jid'));
+        groupchat?.close();
     }
 
     /**
      * @param {Element} stanza
      */
-    async createBookmarksFromStanza(stanza) {
+    async setBookmarksFromStanza(stanza) {
         const bookmarks = await parseStanzaForBookmarks(stanza);
         bookmarks.forEach(
             /** @param {import('./types.js').BookmarkAttrs} attrs */
@@ -243,7 +253,7 @@ class Bookmarks extends Collection {
      * @param {Element} iq
      */
     async onBookmarksReceived(deferred, iq) {
-        await this.createBookmarksFromStanza(iq);
+        await this.setBookmarksFromStanza(iq);
         window.sessionStorage.setItem(this.fetched_flag, 'true');
         if (deferred !== undefined) {
             return deferred.resolve();

+ 6 - 1
src/headless/plugins/bookmarks/tests/bookmarks.js

@@ -88,10 +88,11 @@ describe("A bookmark", function () {
         it("will cause a MUC to be opened and joined automatically upon login", mock.initConverse(
                 [], {}, async function (_converse) {
 
-            const { api } = _converse;
+            const { api, state } = _converse;
             await mock.waitForRoster(_converse, 'current', 0);
             await mock.waitUntilBookmarksReturned(_converse);
             spyOn(_converse.api.rooms, 'create').and.callThrough();
+
             const { bookmarks } = _converse.state;
 
             let jid = 'theplay@conference.shakespeare.lit';
@@ -115,6 +116,7 @@ describe("A bookmark", function () {
 
             api.settings.set('muc_respect_autojoin', true);
             bookmarks.remove(model);
+
             bookmarks.create({
                 jid,
                 autojoin: true,
@@ -122,7 +124,10 @@ describe("A bookmark", function () {
                 nick: ''
             });
             expect(_converse.api.rooms.create).toHaveBeenCalled();
+            await u.waitUntil(() => state.chatboxes.length === 2);
 
+            bookmarks.remove(model);
+            await u.waitUntil(() => state.chatboxes.length === 1);
         }));
 
         it("has autojoin set to false upon leaving", mock.initConverse([], {}, async function (_converse) {

+ 1 - 1
src/headless/plugins/bookmarks/utils.js

@@ -30,7 +30,7 @@ export function getNicknameFromBookmark(jid) {
  */
 export function handleBookmarksPush(message) {
     api.waitUntil('bookmarksInitialized')
-        .then(() => _converse.state.bookmarks.createBookmarksFromStanza(message))
+        .then(() => _converse.state.bookmarks.setBookmarksFromStanza(message))
         .catch(/** @param {Error} e */(e) => log.fatal(e));
     return true;
 }

+ 6 - 2
src/headless/types/plugins/bookmarks/collection.d.ts

@@ -41,11 +41,15 @@ declare class Bookmarks extends Collection {
     /**
      * @param {Bookmark} bookmark
      */
-    markRoomAsUnbookmarked(bookmark: Bookmark): void;
+    onAutoJoinChanged(bookmark: Bookmark): void;
+    /**
+     * @param {Bookmark} bookmark
+     */
+    leaveRoom(bookmark: Bookmark): Promise<void>;
     /**
      * @param {Element} stanza
      */
-    createBookmarksFromStanza(stanza: Element): Promise<void>;
+    setBookmarksFromStanza(stanza: Element): Promise<void>;
     /**
      * @param {Object} deferred
      * @param {Element} iq

+ 35 - 0
src/plugins/bookmark-views/tests/bookmarks.js

@@ -143,6 +143,41 @@ describe("Bookmarks", function () {
         );
         expect(_converse.chatboxviews.get('theplay@conference.shakespeare.lit')).not.toBeUndefined();
         expect(Object.keys(_converse.chatboxviews.getAll()).length).toBe(2);
+
+        // Check that MUC is left when autojoin is set to false
+        stanza = stx`<message from="romeo@montague.lit"
+                        to="${_converse.jid}"
+                        type="headline"
+                        id="${u.getUniqueId()}"
+                        xmlns="jabber:client">
+            <event xmlns="http://jabber.org/protocol/pubsub#event">
+                <items node="urn:xmpp:bookmarks:1">
+                    <item id="theplay@conference.shakespeare.lit">
+                        <conference xmlns="urn:xmpp:bookmarks:1" name="The Play's the Thing" autojoin="false">
+                            <nick>JC</nick>
+                        </conference>
+                    </item>
+                    <item id="another@conference.shakespeare.lit">
+                        <conference xmlns="urn:xmpp:bookmarks:1" name="Second bookmark" autojoin="false">
+                            <nick>JC</nick>
+                        </conference>
+                    </item>
+                    <item id="yab@conference.shakespeare.lit">
+                        <conference xmlns="urn:xmpp:bookmarks:1" name="Yet another bookmark" autojoin="false">
+                            <nick>JC</nick>
+                        </conference>
+                    </item>
+                </items>
+            </event>
+        </message>`;
+        _converse.api.connection.get()._dataRecv(mock.createRequest(stanza));
+
+        await u.waitUntil(() => bookmarks.filter((b) => !b.get('autojoin')).length === 3);
+        expect(bookmarks.map(b => b.get('name'))).toEqual(
+            ['Second bookmark', "The Play's the Thing", 'Yet another bookmark']
+        );
+        expect(_converse.chatboxviews.get('theplay@conference.shakespeare.lit')).toBeUndefined();
+        expect(Object.keys(_converse.chatboxviews.getAll()).length).toBe(1);
     }));
 
     it("can be retrieved from the XMPP server", mock.initConverse(

+ 1 - 0
src/plugins/roomslist/tests/roomslist.js

@@ -149,6 +149,7 @@ describe("A list of open groupchats", function () {
         expect(Array.from(list.classList).includes('hidden')).toBeFalsy();
         const items = list.querySelectorAll('.list-item');
         expect(items.length).toBe(1);
+
         await u.waitUntil(() => list.querySelector('.list-item .open-room span').textContent.trim() === 'Bookmarked Lounge');
         expect(_converse.state.bookmarks.fetchBookmarks).toHaveBeenCalled();
     }));