Browse Source

Merge remote-tracking branch 'justin/feature/implement-UI-edit-reply-messages' into feature/implement-logic-edit-reply-messages

q-apps
Phillip Lang Martinez 2 years ago
parent
commit
37823e9298
  1. BIN
      img/badges/level-0.png
  2. BIN
      img/badges/level-1.png
  3. BIN
      img/badges/level-2.png
  4. BIN
      img/badges/level-3.png
  5. BIN
      img/badges/level-4.png
  6. BIN
      img/badges/level-5.png
  7. BIN
      img/qortal-chat-logo.png
  8. 16
      qortal-ui-plugins/plugins/core/components/ChatPage.js
  9. 31
      qortal-ui-plugins/plugins/core/components/ChatScroller-css.js
  10. 77
      qortal-ui-plugins/plugins/core/components/ChatScroller.js
  11. 49
      qortal-ui-plugins/plugins/core/components/LevelFounder.js
  12. 2
      qortal-ui-plugins/plugins/core/name-registration/name-registration.src.js
  13. 2
      qortal-ui-plugins/plugins/core/qdn/websites.src.js
  14. 2
      qortal-ui-plugins/plugins/core/sponsorship-list/sponsorship-list.src.js

BIN
img/badges/level-0.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

BIN
img/badges/level-1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
img/badges/level-2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

BIN
img/badges/level-3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

BIN
img/badges/level-4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

BIN
img/badges/level-5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

BIN
img/qortal-chat-logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

16
qortal-ui-plugins/plugins/core/components/ChatPage.js

@ -559,7 +559,7 @@ class ChatPage extends LitElement {
<div></div> <div></div>
</div> </div>
` : ` :
this.renderChatScroller(this._initialMessages)} this.renderChatScroller()}
<mwc-dialog <mwc-dialog
id="showDialogPublicKey" id="showDialogPublicKey"
?open=${this.imageFile} ?open=${this.imageFile}
@ -900,9 +900,9 @@ class ChatPage extends LitElement {
if (changedProperties.has('messagesRendered')) { if (changedProperties.has('messagesRendered')) {
const chatReference1 = this.isReceipient ? 'direct' : 'group'; const chatReference1 = this.isReceipient ? 'direct' : 'group';
const chatReference2 = this._chatId const chatReference2 = this._chatId
if (chatReference1 && chatReference2) { // if (chatReference1 && chatReference2) {
await messagesCache.setItem(`${chatReference1}-${chatReference2}`, this.messagesRendered); // await messagesCache.setItem(`${chatReference1}-${chatReference2}`, this.messagesRendered);
} // }
} }
if (changedProperties && changedProperties.has('editedMessageObj')) { if (changedProperties && changedProperties.has('editedMessageObj')) {
this.chatEditor.insertText(this.editedMessageObj.message) this.chatEditor.insertText(this.editedMessageObj.message)
@ -949,10 +949,9 @@ class ChatPage extends LitElement {
this.chatEditorPlaceholder = placeholder; this.chatEditorPlaceholder = placeholder;
} }
renderChatScroller(initialMessages) { renderChatScroller() {
return html` return html`
<chat-scroller <chat-scroller
.initialMessages=${initialMessages}
.messages=${this.messagesRendered} .messages=${this.messagesRendered}
.emojiPicker=${this.emojiPicker} .emojiPicker=${this.emojiPicker}
.escapeHTML=${escape} .escapeHTML=${escape}
@ -1062,8 +1061,7 @@ class ChatPage extends LitElement {
}) })
// TODO: Determine number of initial messages by screen height... // TODO: Determine number of initial messages by screen height...
this._initialMessages = this._messages; this.messagesRendered = this._messages;
this.messagesRendered = this._initialMessages;
this.isLoadingMessages = false; this.isLoadingMessages = false;
setTimeout(() => this.downElementObserver(), 500); setTimeout(() => this.downElementObserver(), 500);
} else { } else {
@ -1189,7 +1187,7 @@ class ChatPage extends LitElement {
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
const avatarUrl = `${nodeUrl}/arbitrary/THUMBNAIL/${messageObj.senderName}/qortal_avatar?async=true&apiKey=${myNode.apiKey}` const avatarUrl = `${nodeUrl}/arbitrary/THUMBNAIL/${messageObj.senderName}/qortal_avatar?async=true&apiKey=${myNode.apiKey}`
avatarImg = `<img src="${avatarUrl}" style="max-width:100%; max-height:100%;" onerror="this.onerror=null; this.src='/img/incognito.png';" />` avatarImg = `<img src="${avatarUrl}" style="max-width:100%; max-height:100%;" onerror="this.onerror=null; this.src='/img/qortal-chat-logo.png';" />`
} }
if (messageObj.sender === this.myAddress) { if (messageObj.sender === this.myAddress) {

31
qortal-ui-plugins/plugins/core/components/ChatScroller-css.js

@ -93,19 +93,32 @@ export const chatStyles = css`
} }
.message-data-time { .message-data-time {
color: #a8aab1; color: #888888;
font-size: 13px; font-size: 13px;
padding-left: 6px;
padding-bottom: 4px;
user-select: none; user-select: none;
float: right;
padding-left: 15px;
padding-bottom: 3px;
transform: translateY(10px);
} }
.message-data-level { .message-data-time-hidden {
color: #03a9f4; visibility: hidden;
transition: all 0.1s ease-in-out;
color: #888888;
font-size: 13px; font-size: 13px;
padding-left: 8px;
padding-bottom: 4px;
user-select: none; user-select: none;
float: right;
padding-left: 15px;
padding-bottom: 3px;
transform: translateY(10px);
}
.message-user-info {
display: flex;
justify-content: space-between;
width: 100%;
gap: 10px;
} }
.chat-bubble-container { .chat-bubble-container {
@ -231,6 +244,10 @@ export const chatStyles = css`
display: block; display: block;
} }
.message-parent:hover .message-data-time-hidden {
visibility: visible;
}
.chat-hover { .chat-hover {
display: none; display: none;
position: absolute; position: absolute;

77
qortal-ui-plugins/plugins/core/components/ChatScroller.js

@ -14,8 +14,7 @@ import '@material/mwc-button';
import '@material/mwc-dialog'; import '@material/mwc-dialog';
import '@material/mwc-icon'; import '@material/mwc-icon';
import { EmojiPicker } from 'emoji-picker-js'; import { EmojiPicker } from 'emoji-picker-js';
import {cropAddress} from "../../utils/cropAddress"; import { cropAddress } from "../../utils/cropAddress";
const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) const parentEpml = new Epml({ type: 'WINDOW', source: window.parent })
class ChatScroller extends LitElement { class ChatScroller extends LitElement {
@ -25,7 +24,6 @@ class ChatScroller extends LitElement {
getOldMessage: { attribute: false }, getOldMessage: { attribute: false },
emojiPicker: { attribute: false }, emojiPicker: { attribute: false },
escapeHTML: { attribute: false }, escapeHTML: { attribute: false },
initialMessages: { type: Array }, // First set of messages to load.. 15 messages max ( props )
messages: { type: Array }, messages: { type: Array },
hideMessages: { type: Array }, hideMessages: { type: Array },
setRepliedToMessageObj: { type: Function }, setRepliedToMessageObj: { type: Function },
@ -50,27 +48,27 @@ class ChatScroller extends LitElement {
render() { render() {
console.log({messages: this.messages}) console.log({messages: this.messages})
let formattedMessages = this.messages.reduce((messageArray, message)=> { let formattedMessages = this.messages.reduce((messageArray, message) => {
const lastGroupedMessage = messageArray[messageArray.length - 1] const lastGroupedMessage = messageArray[messageArray.length - 1];
let timestamp let timestamp;
let sender let sender;
let repliedToData let repliedToData;
if(lastGroupedMessage){ if (lastGroupedMessage) {
timestamp = lastGroupedMessage.timestamp timestamp = lastGroupedMessage.timestamp;
sender = lastGroupedMessage.sender sender = lastGroupedMessage.sender;
repliedToData = lastGroupedMessage.repliedToData repliedToData = lastGroupedMessage.repliedToData;
} }
const isSameGroup = Math.abs(timestamp - message.timestamp) < 600000 && sender === message.sender && !repliedToData const isSameGroup = Math.abs(timestamp - message.timestamp) < 600000 && sender === message.sender && !repliedToData;
if(isSameGroup){ if (isSameGroup) {
messageArray[messageArray.length - 1].messages = [...(messageArray[messageArray.length - 1]?.messages || []), message] messageArray[messageArray.length - 1].messages = [...(messageArray[messageArray.length - 1]?.messages || []), message];
} else { } else {
messageArray.push({ messageArray.push({
messages: [message], messages: [message],
...message ...message
}) });
} }
return messageArray return messageArray;
}, []) }, [])
return html` return html`
@ -248,8 +246,7 @@ class MessageTemplate extends LitElement {
} }
render() { render() {
const parsedMessageObj = JSON.parse(this.messageObj.decodedMessage); console.log(this.messageObj);
console.log({isFirstMessage: this.isFirstMessage, isSingleMessageInGroup: this.isSingleMessageInGroup, isLastMessageInGroup: this.isLastMessageInGroup, messageText: parsedMessageObj.messageText})
const hidemsg = this.hideMessages; const hidemsg = this.hideMessages;
let message = ""; let message = "";
let reactions = []; let reactions = [];
@ -282,9 +279,9 @@ class MessageTemplate extends LitElement {
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]; const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node];
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port; const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port;
const avatarUrl = `${nodeUrl}/arbitrary/THUMBNAIL/${this.messageObj.senderName}/qortal_avatar?async=true&apiKey=${myNode.apiKey}`; const avatarUrl = `${nodeUrl}/arbitrary/THUMBNAIL/${this.messageObj.senderName}/qortal_avatar?async=true&apiKey=${myNode.apiKey}`;
avatarImg = html`<img src="${avatarUrl}" style="max-width:100%; max-height:100%;" onerror="this.onerror=null; this.src='/img/incognito.png';" />`; avatarImg = html`<img src="${avatarUrl}" style="max-width:100%; max-height:100%;" onerror="this.onerror=null; this.src='/img/qortal-chat-logo.png';" />`;
} else { } else {
avatarImg = html`<img src='/img/incognito.png' style="max-width:100%; max-height:100%;" onerror="this.onerror=null;" />` avatarImg = html`<img src='/img/qortal-chat-logo.png' style="max-width:100%; max-height:100%;" onerror="this.onerror=null;" />`
} }
const createImage = (imageUrl) => { const createImage = (imageUrl) => {
@ -348,14 +345,6 @@ class MessageTemplate extends LitElement {
'padding-bottom: 0;' 'padding-bottom: 0;'
: null} : null}
${this.isFirstMessage && 'margin-top: 20px;'}"> ${this.isFirstMessage && 'margin-top: 20px;'}">
${this.isFirstMessage ? (
html`
<div class="message-data ${this.messageObj.sender === this.myAddress ? "" : ""}">
<span class="message-data-level">${levelFounder}</span>
<span class="message-data-time"><message-time timestamp=${this.messageObj.timestamp}></message-time></span>
</div>
`
) : null}
<div> <div>
<div <div
class="message-container" class="message-container"
@ -385,10 +374,11 @@ class MessageTemplate extends LitElement {
? 'border-radius: 27px 25px 25px 12px;' ? 'border-radius: 27px 25px 25px 12px;'
: (this.isFirstMessage === false && this.isSingleMessageInGroup === true && this.isLastMessageInGroup === true) ? : (this.isFirstMessage === false && this.isSingleMessageInGroup === true && this.isLastMessageInGroup === true) ?
'border-radius: 10px 25px 25px 0;' 'border-radius: 10px 25px 25px 0;'
: this.isFirstMessage === true : (this.isFirstMessage === true && this.isSingleMessageInGroup === false && this.isLastMessageInGroup === true)
? 'border-radius: 25px 25px 25px 0px;' ? 'border-radius: 25px 25px 25px 0px;'
: null : null
}"> }">
<div class="message-user-info">
${this.isFirstMessage ? ${this.isFirstMessage ?
html` html`
<span class="message-data-name"> <span class="message-data-name">
@ -397,6 +387,12 @@ class MessageTemplate extends LitElement {
` `
: null : null
} }
${this.isFirstMessage ? (
html`
<span class="message-data-level">${levelFounder}</span>
`
) : null}
</div>
${repliedToData && html` ${repliedToData && html`
<div class="original-message"> <div class="original-message">
<p class="original-message-sender"> <p class="original-message-sender">
@ -421,12 +417,23 @@ class MessageTemplate extends LitElement {
` : html``} ` : html``}
<div id="messageContent" class="message"> <div id="messageContent" class="message">
${unsafeHTML(this.emojiPicker.parse(replacedMessage))} ${unsafeHTML(this.emojiPicker.parse(replacedMessage))}
<div class="${((this.isFirstMessage === false &&
this.isSingleMessageInGroup === true &&
this.isLastMessageInGroup === true) ||
(this.isFirstMessage === true &&
this.isSingleMessageInGroup === false &&
this.isLastMessageInGroup === true))
? 'message-data-time'
: 'message-data-time-hidden'
}">
<message-time timestamp=${this.messageObj.timestamp}></message-time>
</div>
</div> </div>
</div> </div>
<chat-menu <chat-menu
tabindex="0" tabindex="0"
class="chat-hover" class="chat-hover"
style="${this.showBlockAddressIcon ? 'display: block;' : null} ${this.isFirstMessage && 'top: -50px'}" style="${this.showBlockAddressIcon && 'display: block;'}"
toblockaddress="${this.messageObj.sender}" toblockaddress="${this.messageObj.sender}"
.showPrivateMessageModal=${() => this.showPrivateMessageModal()} .showPrivateMessageModal=${() => this.showPrivateMessageModal()}
.showBlockUserModal=${() => this.showBlockUserModal()} .showBlockUserModal=${() => this.showBlockUserModal()}
@ -538,9 +545,7 @@ class ChatMenu extends LitElement {
} }
} }
firstUpdated () {
firstUpdated(){
this.emojiPicker = new EmojiPicker({ this.emojiPicker = new EmojiPicker({
style: "twemoji", style: "twemoji",
twemojiBaseUrl: '/emoji/', twemojiBaseUrl: '/emoji/',
@ -559,13 +564,9 @@ class ChatMenu extends LitElement {
}) })
}); });
} }
render() { render() {
return html` return html`
<div class="container"> <div class="container">

49
qortal-ui-plugins/plugins/core/components/LevelFounder.js

@ -48,32 +48,42 @@ class LevelFounder extends LitElement {
font-weight: 400; font-weight: 400;
} }
.level {
position: relative;
display: inline;
}
.custom { .custom {
--paper-tooltip-background: #03a9f4; --paper-tooltip-background: #03a9f4;
--paper-tooltip-text-color: #fff; --paper-tooltip-text-color: #fff;
} }
.level-img-tooltip {
--paper-tooltip-background: #000000;
--paper-tooltip-text-color: #fff;
--paper-tooltip-delay-in: 300;
--paper-tooltip-delay-out: 3000;
}
.message-data {
display: flex;
justify-content: center;
gap: 5px;
}
.message-data-level {
width: 20px;
height: 20px;
}
.badge { .badge {
align-items: center; align-items: center;
background: #03a9f4; background: rgb(3, 169, 244);
border: 1px solid transparent; border: 1px solid transparent;
border-radius: 99em; border-radius: 50%;
color: #fff; color: rgb(255, 255, 255);
display: flex; display: flex;
font-size: 10px; font-size: 10px;
font-weight: 400; font-weight: 400;
height: 12px; height: 12px;
width: 12px;
justify-content: center; justify-content: center;
line-height: 1;
min-width: 12px;
position: absolute;
left: -16px;
top: -12px;
cursor: pointer; cursor: pointer;
} }
` `
@ -87,7 +97,7 @@ class LevelFounder extends LitElement {
render() { render() {
return html` return html`
<div class="level"> <div class="message-data">
${this.renderFounder()} ${this.renderFounder()}
${this.renderLevel()} ${this.renderLevel()}
</div> </div>
@ -135,21 +145,24 @@ class LevelFounder extends LitElement {
} }
renderFounder() { renderFounder() {
let adressfounder = this.memberInfo.flags let adressfounder = this.memberInfo.flags;
if (adressfounder === 1) { if (adressfounder === 1) {
return html ` return html `
<span id="founderTooltip" class="badge">F</span> <span id="founderTooltip" class="badge">F</span>
<paper-tooltip class="custom" for="founderTooltip" position="top">FOUNDER</paper-tooltip> <paper-tooltip class="custom" for="founderTooltip" position="top">FOUNDER</paper-tooltip>
` `
} else { } else {
return html `` return null;
} }
} }
renderLevel() { renderLevel() {
let adresslevel = this.memberInfo.level let adresslevel = this.memberInfo.level;
return html ` return html `
<span id="levelTooltip">${translate("mintingpage.mchange27")} ${adresslevel}</span> <img id="level-img" src=${`/img/badges/level-${adresslevel}.png`} alt=${`badge-${adresslevel}`} class="message-data-level" />
<paper-tooltip class="level-img-tooltip" for="level-img" position="top" >
${translate("mintingpage.mchange27")} ${adresslevel}
</paper-tooltip>
` `
} }

2
qortal-ui-plugins/plugins/core/name-registration/name-registration.src.js

@ -272,7 +272,7 @@ class NameRegistration extends LitElement {
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
const url = `${nodeUrl}/arbitrary/THUMBNAIL/${name}/qortal_avatar?async=true&apiKey=${this.getApiKey()}`; const url = `${nodeUrl}/arbitrary/THUMBNAIL/${name}/qortal_avatar?async=true&apiKey=${this.getApiKey()}`;
return html`<img src="${url}" onerror="this.onerror=null; this.src='/img/incognito.png';">` return html`<img src="${url}" onerror="this.onerror=null; this.src='/img/qortal-chat-logo.png';">`
} }
renderAvatarButton(nameObj) { renderAvatarButton(nameObj) {

2
qortal-ui-plugins/plugins/core/qdn/websites.src.js

@ -703,7 +703,7 @@ class Websites extends LitElement {
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
const url = `${nodeUrl}/arbitrary/THUMBNAIL/${name}/qortal_avatar?async=true&apiKey=${this.getApiKey()}` const url = `${nodeUrl}/arbitrary/THUMBNAIL/${name}/qortal_avatar?async=true&apiKey=${this.getApiKey()}`
return html`<a class="visitSite" href="browser/index.html?name=${name}&service=${this.service}"><img src="${url}" onerror="this.src='/img/incognito.png';"></a>` return html`<a class="visitSite" href="browser/index.html?name=${name}&service=${this.service}"><img src="${url}" onerror="this.src='/img/qortal-chat-logo.png';"></a>`
} }
renderRelayModeText() { renderRelayModeText() {

2
qortal-ui-plugins/plugins/core/sponsorship-list/sponsorship-list.src.js

@ -534,7 +534,7 @@ class SponsorshipList extends LitElement {
${sponsorship?.name ? html` ${sponsorship?.name ? html`
<img src=${sponsorship.url} <img src=${sponsorship.url}
class="avatar-img" class="avatar-img"
onerror="this.src='/img/incognito.png'" onerror="this.src='/img/qortal-chat-logo.png'"
/> />
` : ''} ` : ''}
${sponsorship?.name || sponsorship.address} ${sponsorship?.name || sponsorship.address}

Loading…
Cancel
Save