From c62ea03e2e6269e64cd32d4138e2221d5180ed8a Mon Sep 17 00:00:00 2001 From: JC Brand Date: Fri, 19 Nov 2021 11:20:20 +0100 Subject: [PATCH] Use `converse-avatar` for roster items --- src/plugins/rosterview/constants.js | 10 ++++ src/plugins/rosterview/contactview.js | 48 +------------------ .../rosterview/templates/roster_item.js | 37 ++++++++++---- src/shared/avatar/avatar.js | 2 + src/shared/avatar/avatar.scss | 7 +++ src/shared/styles/_core.scss | 6 --- src/shared/styles/_variables.scss | 4 -- 7 files changed, 47 insertions(+), 67 deletions(-) create mode 100644 src/plugins/rosterview/constants.js create mode 100644 src/shared/avatar/avatar.scss diff --git a/src/plugins/rosterview/constants.js b/src/plugins/rosterview/constants.js new file mode 100644 index 000000000..6d96c8041 --- /dev/null +++ b/src/plugins/rosterview/constants.js @@ -0,0 +1,10 @@ +import { __ } from 'i18n'; + +export const STATUSES = { + 'dnd': __('This contact is busy'), + 'online': __('This contact is online'), + 'offline': __('This contact is offline'), + 'unavailable': __('This contact is unavailable'), + 'xa': __('This contact is away for an extended period'), + 'away': __('This contact is away') +}; diff --git a/src/plugins/rosterview/contactview.js b/src/plugins/rosterview/contactview.js index edc384ef0..f183b102e 100644 --- a/src/plugins/rosterview/contactview.js +++ b/src/plugins/rosterview/contactview.js @@ -69,53 +69,7 @@ export default class RosterContact extends CustomElement { } renderRosterItem (item) { - const STATUSES = { - 'dnd': __('This contact is busy'), - 'online': __('This contact is online'), - 'offline': __('This contact is offline'), - 'unavailable': __('This contact is unavailable'), - 'xa': __('This contact is away for an extended period'), - 'away': __('This contact is away') - }; - - const show = item.presence.get('show') || 'offline'; - let status_icon; - if (show === 'online') { - status_icon = 'fa fa-circle chat-status chat-status--online'; - } else if (show === 'away') { - status_icon = 'fa fa-circle chat-status chat-status--away'; - } else if (show === 'xa') { - status_icon = 'far fa-circle chat-status chat-status-xa'; - } else if (show === 'dnd') { - status_icon = 'fa fa-minus-circle chat-status chat-status--busy'; - } else { - status_icon = 'fa fa-times-circle chat-status chat-status--offline'; - } - const display_name = item.getDisplayName(); - return tpl_roster_item( - Object.assign(item.toJSON(), { - show, - display_name, - status_icon, - 'openChat': ev => this.openChat(ev), - 'removeContact': ev => this.removeContact(ev), - 'getAvatarData': () => this.getAvatarData(), - 'desc_status': STATUSES[show], - 'num_unread': item.get('num_unread') || 0 - }) - ); - } - - getAvatarData () { - const image_type = this.model.vcard?.get('image_type') || _converse.DEFAULT_IMAGE_TYPE; - const image_data = this.model.vcard?.get('image') || _converse.DEFAULT_IMAGE; - const image = "data:" + image_type + ";base64," + image_data; - return { - 'classes': 'avatar', - 'height': 30, - 'width': 30, - image, - }; + return tpl_roster_item(this, item); } openChat (ev) { diff --git a/src/plugins/rosterview/templates/roster_item.js b/src/plugins/rosterview/templates/roster_item.js index 1cccb5cd1..5be6c6187 100644 --- a/src/plugins/rosterview/templates/roster_item.js +++ b/src/plugins/rosterview/templates/roster_item.js @@ -1,17 +1,34 @@ import { __ } from 'i18n'; import { api } from "@converse/headless/core"; import { html } from "lit"; -import { renderAvatar } from 'shared/directives/avatar.js'; +import { STATUSES } from '../constants.js'; -export default (o) => { - const i18n_chat = __('Click to chat with %1$s (XMPP address: %2$s)', o.display_name, o.jid); - const i18n_remove = __('Click to remove %1$s as a contact', o.display_name); + +export default (el, item) => { + const show = item.presence.get('show') || 'offline'; + let status_icon; + if (show === 'online') { + status_icon = 'fa fa-circle chat-status chat-status--online'; + } else if (show === 'away') { + status_icon = 'fa fa-circle chat-status chat-status--away'; + } else if (show === 'xa') { + status_icon = 'far fa-circle chat-status chat-status-xa'; + } else if (show === 'dnd') { + status_icon = 'fa fa-minus-circle chat-status chat-status--busy'; + } else { + status_icon = 'fa fa-times-circle chat-status chat-status--offline'; + } + const display_name = item.getDisplayName(); + const desc_status = STATUSES[show]; + const num_unread = item.get('num_unread') || 0; + const i18n_chat = __('Click to chat with %1$s (XMPP address: %2$s)', display_name, el.jid); + const i18n_remove = __('Click to remove %1$s as a contact', display_name); return html` - - ${ renderAvatar(o.getAvatarData()) } - - ${ o.num_unread ? html`${ o.num_unread }` : '' } - ${o.display_name} + + + + ${ num_unread ? html`${ num_unread }` : '' } + ${display_name} - ${ api.settings.get('allow_contact_removal') ? html`` : '' }`; + ${ api.settings.get('allow_contact_removal') ? html`` : '' }`; } diff --git a/src/shared/avatar/avatar.js b/src/shared/avatar/avatar.js index 4bedf693f..bc55fe7fd 100644 --- a/src/shared/avatar/avatar.js +++ b/src/shared/avatar/avatar.js @@ -2,6 +2,8 @@ import { CustomElement } from 'shared/components/element.js'; import tpl_avatar from './templates/avatar.js'; import { _converse, api } from '@converse/headless/core'; +import './avatar.scss'; + export default class Avatar extends CustomElement { diff --git a/src/shared/avatar/avatar.scss b/src/shared/avatar/avatar.scss new file mode 100644 index 000000000..0a1d801ff --- /dev/null +++ b/src/shared/avatar/avatar.scss @@ -0,0 +1,7 @@ +converse-avatar { + border: 0; + background: transparent; + .avatar { + border-radius: var(--avatar-border-radius); + } +} diff --git a/src/shared/styles/_core.scss b/src/shared/styles/_core.scss index 5c4fba996..43d96b899 100644 --- a/src/shared/styles/_core.scss +++ b/src/shared/styles/_core.scss @@ -396,12 +396,6 @@ width: 100%; } - .avatar { - border-radius: var(--avatar-border-radius); - border: var(--avatar-border); - background-color: var(--avatar-background-color); - } - .avatar-autocomplete { margin-right: 0.5em; vertical-align: middle; diff --git a/src/shared/styles/_variables.scss b/src/shared/styles/_variables.scss index 24e1b0de2..e32a09cdc 100644 --- a/src/shared/styles/_variables.scss +++ b/src/shared/styles/_variables.scss @@ -170,8 +170,6 @@ $mobile_portrait_length: 480px !default; --embedded-emoji-picker-height: 300px; --avatar-border-radius: 10%; - --avatar-border: 1px solid lightgrey; - --avatar-background-color: white; --fullpage-chat-height: calc(var(--vh, 1vh) * 100); --fullpage-chat-width: 100%; @@ -200,8 +198,6 @@ $mobile_portrait_length: 480px !default; .conversejs.theme-concord { --avatar-border-radius: 10%; - --avatar-border: 0px; - --avatar-background-color: none; --controlbox-pane-background-color: #333; --panel-divider-color: #333;