From 7fdb5be8b0b11d9b26cb0543e35a510e67ba7188 Mon Sep 17 00:00:00 2001 From: JC Brand Date: Fri, 7 Feb 2025 11:55:43 +0200 Subject: [PATCH] MUC improvements - Don't show the bookmarked icon in the header. - Don't use the `name` from the bookmark, since Converse doesn't let you set the bookmark name and using it adds complexity. - While refreshing the disco, set the MUC name - Remove ability to add/remove bookmark from the rooms list --- src/headless/plugins/bookmarks/plugin.js | 11 +--- src/headless/plugins/muc/muc.js | 6 ++ src/plugins/bookmark-views/index.js | 3 +- src/plugins/bookmark-views/tests/bookmarks.js | 36 ----------- src/plugins/bookmark-views/utils.js | 10 ---- .../muc-views/modals/templates/muc-details.js | 14 ++--- .../muc-views/styles/muc-details-modal.scss | 1 + src/plugins/muc-views/templates/muc-head.js | 8 --- src/plugins/muc-views/tests/muc-avatar.js | 10 ++-- src/plugins/roomslist/templates/roomslist.js | 21 ------- src/plugins/roomslist/tests/roomslist.js | 59 ------------------- src/types/plugins/bookmark-views/utils.d.ts | 4 -- 12 files changed, 21 insertions(+), 162 deletions(-) diff --git a/src/headless/plugins/bookmarks/plugin.js b/src/headless/plugins/bookmarks/plugin.js index 0e567315aa..17388b27c1 100644 --- a/src/headless/plugins/bookmarks/plugin.js +++ b/src/headless/plugins/bookmarks/plugin.js @@ -27,16 +27,7 @@ converse.plugins.add('converse-bookmarks', { // New functions which don't exist yet can also be added. ChatRoom: { - getDisplayName() { - const { _converse, getDisplayName } = this.__super__; - const { bookmarks } = _converse.state; - const bookmark = this.get('bookmarked') ? bookmarks?.get(this.get('jid')) : null; - return bookmark?.get('name') || getDisplayName.apply(this, arguments); - }, - - /** - * @param {string} nick - */ + /** @param {string} nick */ getAndPersistNickname(nick) { nick = nick || getNicknameFromBookmark(this.get('jid')); return this.__super__.getAndPersistNickname.call(this, nick); diff --git a/src/headless/plugins/muc/muc.js b/src/headless/plugins/muc/muc.js index 4472da3507..ab2c68cea9 100644 --- a/src/headless/plugins/muc/muc.js +++ b/src/headless/plugins/muc/muc.js @@ -1235,14 +1235,20 @@ class MUC extends ModelWithMessages(ColorAwareModel(ChatBoxBase)) { */ async getDiscoInfoFields () { const fields = await api.disco.getFields(this.get('jid')); + const config = fields.reduce((config, f) => { const name = f.get('var'); + if (name === 'muc#roomconfig_roomname') { + config['roomname'] = f.get('value'); + } if (name?.startsWith('muc#roominfo_')) { config[name.replace('muc#roominfo_', '')] = f.get('value'); } return config; }, {}); + this.config.save(config); + if (config['roomname']) this.save({ name: config['roomname'] }); } /** diff --git a/src/plugins/bookmark-views/index.js b/src/plugins/bookmark-views/index.js index 41efd70912..e927fff4ea 100644 --- a/src/plugins/bookmark-views/index.js +++ b/src/plugins/bookmark-views/index.js @@ -8,7 +8,7 @@ import './modals/bookmark-form.js'; import BookmarkForm from './components/bookmark-form.js'; import BookmarksView from './components/bookmarks-list.js'; import { BookmarkableChatRoomView } from './mixins.js'; -import { removeBookmarkViaEvent, addBookmarkViaEvent } from './utils.js'; +import { removeBookmarkViaEvent } from './utils.js'; import './styles/bookmarks.scss'; @@ -34,7 +34,6 @@ converse.plugins.add('converse-bookmark-views', { const exports = { removeBookmarkViaEvent, - addBookmarkViaEvent, MUCBookmarkForm: BookmarkForm, BookmarksView, }; diff --git a/src/plugins/bookmark-views/tests/bookmarks.js b/src/plugins/bookmark-views/tests/bookmarks.js index cabcab0d53..8aff8d013f 100644 --- a/src/plugins/bookmark-views/tests/bookmarks.js +++ b/src/plugins/bookmark-views/tests/bookmarks.js @@ -26,42 +26,6 @@ describe("A chat room", function () { await u.waitUntil(() => room.getAndPersistNickname.calls.count()); expect(room.get('nick')).toBe('Othello'); })); - - it("displays that it's bookmarked through its bookmark icon", - mock.initConverse([], {}, async function (_converse) { - - const { u } = converse.env; - await mock.waitForRoster(_converse, 'current', 0); - mock.waitUntilDiscoConfirmed( - _converse, _converse.bare_jid, - [{'category': 'pubsub', 'type': 'pep'}], - [ - 'http://jabber.org/protocol/pubsub#publish-options', - 'urn:xmpp:bookmarks:1#compat' - ] - ); - - const nick = 'romeo'; - const muc_jid = 'lounge@montague.lit'; - await _converse.api.rooms.open(muc_jid); - await mock.getRoomFeatures(_converse, muc_jid); - await mock.waitForReservedNick(_converse, muc_jid, nick); - - const view = _converse.chatboxviews.get('lounge@montague.lit'); - expect(view.querySelector('.chatbox-title__text .fa-bookmark')).toBe(null); - - const { bookmarks } = _converse.state; - bookmarks.create({ - 'jid': view.model.get('jid'), - 'autojoin': false, - 'name': 'The lounge', - 'nick': ' some1' - }); - view.model.set('bookmarked', true); - await u.waitUntil(() => view.querySelector('.chatbox-title__text .fa-bookmark') !== null); - view.model.set('bookmarked', false); - await u.waitUntil(() => view.querySelector('.chatbox-title__text .fa-bookmark') === null); - })); }); }); diff --git a/src/plugins/bookmark-views/utils.js b/src/plugins/bookmark-views/utils.js index 222e0e68ae..78f703f8eb 100644 --- a/src/plugins/bookmark-views/utils.js +++ b/src/plugins/bookmark-views/utils.js @@ -17,16 +17,6 @@ export async function removeBookmarkViaEvent(ev) { } } -/** - * @param {Event} ev - */ -export function addBookmarkViaEvent(ev) { - ev.preventDefault(); - const el = /** @type {Element} */ (ev.currentTarget); - const jid = el.getAttribute('data-room-jid'); - api.modal.show('converse-bookmark-form-modal', { jid }, ev); -} - /** * @param {Event} ev */ diff --git a/src/plugins/muc-views/modals/templates/muc-details.js b/src/plugins/muc-views/modals/templates/muc-details.js index ff7d6ea8c5..ae51506d24 100644 --- a/src/plugins/muc-views/modals/templates/muc-details.js +++ b/src/plugins/muc-views/modals/templates/muc-details.js @@ -11,8 +11,8 @@ const subject = (model) => { const i18n_topic = __('Topic'); const i18n_topic_author = __('Topic author'); return html` -

${i18n_topic}:

-

${i18n_topic_author}: ${subject && subject.author}

+

${i18n_topic}:

+

${i18n_topic_author}: ${subject && subject.author}

`; } @@ -65,13 +65,13 @@ export default (model) => { nonce=${model.vcard?.get('vcard_updated')} height="72" width="72"> -

${i18n_name}: ${model.get('name')}

-

${i18n_address}:

+

${i18n_name}: ${model.get('name')}

+

${i18n_address}:


-

${i18n_desc}:

+

${i18n_desc}:

${ (model.get('subject')) ? subject(model) : '' } -

${i18n_online_users}: ${num_occupants}

-

${i18n_features}: +

${i18n_online_users}: ${num_occupants}

+

${i18n_features}:

diff --git a/src/plugins/muc-views/tests/muc-avatar.js b/src/plugins/muc-views/tests/muc-avatar.js index 3c667a8368..7d622bcf39 100644 --- a/src/plugins/muc-views/tests/muc-avatar.js +++ b/src/plugins/muc-views/tests/muc-avatar.js @@ -118,11 +118,11 @@ describe('Groupchats', () => { let els = modal.querySelectorAll('p.room-info'); expect(els[0].textContent).toBe('Name: A Dark Cave'); - expect(els[1].querySelector('strong').textContent).toBe('XMPP address'); + expect(els[1].querySelector('strong').textContent).toBe('XMPP address:'); expect(els[1].querySelector('converse-texture').textContent.trim()).toBe( 'xmpp:coven@chat.shakespeare.lit?join' ); - expect(els[2].querySelector('strong').textContent).toBe('Description'); + expect(els[2].querySelector('strong').textContent).toBe('Description:'); expect(els[2].querySelector('converse-texture').textContent).toBe('This is the description'); expect(els[3].textContent).toBe('Online users: 1'); @@ -153,13 +153,13 @@ describe('Groupchats', () => { els = modal.querySelectorAll('p.room-info'); expect(els[0].textContent).toBe('Name: A Dark Cave'); - expect(els[1].querySelector('strong').textContent).toBe('XMPP address'); + expect(els[1].querySelector('strong').textContent).toBe('XMPP address:'); expect(els[1].querySelector('converse-texture').textContent.trim()).toBe( 'xmpp:coven@chat.shakespeare.lit?join' ); - expect(els[2].querySelector('strong').textContent).toBe('Description'); + expect(els[2].querySelector('strong').textContent).toBe('Description:'); expect(els[2].querySelector('converse-texture').textContent).toBe('This is the description'); - expect(els[3].querySelector('strong').textContent).toBe('Topic'); + expect(els[3].querySelector('strong').textContent).toBe('Topic:'); await u.waitUntil( () => els[3].querySelector('converse-texture').textContent === 'Hatching dark plots' ); diff --git a/src/plugins/roomslist/templates/roomslist.js b/src/plugins/roomslist/templates/roomslist.js index 603ef97fdc..62a5b684e3 100644 --- a/src/plugins/roomslist/templates/roomslist.js +++ b/src/plugins/roomslist/templates/roomslist.js @@ -7,7 +7,6 @@ import { _converse, api, u, constants } from "@converse/headless"; import 'plugins/muc-views/modals/add-muc.js'; import 'plugins/muc-views/modals/muc-list.js'; import { __ } from 'i18n'; -import { addBookmarkViaEvent } from 'plugins/bookmark-views/utils.js'; import { getUnreadMsgsDisplay } from "shared/chat/utils"; import '../styles/roomsgroups.scss'; @@ -20,24 +19,6 @@ function isCurrentlyOpen (room) { return isUniView() && !room.get('hidden'); } -/** @param {MUC} room */ -function tplBookmark (room) { - const bm = room.get('bookmarked') ?? false; - const i18n_bookmark = __('Bookmark'); - return html` - addBookmarkViaEvent(ev)} - title="${ i18n_bookmark }"> - - - `; -} - /** @param {MUC} room */ function tplUnreadIndicator (room) { return html`${ getUnreadMsgsDisplay(room) }`; @@ -75,8 +56,6 @@ function tplRoomItem (el, room) { ${room.getDisplayName()} - ${ api.settings.get('allow_bookmarks') ? tplBookmark(room) : '' } - roomspanel.querySelectorAll('.msgs-indicator').length === 0); })); - - it("uses bookmarks to determine groupchat names", - mock.initConverse( - ['chatBoxesFetched'], - {'view_mode': 'fullscreen'}, - async function (_converse) { - - const { Strophe, sizzle } = converse.env; - const u = converse.env.utils; - - await mock.waitForRoster(_converse, 'current', 0); - await mock.openAndEnterChatRoom(_converse, 'lounge@montague.lit', 'romeo'); - let stanza = stx` - - - - `; - _converse.api.connection.get()._dataRecv(mock.createRequest(stanza)); - - spyOn(_converse.exports.Bookmarks.prototype, 'fetchBookmarks').and.callThrough(); - - await mock.waitUntilDiscoConfirmed( - _converse, _converse.bare_jid, - [{'category': 'pubsub', 'type':'pep'}], - [`${Strophe.NS.PUBSUB}#publish-options`] - ); - - const IQ_stanzas = _converse.api.connection.get().IQ_stanzas; - const sent_stanza = await u.waitUntil(() => IQ_stanzas.filter(s => sizzle('items[node="storage:bookmarks"]', s).length).pop()); - expect(sent_stanza).toEqualStanza( - stx` - - - - `); - - stanza = stx` - - - - - - - - - - `; - _converse.api.connection.get()._dataRecv(mock.createRequest(stanza)); - - await _converse.api.waitUntil('roomsListInitialized'); - const controlbox = _converse.chatboxviews.get('controlbox'); - const list = controlbox.querySelector('.list-container--openrooms'); - 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(); - })); }); describe("A groupchat shown in the groupchats list", function () { diff --git a/src/types/plugins/bookmark-views/utils.d.ts b/src/types/plugins/bookmark-views/utils.d.ts index 023c61f2c2..4d66474a46 100644 --- a/src/types/plugins/bookmark-views/utils.d.ts +++ b/src/types/plugins/bookmark-views/utils.d.ts @@ -2,10 +2,6 @@ * @param {Event} ev */ export function removeBookmarkViaEvent(ev: Event): Promise; -/** - * @param {Event} ev - */ -export function addBookmarkViaEvent(ev: Event): void; /** * @param {Event} ev */