From f7de8c336bb7659ceac95c0f9971442484bf2b3e Mon Sep 17 00:00:00 2001
From: ubermanu <e.vodor@gmail.com>
Date: Tue, 16 Mar 2021 04:51:25 +0100
Subject: [PATCH 01/10] minor: move the actions buttons outside of their drawer
 next to the message

---
 src/plugins/sib-action-buttons-inline.js | 39 ++++++++++++++++++++++++
 src/solid-xmpp-chat.js                   |  2 ++
 src/styles/index.scss                    | 10 ++++++
 3 files changed, 51 insertions(+)
 create mode 100644 src/plugins/sib-action-buttons-inline.js

diff --git a/src/plugins/sib-action-buttons-inline.js b/src/plugins/sib-action-buttons-inline.js
new file mode 100644
index 0000000..77252f6
--- /dev/null
+++ b/src/plugins/sib-action-buttons-inline.js
@@ -0,0 +1,39 @@
+/**
+ * Render the action buttons off the drawer.
+ * The buttons should be shown on message hover, on the right side of the message.
+ */
+converse.plugins.add('sib-action-buttons-inline', {
+  initialize() {
+    const { html } = converse.env;
+    const _converse = this._converse;
+    const { api } = _converse;
+
+    const MessageActions = api.elements.registry['converse-message-actions'];
+
+    function getInlineActionsItem(o) {
+      return html`
+        <button class='chat-msg__action ${o.button_class}' @click='${o.handler}' title='${o.i18n_text}'>
+          <converse-icon class='${o.icon_class}'
+                         path-prefix='${api.settings.get('assets_path')}'
+                         color='var(--text-color-lighten-15-percent)'
+                         size='1em'></converse-icon>
+        </button>
+      `;
+    }
+
+    Object.assign(MessageActions.prototype, {
+      async renderActions() {
+        const buttons = await this.getActionButtons();
+        const items = buttons.map(b => getInlineActionsItem(b));
+
+        if (items.length) {
+          return html`
+            <div class='chat-msg__actions chat-msg__actions--inline'>${items}</div>
+          `;
+        } else {
+          return '';
+        }
+      },
+    });
+  },
+});
diff --git a/src/solid-xmpp-chat.js b/src/solid-xmpp-chat.js
index 8887e7a..907b63c 100644
--- a/src/solid-xmpp-chat.js
+++ b/src/solid-xmpp-chat.js
@@ -6,6 +6,7 @@ import './conversejs/converse.min.js';
 import './conversejs/emojis.js';
 
 import './plugins/converse-rai.js';
+import './plugins/sib-action-buttons-inline.js';
 import './plugins/sib-chat-navigation.js';
 import './plugins/sib-custom-hats.js';
 import './plugins/sib-disconnected.js';
@@ -223,6 +224,7 @@ export const SolidXMPPChat = {
         },
         'whitelisted_plugins': [
           'converse-rai',
+          'sib-action-buttons-inline',
           'sib-chat-navigation',
           'sib-connected',
           'sib-custom-hats',
diff --git a/src/styles/index.scss b/src/styles/index.scss
index f32781c..9f6c11e 100644
--- a/src/styles/index.scss
+++ b/src/styles/index.scss
@@ -871,4 +871,14 @@
   .converse-chatboxes .chatbox .box-flyout {
     width: 100% !important;
   }
+
+  // Message actions (inline)
+
+  .chat-msg:not(:hover) .chat-msg__actions--inline {
+    display: none;
+  }
+
+  .chat-msg__actions--inline {
+    display: flex;
+  }
 }
\ No newline at end of file
-- 
GitLab


From 9ad3d7a8c9dd1f08a92eb71ca6dfebc1c735aaee Mon Sep 17 00:00:00 2001
From: ubermanu <e.vodor@gmail.com>
Date: Tue, 16 Mar 2021 06:04:56 +0100
Subject: [PATCH 02/10] minor: replace the current emoji picker with a faster
 and more complete one

---
 src/plugins/sib-emoji-picker.js | 71 +++++++++++++++++++++++++++++++++
 src/solid-xmpp-chat.js          |  4 +-
 2 files changed, 74 insertions(+), 1 deletion(-)
 create mode 100644 src/plugins/sib-emoji-picker.js

diff --git a/src/plugins/sib-emoji-picker.js b/src/plugins/sib-emoji-picker.js
new file mode 100644
index 0000000..6099368
--- /dev/null
+++ b/src/plugins/sib-emoji-picker.js
@@ -0,0 +1,71 @@
+import 'https://cdn.skypack.dev/emoji-picker-element';
+
+/**
+ * Custom emoji picker.
+ * Replaces the default drawer with a custom component.
+ */
+converse.plugins.add('sib-emoji-picker', {
+  dependencies: [
+    'converse-emoji',
+  ],
+  initialize() {
+    const { html } = converse.env;
+    const _converse = this._converse;
+    const { api, __ } = _converse;
+
+    /**
+     * Force rendering of the emoji picker inside the dropdown.
+     * Note: Without this mixin, the IndexedDB can't be loaded for some reason.
+     */
+    const EmojiDropdownMixin = {
+      render() {
+        return html`
+          <div class='dropup'>
+            <button class='toggle-emojis'
+                    title='${__('Insert emojis')}'
+                    data-toggle='dropdown'
+                    aria-haspopup='true'
+                    aria-expanded='false'>
+              <converse-icon
+                class='fa fa-smile '
+                path-prefix='${api.settings.get('assets_path')}'
+                size='1em'></converse-icon>
+            </button>
+            <div class='dropdown-menu'>
+              <converse-emoji-picker
+                .chatview='${this.chatview}'
+                .model='${this.model}'
+              ></converse-emoji-picker>
+            </div>
+          </div>`;
+      },
+    };
+
+    // Apply mixin
+    const EmojiDropdown = api.elements.registry['converse-emoji-dropdown'];
+    Object.assign(EmojiDropdown.prototype, EmojiDropdownMixin);
+
+    /**
+     * Update the emoji picker rendered content.
+     * with the new element.
+     */
+    const EmojiPickerMixin = {
+      firstUpdated() {
+      },
+      registerEvents() {
+      },
+      render() {
+        return html`
+          <emoji-picker
+            .chatview='${this.chatview}'
+            .model='${this.model}'
+            @emoji-click='${ev => this.insertIntoTextArea(ev.detail.emoji.unicode)}'
+          ></emoji-picker>`;
+      },
+    };
+
+    // Apply mixin
+    const EmojiPicker = api.elements.registry['converse-emoji-picker'];
+    Object.assign(EmojiPicker.prototype, EmojiPickerMixin);
+  },
+});
diff --git a/src/solid-xmpp-chat.js b/src/solid-xmpp-chat.js
index 8887e7a..1827efe 100644
--- a/src/solid-xmpp-chat.js
+++ b/src/solid-xmpp-chat.js
@@ -2,13 +2,14 @@ import { Sib, store, StoreMixin } from 'https://cdn.skypack.dev/@startinblox/cor
 import { Deferred } from './utils.js';
 import ComponentPath from './path.js';
 
-import './conversejs/converse.min.js';
+import './conversejs/converse.js';
 import './conversejs/emojis.js';
 
 import './plugins/converse-rai.js';
 import './plugins/sib-chat-navigation.js';
 import './plugins/sib-custom-hats.js';
 import './plugins/sib-disconnected.js';
+import './plugins/sib-emoji-picker.js';
 import './plugins/sib-history-improved.js';
 import './plugins/sib-mention-mobile.js';
 import './plugins/sib-remove-notifications.js';
@@ -227,6 +228,7 @@ export const SolidXMPPChat = {
           'sib-connected',
           'sib-custom-hats',
           'sib-disconnected',
+          'sib-emoji-picker',
           'sib-history-improved',
           'sib-mention-mobile',
           'sib-remove-notifications',
-- 
GitLab


From 3b946562187f38432377692f04b5df179d750665 Mon Sep 17 00:00:00 2001
From: ubermanu <e.vodor@gmail.com>
Date: Tue, 16 Mar 2021 06:17:19 +0100
Subject: [PATCH 03/10] restore the usage of the minified version of converse

---
 src/solid-xmpp-chat.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/solid-xmpp-chat.js b/src/solid-xmpp-chat.js
index 1827efe..cb78f4b 100644
--- a/src/solid-xmpp-chat.js
+++ b/src/solid-xmpp-chat.js
@@ -2,7 +2,7 @@ import { Sib, store, StoreMixin } from 'https://cdn.skypack.dev/@startinblox/cor
 import { Deferred } from './utils.js';
 import ComponentPath from './path.js';
 
-import './conversejs/converse.js';
+import './conversejs/converse.min.js';
 import './conversejs/emojis.js';
 
 import './plugins/converse-rai.js';
-- 
GitLab


From b864250444af32d17d7108f901e533cc9a664aed Mon Sep 17 00:00:00 2001
From: ubermanu <e.vodor@gmail.com>
Date: Tue, 16 Mar 2021 06:21:54 +0100
Subject: [PATCH 04/10] enable skin tone emojis

---
 src/plugins/sib-emoji-picker.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/plugins/sib-emoji-picker.js b/src/plugins/sib-emoji-picker.js
index 6099368..d8a03ff 100644
--- a/src/plugins/sib-emoji-picker.js
+++ b/src/plugins/sib-emoji-picker.js
@@ -59,7 +59,7 @@ converse.plugins.add('sib-emoji-picker', {
           <emoji-picker
             .chatview='${this.chatview}'
             .model='${this.model}'
-            @emoji-click='${ev => this.insertIntoTextArea(ev.detail.emoji.unicode)}'
+            @emoji-click='${ev => this.insertIntoTextArea(ev.detail.unicode)}'
           ></emoji-picker>`;
       },
     };
-- 
GitLab


From 9e2a0e73e392b6ce0456c1cfcee16e8dcc869e4e Mon Sep 17 00:00:00 2001
From: ubermanu <e.vodor@gmail.com>
Date: Tue, 16 Mar 2021 14:09:13 +0100
Subject: [PATCH 05/10] move inline actions on top of the message

---
 src/styles/index.scss | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/src/styles/index.scss b/src/styles/index.scss
index 9f6c11e..7aa8376 100644
--- a/src/styles/index.scss
+++ b/src/styles/index.scss
@@ -872,7 +872,18 @@
     width: 100% !important;
   }
 
-  // Message actions (inline)
+  //
+  //  Message Actions (inline)
+  // ---------------------------------
+
+  .chat-msg {
+    position: relative;
+  }
+
+  // Reset these positions
+  .chat-msg__content, .chat-msg__body, converse-message-actions {
+    position: initial;
+  }
 
   .chat-msg:not(:hover) .chat-msg__actions--inline {
     display: none;
@@ -880,5 +891,12 @@
 
   .chat-msg__actions--inline {
     display: flex;
+    position: absolute;
+    top: 0;
+    right: 0;
+    transform: translateY(-50%);
+    background: #f6f6f6;
+    border: 2px solid white;
+    border-radius: 3px;
   }
 }
\ No newline at end of file
-- 
GitLab


From 7c86648104120d0408d2f223e76576fde853f914 Mon Sep 17 00:00:00 2001
From: ubermanu <e.vodor@gmail.com>
Date: Fri, 19 Mar 2021 16:05:58 +0100
Subject: [PATCH 06/10] bugfix: remove min width

---
 src/styles/index.scss | 58 ++++++++++++++++++++++++-------------------
 1 file changed, 32 insertions(+), 26 deletions(-)

diff --git a/src/styles/index.scss b/src/styles/index.scss
index 7aa8376..a1259b8 100644
--- a/src/styles/index.scss
+++ b/src/styles/index.scss
@@ -117,22 +117,22 @@
   }
 
   /* Background when an emoji is hover*/
-  .chatbox converse-emoji-picker {
-
-    .emoji-picker__header ul li.emoji-category:hover,
-    .emoji-picker li.insert-emoji a:hover {
-      background: var(--chat-head-color);
-    }
-  }
+  //.chatbox converse-emoji-picker {
+  //
+  //  .emoji-picker__header ul li.emoji-category:hover,
+  //  .emoji-picker li.insert-emoji a:hover {
+  //    background: var(--chat-head-color);
+  //  }
+  //}
 
   /* underline underneath emoji in the emoji picker removed */
-  .chatbox converse-emoji-picker {
-
-    .emoji-picker__header ul li.emoji-category a,
-    .emoji-picker li.insert-emoji a {
-      text-decoration: none;
-    }
-  }
+  //.chatbox converse-emoji-picker {
+  //
+  //  .emoji-picker__header ul li.emoji-category a,
+  //  .emoji-picker li.insert-emoji a {
+  //    text-decoration: none;
+  //  }
+  //}
 
   /* Outline when the emoji button is selected */
   .chatbox converse-chat-toolbar button:focus {
@@ -140,10 +140,10 @@
   }
 
   /* Modal when the connection is lost*/
-  #alert-modal>.modal-dialog>.modal-content {
+  #alert-modal > .modal-dialog > .modal-content {
     top: 47px;
 
-    >div.modal-body>p {
+    > div.modal-body > p {
       color: var(--color-chat-grey-1);
     }
   }
@@ -154,7 +154,7 @@
   }
 
   /* To hide the trash icon because you can't remove a message for now */
-  >.converse-chatboxes .chat-body .chat-msg__actions>button.chat-msg__action.fa-trash-alt {
+  > .converse-chatboxes .chat-body .chat-msg__actions > button.chat-msg__action.fa-trash-alt {
     display: none;
   }
 
@@ -571,7 +571,7 @@
   }
 
   .suggestion-box .suggestion-box__results,
-  .suggestion-box>ul {
+  .suggestion-box > ul {
     box-shadow: 0 0 5px 0 rgba(133, 140, 148, 0.09);
   }
 
@@ -598,7 +598,7 @@
   converse-chat-toolbar .far:hover svg,
   converse-chat-toolbar .fas svg,
   converse-chat-toolbar .fas:hover svg {
-    fill: var(--color-secondary)!important;
+    fill: var(--color-secondary) !important;
   }
 
   .chatroom .toggle-smiley .emoji-picker.toolbar-menu .emoji-picker__container .emoji-skintone-picker,
@@ -607,14 +607,20 @@
   }
 
   &.converse-fullscreen converse-emoji-dropdown .dropdown-menu {
-    min-width: 80vw;
+    min-width: unset;
+    box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
+    border-radius: 3px;
   }
 
-  @media (min-width: 600px) {
-    &.converse-fullscreen converse-emoji-dropdown .dropdown-menu {
-      min-width: 25vw;
-    }
-  }
+  //&.converse-fullscreen converse-emoji-dropdown .dropdown-menu {
+  //  min-width: 80vw;
+  //}
+  //
+  //@media (min-width: 600px) {
+  //  &.converse-fullscreen converse-emoji-dropdown .dropdown-menu {
+  //    min-width: 25vw;
+  //  }
+  //}
 
   &.converse-fullscreen .chatroom .sendXMPPMessage .chat-toolbar .fa,
   &.converse-fullscreen .chatroom .sendXMPPMessage .chat-toolbar .fa:hover,
@@ -821,7 +827,7 @@
     background: var(--hd-hightlight-color);
   }
 
-  .suggestion-box>ul>li[aria-selected=true] {
+  .suggestion-box > ul > li[aria-selected=true] {
     background: transparent;
     color: var(--chat-suggestion-selected-true) !important;
   }
-- 
GitLab


From 0f9c49ca525e5845589a6de0cc7b4f94d39016eb Mon Sep 17 00:00:00 2001
From: ubermanu <e.vodor@gmail.com>
Date: Fri, 19 Mar 2021 16:06:36 +0100
Subject: [PATCH 07/10] focus the search input when opening the menu

---
 src/plugins/sib-emoji-picker.js | 42 +++++++++++++++++++--------------
 1 file changed, 24 insertions(+), 18 deletions(-)

diff --git a/src/plugins/sib-emoji-picker.js b/src/plugins/sib-emoji-picker.js
index d8a03ff..b2f9270 100644
--- a/src/plugins/sib-emoji-picker.js
+++ b/src/plugins/sib-emoji-picker.js
@@ -20,29 +20,36 @@ converse.plugins.add('sib-emoji-picker', {
     const EmojiDropdownMixin = {
       render() {
         return html`
-          <div class='dropup'>
-            <button class='toggle-emojis'
-                    title='${__('Insert emojis')}'
-                    data-toggle='dropdown'
-                    aria-haspopup='true'
-                    aria-expanded='false'>
-              <converse-icon
-                class='fa fa-smile '
-                path-prefix='${api.settings.get('assets_path')}'
-                size='1em'></converse-icon>
+          <div class="dropup">
+            <button class="toggle-emojis"
+                    title="${__('Insert emojis')}"
+                    data-toggle="dropdown"
+                    aria-haspopup="true"
+                    aria-expanded="false">
+              <converse-icon class="fa fa-smile"
+                             path-prefix="${api.settings.get('assets_path')}"
+                             size="1em"></converse-icon>
             </button>
-            <div class='dropdown-menu'>
-              <converse-emoji-picker
-                .chatview='${this.chatview}'
-                .model='${this.model}'
+            <div class="dropdown-menu">
+              <converse-emoji-picker .chatview="${this.chatview}"
+                                     .model="${this.model}"
               ></converse-emoji-picker>
             </div>
           </div>`;
       },
+      async showMenu() {
+        await _showMenu.apply(this, arguments);
+        setTimeout(() => {
+          // Focus the search input afterwards
+          const picker = this.querySelector('emoji-picker');
+          picker?.shadowRoot.querySelector('.search')?.focus();
+        })
+      },
     };
 
     // Apply mixin
     const EmojiDropdown = api.elements.registry['converse-emoji-dropdown'];
+    const _showMenu = EmojiDropdown.prototype.showMenu;
     Object.assign(EmojiDropdown.prototype, EmojiDropdownMixin);
 
     /**
@@ -56,10 +63,9 @@ converse.plugins.add('sib-emoji-picker', {
       },
       render() {
         return html`
-          <emoji-picker
-            .chatview='${this.chatview}'
-            .model='${this.model}'
-            @emoji-click='${ev => this.insertIntoTextArea(ev.detail.unicode)}'
+          <emoji-picker .chatview="${this.chatview}"
+                        .model="${this.model}"
+                        @emoji-click="${ev => this.insertIntoTextArea(ev.detail.unicode)}"
           ></emoji-picker>`;
       },
     };
-- 
GitLab


From 61c1e21bf182739b4f01ff49e983b03770d85256 Mon Sep 17 00:00:00 2001
From: ubermanu <e.vodor@gmail.com>
Date: Fri, 19 Mar 2021 16:38:55 +0100
Subject: [PATCH 08/10] avoid an error if the picker is not initialized

---
 src/plugins/sib-emoji-picker.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/plugins/sib-emoji-picker.js b/src/plugins/sib-emoji-picker.js
index b2f9270..1a243f6 100644
--- a/src/plugins/sib-emoji-picker.js
+++ b/src/plugins/sib-emoji-picker.js
@@ -42,8 +42,8 @@ converse.plugins.add('sib-emoji-picker', {
         setTimeout(() => {
           // Focus the search input afterwards
           const picker = this.querySelector('emoji-picker');
-          picker?.shadowRoot.querySelector('.search')?.focus();
-        })
+          picker?.shadowRoot?.querySelector('.search')?.focus();
+        });
       },
     };
 
-- 
GitLab


From ae4d6debde7de263638afa5dd56e767ba17b4c4c Mon Sep 17 00:00:00 2001
From: ubermanu <e.vodor@gmail.com>
Date: Fri, 19 Mar 2021 16:40:34 +0100
Subject: [PATCH 09/10] bugfix: register the picker element

---
 src/plugins/sib-emoji-picker.js | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/plugins/sib-emoji-picker.js b/src/plugins/sib-emoji-picker.js
index 1a243f6..0c3da68 100644
--- a/src/plugins/sib-emoji-picker.js
+++ b/src/plugins/sib-emoji-picker.js
@@ -1,4 +1,4 @@
-import 'https://cdn.skypack.dev/emoji-picker-element';
+import { Picker } from 'https://cdn.skypack.dev/emoji-picker-element';
 
 /**
  * Custom emoji picker.
@@ -13,6 +13,10 @@ converse.plugins.add('sib-emoji-picker', {
     const _converse = this._converse;
     const { api, __ } = _converse;
 
+    // Register the picker element
+    api.elements.define('emoji-picker', Picker);
+    api.elements.register();
+
     /**
      * Force rendering of the emoji picker inside the dropdown.
      * Note: Without this mixin, the IndexedDB can't be loaded for some reason.
-- 
GitLab


From eb245ac61c25ba1ef662572def755ab301a53ea1 Mon Sep 17 00:00:00 2001
From: ubermanu <e.vodor@gmail.com>
Date: Mon, 22 Mar 2021 14:49:20 +0100
Subject: [PATCH 10/10] bugfix: enforce light theme on the picker

---
 src/plugins/sib-emoji-picker.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/plugins/sib-emoji-picker.js b/src/plugins/sib-emoji-picker.js
index 0c3da68..fc4ed60 100644
--- a/src/plugins/sib-emoji-picker.js
+++ b/src/plugins/sib-emoji-picker.js
@@ -70,6 +70,7 @@ converse.plugins.add('sib-emoji-picker', {
           <emoji-picker .chatview="${this.chatview}"
                         .model="${this.model}"
                         @emoji-click="${ev => this.insertIntoTextArea(ev.detail.unicode)}"
+                        class="light"
           ></emoji-picker>`;
       },
     };
-- 
GitLab