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.
This commit is contained in:
JC Brand 2021-06-15 09:26:06 +02:00
parent 9fb92080f2
commit 68f0be996f
10 changed files with 32 additions and 43 deletions

View File

@ -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();

View File

@ -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);

View File

@ -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')));
}
});

View File

@ -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();

View File

@ -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`

View File

@ -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) {

View File

@ -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'));
}
});
}
});

View File

@ -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 = [

View File

@ -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')

View File

@ -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();
}