Browse Source

Move method to view unread messages to relevant component

JC Brand 4 years ago
parent
commit
8f21b020b1

+ 2 - 2
spec/chatbox.js

@@ -1187,8 +1187,8 @@ describe("Chatboxes", function () {
             const view = _converse.chatboxviews.get(sender_jid);
             await u.waitUntil(() => view.model.messages.length);
             expect(select_msgs_indicator().textContent).toBe('1');
-            view.viewUnreadMessages();
-            rosterview.render();
+            const chat_new_msgs_indicator = view.querySelector('.new-msgs-indicator');
+            chat_new_msgs_indicator.click();
             await u.waitUntil(() => select_msgs_indicator() === undefined);
             done();
         }));

+ 27 - 0
spec/muc.js

@@ -250,6 +250,33 @@ describe("Groupchats", function () {
             done();
         }));
 
+        it("shows a new messages indicator when you're scrolled up",
+            mock.initConverse(['chatBoxesFetched'], {}, async function (done, _converse) {
+
+            const muc_jid = 'lounge@montague.lit';
+            await mock.openAndEnterChatRoom(_converse, muc_jid, 'romeo');
+            const view = _converse.chatboxviews.get(muc_jid);
+            const message = u.toStanza(`
+                <message xmlns="jabber:client" type="groupchat" id="918172de-d5c5-4da4-b388-446ef4a05bec" to="${_converse.jid}" xml:lang="en" from="${muc_jid}/juliet">
+                    <body>Wherefore art though?</body>
+                    <active xmlns="http://jabber.org/protocol/chatstates"/>
+                    <origin-id xmlns="urn:xmpp:sid:0" id="918172de-d5c5-4da4-b388-446ef4a05bec"/>
+                    <stanza-id xmlns="urn:xmpp:sid:0" id="88cc9c93-a8f4-4dd5-b02a-d19855eb6303" by="${muc_jid}"/>
+                    <delay xmlns="urn:xmpp:delay" stamp="2020-07-14T17:46:47Z" from="juliet@shakespeare.lit"/>
+                </message>`);
+
+            view.model.save('scrolled', true); // hack
+            _converse.connection._dataRecv(mock.createRequest(message));
+
+            await u.waitUntil(() => view.model.messages.length);
+            const chat_new_msgs_indicator = view.querySelector('.new-msgs-indicator');
+            await u.waitUntil(() => u.isVisible(chat_new_msgs_indicator));
+            chat_new_msgs_indicator.click();
+            expect(view.model.get('scrolled')).toBeFalsy();
+            await u.waitUntil(() => !u.isVisible(chat_new_msgs_indicator));
+            done();
+        }));
+
 
         describe("upon being entered", function () {
 

+ 13 - 6
src/plugins/chatview/bottom-panel.js

@@ -58,18 +58,19 @@ export default class ChatBottomPanel extends ElementView {
             tpl_chatbox_message_form(
                 Object.assign(this.model.toJSON(), {
                     'onDrop': ev => this.onDrop(ev),
-                    'inputChanged': ev => this.inputChanged(ev),
-                    'onKeyDown': ev => this.onKeyDown(ev),
-                    'onKeyUp': ev => this.onKeyUp(ev),
-                    'onPaste': ev => this.onPaste(ev),
-                    'onChange': ev => this.updateCharCounter(ev.target.value),
                     'hint_value': this.querySelector('.spoiler-hint')?.value,
+                    'inputChanged': ev => this.inputChanged(ev),
                     'label_message': this.model.get('composing_spoiler') ? __('Hidden message') : __('Message'),
                     'label_spoiler_hint': __('Optional hint'),
                     'message_value': this.querySelector('.chat-textarea')?.value,
+                    'onChange': ev => this.updateCharCounter(ev.target.value),
+                    'onKeyDown': ev => this.onKeyDown(ev),
+                    'onKeyUp': ev => this.onKeyUp(ev),
+                    'onPaste': ev => this.onPaste(ev),
                     'show_send_button': api.settings.get('show_send_button'),
                     'show_toolbar': api.settings.get('show_toolbar'),
-                    'unread_msgs': __('You have unread messages')
+                    'unread_msgs': __('You have unread messages'),
+                    'viewUnreadMessages': ev => this.viewUnreadMessages(ev),
                 })
             ),
             form_container
@@ -79,6 +80,12 @@ export default class ChatBottomPanel extends ElementView {
         this.renderToolbar();
     }
 
+    viewUnreadMessages (ev) {
+        ev?.preventDefault?.();
+        this.model.save({ 'scrolled': false, 'scrollTop': null });
+        _converse.chatboxviews.get(this.getAttribute('jid'))?.scrollDown();
+    }
+
     hideNewMessagesIndicator () {
         this.querySelector('.new-msgs-indicator')?.classList.add('hidden');
     }

+ 1 - 1
src/plugins/chatview/templates/chatbox_message_form.js

@@ -2,7 +2,7 @@ import { html } from "lit-html";
 
 
 export default (o) => html`
-    <div class="new-msgs-indicator hidden">▼ ${ o.unread_msgs } ▼</div>
+    <div class="new-msgs-indicator hidden" @click=${ev => o.viewUnreadMessages(ev)}>▼ ${ o.unread_msgs } ▼</div>
     <form class="setNicknameButtonForm hidden">
         <input type="submit" class="btn btn-primary" name="join" value="Join"/>
     </form>

+ 0 - 11
src/plugins/chatview/view.js

@@ -18,12 +18,6 @@ const { dayjs } = converse.env;
 export default class ChatView extends BaseChatView {
     length = 200
     className = 'chatbox hidden'
-    is_chatroom = false // Leaky abstraction from MUC
-
-    events = {
-        'click .chatbox-navback': 'showControlBox',
-        'click .new-msgs-indicator': 'viewUnreadMessages',
-    }
 
     async initialize () {
         const jid = this.getAttribute('jid');
@@ -187,11 +181,6 @@ export default class ChatView extends BaseChatView {
         this.scrollDown();
         this.maybeFocus();
     }
-
-    viewUnreadMessages () {
-        this.model.save({ 'scrolled': false, 'scrollTop': null });
-        this.scrollDown();
-    }
 }
 
 api.elements.define('converse-chat', ChatView);

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

@@ -20,8 +20,6 @@ export default class MUCView extends BaseChatView {
     length = 300
     is_chatroom = true
     events = {
-        'click .chatbox-navback': 'showControlBox',
-        'click .new-msgs-indicator': 'viewUnreadMessages',
         // Arrow functions don't work here because you can't bind a different `this` param to them.
         'click .occupant-nick': function (ev) {
             this.insertIntoTextArea(ev.target.textContent);