Просмотр исходного кода

Let chats be closed by calling `close` on the models

Instead of on the views/components.

We still have `close` methods on the components, but they are just
event handlers and not external API methods to be called by other code.
Instead `close` should be called on the model.
JC Brand 4 лет назад
Родитель
Сommit
68f0be996f

+ 0 - 13
src/plugins/chatview/chat.js

@@ -60,19 +60,6 @@ export default class ChatView extends BaseChatView {
         _converse.chatboxviews.get('controlbox')?.show();
     }
 
-    /**
-     * Closes this chat
-     * @private
-     * @method _converse.ChatBoxView#close
-     */
-    close (ev) {
-        ev?.preventDefault?.();
-        if (_converse.router.history.getFragment() === 'converse/chat?jid=' + this.model.get('jid')) {
-            _converse.router.navigate('');
-        }
-        return this.model.close(ev);
-    }
-
     afterShown () {
         this.model.setChatState(_converse.ACTIVE);
         this.maybeFocus();

+ 3 - 4
src/plugins/chatview/heading.js

@@ -37,8 +37,9 @@ export default class ChatHeading extends ElementView {
         api.modal.show(UserDetailsModal, { model: this.model }, ev);
     }
 
-    close () {
-        _converse.chatboxviews.get(this.getAttribute('jid'))?.close();
+    close (ev) {
+        ev.preventDefault();
+        this.model.close();
     }
 
     /**
@@ -119,8 +120,6 @@ export default class ChatHeading extends ElementView {
             })
         );
     }
-
-
 }
 
 api.elements.define('converse-chat-heading', ChatHeading);

+ 2 - 0
src/plugins/chatview/index.js

@@ -9,6 +9,7 @@ import 'shared/chat/help-messages.js';
 import 'shared/chat/toolbar.js';
 import ChatView from './chat.js';
 import { _converse, api, converse } from '@converse/headless/core';
+import { clearHistory } from './utils.js';
 
 import './styles/index.scss';
 
@@ -57,5 +58,6 @@ converse.plugins.add('converse-chatview', {
         _converse.ChatBoxView = ChatView;
 
         api.listen.on('connected', () => api.disco.own.features.add(Strophe.NS.SPOILER));
+        api.listen.on('chatBoxClosed', (model) => clearHistory(model.get('jid')));
     }
 });

+ 2 - 2
src/plugins/chatview/tests/chatbox.js

@@ -205,10 +205,10 @@ describe("Chatboxes", function () {
             await u.waitUntil(() => rosterview.querySelectorAll('.roster-group').length);
             await mock.openChatBoxFor(_converse, contact_jid);
             const chatview = _converse.chatboxviews.get(contact_jid);
-            spyOn(chatview, 'close').and.callThrough();
+            spyOn(chatview.model, 'close').and.callThrough();
             spyOn(_converse.api, "trigger").and.callThrough();
             chatview.querySelector('.close-chatbox-button').click();
-            expect(chatview.close).toHaveBeenCalled();
+            expect(chatview.model.close).toHaveBeenCalled();
             await new Promise(resolve => _converse.api.listen.once('chatBoxClosed', resolve));
             expect(_converse.api.trigger).toHaveBeenCalledWith('chatBoxClosed', jasmine.any(Object));
             done();

+ 6 - 0
src/plugins/chatview/utils.js

@@ -3,6 +3,12 @@ import { _converse } from "@converse/headless/core";
 import { html } from 'lit';
 
 
+export function clearHistory (jid) {
+    if (_converse.router.history.getFragment() === `converse/chat?jid=${jid}`) {
+        _converse.router.navigate('');
+    }
+}
+
 export async function getHeadingDropdownItem (promise_or_data) {
     const data = await promise_or_data;
     return html`

+ 2 - 10
src/plugins/minimize/components/minimized-chat.js

@@ -1,6 +1,6 @@
 import tpl_trimmed_chat from "../templates/trimmed_chat.js";
 import { CustomElement } from 'shared/components/element.js';
-import { api, _converse } from "@converse/headless/core";
+import { api } from "@converse/headless/core";
 import { maximize } from  '../utils.js';
 
 
@@ -28,15 +28,7 @@ export default class MinimizedChat extends CustomElement {
 
     close (ev) {
         ev?.preventDefault();
-        const view = _converse.chatboxviews.get(this.model.get('id'));
-        if (view) {
-            // This will call model.destroy(), removing it from the
-            // collection and will also emit 'chatBoxClosed'
-            view.close();
-        } else {
-            this.model.destroy();
-            api.trigger('chatBoxClosed', this);
-        }
+        this.model.close();
     }
 
     restore (ev) {

+ 7 - 1
src/plugins/muc-views/index.js

@@ -8,7 +8,7 @@ import '../modal.js';
 import './adhoc-commands.js';
 import MUCView from './muc.js';
 import { api, converse } from '@converse/headless/core';
-import { fetchAndSetMUCDomain } from './utils.js';
+import { clearHistory, fetchAndSetMUCDomain } from './utils.js';
 
 import './styles/index.scss';
 
@@ -76,5 +76,11 @@ converse.plugins.add('converse-muc-views', {
             fetchAndSetMUCDomain(view);
             view.model.on('change:connected', () => fetchAndSetMUCDomain(view));
         });
+
+        api.listen.on('chatBoxClosed', (model) => {
+            if (model.get('type') === _converse.CHATROOMS_TYPE) {
+                clearHistory(model.get('jid'));
+            }
+        });
     }
 });

+ 0 - 13
src/plugins/muc-views/muc.js

@@ -40,19 +40,6 @@ export default class MUCView extends BaseChatView {
         return tpl_muc({ 'model': this.model });
     }
 
-    /**
-     * Closes this chat, which implies leaving the MUC as well.
-     * @private
-     * @method _converse.ChatRoomView#close
-     */
-    close (ev) {
-        ev?.preventDefault?.();
-        if (_converse.router.history.getFragment() === 'converse/room?jid=' + this.model.get('jid')) {
-            _converse.router.navigate('');
-        }
-        return this.model.close(ev);
-    }
-
     async destroy () {
         const messages = [__('Are you sure you want to destroy this groupchat?')];
         let fields = [

+ 5 - 0
src/plugins/muc-views/utils.js

@@ -25,6 +25,11 @@ const COMMAND_TO_ROLE = {
     'voice': 'participant'
 };
 
+export function clearHistory (jid) {
+    if (_converse.router.history.getFragment() === `converse/room?jid=${jid}`) {
+        _converse.router.navigate('');
+    }
+}
 
 function setMUCDomain (domain, controlboxview) {
     controlboxview.querySelector('converse-rooms-list')

+ 5 - 0
src/shared/chat/baseview.js

@@ -27,6 +27,11 @@ export default class BaseChatView extends CustomElement {
         }
     }
 
+    close (ev) {
+        ev?.preventDefault?.();
+        return this.model.close(ev);
+    }
+
     maybeFocus () {
         api.settings.get('auto_focus') && this.focus();
     }