|
|
@ -14,6 +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"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) |
|
|
|
const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) |
|
|
@ -75,9 +76,8 @@ class ChatScroller extends LitElement { |
|
|
|
return html` |
|
|
|
return html` |
|
|
|
<ul id="viewElement" class="chat-list clearfix"> |
|
|
|
<ul id="viewElement" class="chat-list clearfix"> |
|
|
|
<div id="upObserver"></div> |
|
|
|
<div id="upObserver"></div> |
|
|
|
${formattedMessages.map((formattedMessage)=> { |
|
|
|
${formattedMessages.map((formattedMessage) => { |
|
|
|
|
|
|
|
return repeat( |
|
|
|
return repeat( |
|
|
|
|
|
|
|
formattedMessage.messages, |
|
|
|
formattedMessage.messages, |
|
|
|
(message) => message.reference, |
|
|
|
(message) => message.reference, |
|
|
|
(message, indexMessage) => html` |
|
|
|
(message, indexMessage) => html` |
|
|
@ -90,13 +90,13 @@ return repeat( |
|
|
|
.setEditedMessageObj=${this.setEditedMessageObj} |
|
|
|
.setEditedMessageObj=${this.setEditedMessageObj} |
|
|
|
.focusChatEditor=${this.focusChatEditor} |
|
|
|
.focusChatEditor=${this.focusChatEditor} |
|
|
|
.sendMessage=${this.sendMessage} |
|
|
|
.sendMessage=${this.sendMessage} |
|
|
|
?isfirstmessage=${indexMessage === 0} |
|
|
|
?isFirstMessage=${indexMessage === 0} |
|
|
|
?isSingleMessageInGroup=${formattedMessage.messages.length > 1} |
|
|
|
?isSingleMessageInGroup=${formattedMessage.messages.length > 1} |
|
|
|
|
|
|
|
?isLastMessageInGroup=${indexMessage === formattedMessage.messages.length - 1} |
|
|
|
> |
|
|
|
> |
|
|
|
</message-template>` |
|
|
|
</message-template>` |
|
|
|
) |
|
|
|
) |
|
|
|
})} |
|
|
|
})} |
|
|
|
|
|
|
|
|
|
|
|
<div id='downObserver'></div> |
|
|
|
<div id='downObserver'></div> |
|
|
|
<div class='last-message-ref'> |
|
|
|
<div class='last-message-ref'> |
|
|
|
<vaadin-icon class='arrow-down-icon' icon='vaadin:arrow-circle-down' slot='icon' @click=${() => { |
|
|
|
<vaadin-icon class='arrow-down-icon' icon='vaadin:arrow-circle-down' slot='icon' @click=${() => { |
|
|
@ -195,10 +195,11 @@ class MessageTemplate extends LitElement { |
|
|
|
setEditedMessageObj: { type: Function }, |
|
|
|
setEditedMessageObj: { type: Function }, |
|
|
|
focusChatEditor: { type: Function }, |
|
|
|
focusChatEditor: { type: Function }, |
|
|
|
sendMessage: { type: Function }, |
|
|
|
sendMessage: { type: Function }, |
|
|
|
openDialogImage: {type: Function}, |
|
|
|
openDialogImage: { type: Function }, |
|
|
|
isImageLoaded: {type: Boolean}, |
|
|
|
isImageLoaded: { type: Boolean }, |
|
|
|
isFirstMessage: {type: Boolean}, |
|
|
|
isFirstMessage: { type: Boolean }, |
|
|
|
isSingleMessageInGroup: {type: Boolean} |
|
|
|
isSingleMessageInGroup: { type: Boolean }, |
|
|
|
|
|
|
|
isLastMessageInGroup: { type: Boolean }, |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -214,6 +215,7 @@ class MessageTemplate extends LitElement { |
|
|
|
this.isImageLoaded = false |
|
|
|
this.isImageLoaded = false |
|
|
|
this.isFirstMessage = false |
|
|
|
this.isFirstMessage = false |
|
|
|
this.isSingleMessageInGroup = false |
|
|
|
this.isSingleMessageInGroup = false |
|
|
|
|
|
|
|
this.isLastMessageInGroup = false |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static styles = [chatStyles] |
|
|
|
static styles = [chatStyles] |
|
|
@ -245,21 +247,22 @@ class MessageTemplate extends LitElement { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
render() { |
|
|
|
render() { |
|
|
|
const hidemsg = this.hideMessages |
|
|
|
const parsedMessageObj = JSON.parse(this.messageObj.decodedMessage); |
|
|
|
let message = "" |
|
|
|
console.log({isFirstMessage: this.isFirstMessage, isSingleMessageInGroup: this.isSingleMessageInGroup, isLastMessageInGroup: this.isLastMessageInGroup, messageText: parsedMessageObj.messageText}) |
|
|
|
let reactions = [] |
|
|
|
const hidemsg = this.hideMessages; |
|
|
|
let repliedToData = null |
|
|
|
let message = ""; |
|
|
|
let image = null |
|
|
|
let reactions = []; |
|
|
|
let isImageDeleted = false |
|
|
|
let repliedToData = null; |
|
|
|
|
|
|
|
let image = null; |
|
|
|
|
|
|
|
let isImageDeleted = false; |
|
|
|
try { |
|
|
|
try { |
|
|
|
const parsedMessageObj = JSON.parse(this.messageObj.decodedMessage); |
|
|
|
const parsedMessageObj = JSON.parse(this.messageObj.decodedMessage); |
|
|
|
message = parsedMessageObj.messageText; |
|
|
|
message = parsedMessageObj.messageText; |
|
|
|
repliedToData = this.messageObj.repliedToData; |
|
|
|
repliedToData = this.messageObj.repliedToData; |
|
|
|
isImageDeleted = parsedMessageObj.isImageDeleted; |
|
|
|
isImageDeleted = parsedMessageObj.isImageDeleted; |
|
|
|
reactions = parsedMessageObj.reactions || []; |
|
|
|
reactions = parsedMessageObj.reactions || []; |
|
|
|
if(parsedMessageObj.images && Array.isArray(parsedMessageObj.images) && parsedMessageObj.images.length > 0){ |
|
|
|
if (parsedMessageObj.images && Array.isArray(parsedMessageObj.images) && parsedMessageObj.images.length > 0) { |
|
|
|
image = parsedMessageObj.images[0]; |
|
|
|
image = parsedMessageObj.images[0]; |
|
|
|
} |
|
|
|
} |
|
|
|
} catch (error) { |
|
|
|
} catch (error) { |
|
|
@ -284,19 +287,19 @@ class MessageTemplate extends LitElement { |
|
|
|
avatarImg = html`<img src='/img/incognito.png' style="max-width:100%; max-height:100%;" onerror="this.onerror=null;" />` |
|
|
|
avatarImg = html`<img src='/img/incognito.png' style="max-width:100%; max-height:100%;" onerror="this.onerror=null;" />` |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const createImage=(imageUrl)=>{ |
|
|
|
const createImage = (imageUrl) => { |
|
|
|
const imageHTMLRes = new Image(); |
|
|
|
const imageHTMLRes = new Image(); |
|
|
|
imageHTMLRes.src = imageUrl; |
|
|
|
imageHTMLRes.src = imageUrl; |
|
|
|
imageHTMLRes.style= "max-width:45vh; max-height:40vh; border-radius: 5px; cursor: pointer"; |
|
|
|
imageHTMLRes.style= "max-width:45vh; max-height:40vh; border-radius: 5px; cursor: pointer"; |
|
|
|
imageHTMLRes.onclick= () => { |
|
|
|
imageHTMLRes.onclick= () => { |
|
|
|
this.openDialogImage = true |
|
|
|
this.openDialogImage = true; |
|
|
|
} |
|
|
|
} |
|
|
|
imageHTMLRes.onload = ()=> { |
|
|
|
imageHTMLRes.onload = () => { |
|
|
|
this.isImageLoaded = true |
|
|
|
this.isImageLoaded = true; |
|
|
|
} |
|
|
|
} |
|
|
|
imageHTMLRes.onerror = ()=> {
|
|
|
|
imageHTMLRes.onerror = () => {
|
|
|
|
if (this.imageFetches < 4) { |
|
|
|
if (this.imageFetches < 4) { |
|
|
|
setTimeout(()=> { |
|
|
|
setTimeout(() => { |
|
|
|
this.imageFetches = this.imageFetches + 1; |
|
|
|
this.imageFetches = this.imageFetches + 1; |
|
|
|
imageHTMLRes.src = imageUrl; |
|
|
|
imageHTMLRes.src = imageUrl; |
|
|
|
}, 500); |
|
|
|
}, 500); |
|
|
@ -321,11 +324,12 @@ class MessageTemplate extends LitElement { |
|
|
|
imageHTMLDialog.style= "height: auto; max-height: 80vh; width: auto; max-width: 80vw; object-fit: contain; border-radius: 5px"; |
|
|
|
imageHTMLDialog.style= "height: auto; max-height: 80vh; width: auto; max-width: 80vw; object-fit: contain; border-radius: 5px"; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (this.messageObj.sender === this.myAddress) { |
|
|
|
nameMenu = html` |
|
|
|
nameMenu = html`<span style="color: #03a9f4;">${this.messageObj.senderName ? this.messageObj.senderName : this.messageObj.sender}</span>`; |
|
|
|
<span class="${this.messageObj.sender === this.myAddress && 'message-data-my-name'}"> |
|
|
|
} else { |
|
|
|
${this.messageObj.senderName ? this.messageObj.senderName : cropAddress(this.messageObj.sender)} |
|
|
|
nameMenu = html`<span>${this.messageObj.senderName ? this.messageObj.senderName : this.messageObj.sender}</span>`; |
|
|
|
</span> |
|
|
|
} |
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
|
|
if (repliedToData) { |
|
|
|
if (repliedToData) { |
|
|
|
try { |
|
|
|
try { |
|
|
|
const parsedMsg = JSON.parse(repliedToData.decodedMessage); |
|
|
|
const parsedMsg = JSON.parse(repliedToData.decodedMessage); |
|
|
@ -338,21 +342,69 @@ class MessageTemplate extends LitElement { |
|
|
|
const replacedMessage = escapedMessage.replace(new RegExp('\r?\n','g'), '<br />'); |
|
|
|
const replacedMessage = escapedMessage.replace(new RegExp('\r?\n','g'), '<br />'); |
|
|
|
|
|
|
|
|
|
|
|
return hideit ? html`<li class="clearfix"></li>` : html` |
|
|
|
return hideit ? html`<li class="clearfix"></li>` : html` |
|
|
|
<li class="clearfix message-parent"> |
|
|
|
<li
|
|
|
|
|
|
|
|
class="clearfix message-parent"
|
|
|
|
|
|
|
|
style="${(this.isSingleMessageInGroup === true && this.isLastMessageInGroup === false && reactions.length === 0) ?
|
|
|
|
|
|
|
|
'padding-bottom: 0;'
|
|
|
|
|
|
|
|
: null}
|
|
|
|
|
|
|
|
${this.isFirstMessage && 'margin-top: 20px;'}"> |
|
|
|
|
|
|
|
${this.isFirstMessage ? ( |
|
|
|
|
|
|
|
html` |
|
|
|
<div class="message-data ${this.messageObj.sender === this.myAddress ? "" : ""}"> |
|
|
|
<div class="message-data ${this.messageObj.sender === this.myAddress ? "" : ""}"> |
|
|
|
<span class="message-data-name">${nameMenu}</span> |
|
|
|
|
|
|
|
<span class="message-data-level">${levelFounder}</span> |
|
|
|
<span class="message-data-level">${levelFounder}</span> |
|
|
|
<span class="message-data-time"><message-time timestamp=${this.messageObj.timestamp}></message-time></span> |
|
|
|
<span class="message-data-time"><message-time timestamp=${this.messageObj.timestamp}></message-time></span> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
` |
|
|
|
|
|
|
|
) : null} |
|
|
|
|
|
|
|
<div> |
|
|
|
|
|
|
|
<div
|
|
|
|
|
|
|
|
class="message-container"
|
|
|
|
|
|
|
|
style="${(this.isSingleMessageInGroup === true && this.isLastMessageInGroup === false) && 'margin-bottom: 0'}"> |
|
|
|
|
|
|
|
<div class="message-subcontainer1"> |
|
|
|
|
|
|
|
${(this.isSingleMessageInGroup === false ||
|
|
|
|
|
|
|
|
(this.isSingleMessageInGroup === true && this.isLastMessageInGroup === true))
|
|
|
|
|
|
|
|
? ( |
|
|
|
|
|
|
|
html` |
|
|
|
<div class="message-data-avatar"> |
|
|
|
<div class="message-data-avatar"> |
|
|
|
${avatarImg} |
|
|
|
${avatarImg} |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div class="message-container"> |
|
|
|
` |
|
|
|
<div class="message-subcontainer"> |
|
|
|
) :
|
|
|
|
|
|
|
|
html` |
|
|
|
|
|
|
|
<div class="message-data-avatar"></div> |
|
|
|
|
|
|
|
`}
|
|
|
|
|
|
|
|
<div
|
|
|
|
|
|
|
|
class="${`message-subcontainer2
|
|
|
|
|
|
|
|
${((this.isFirstMessage === true && this.isSingleMessageInGroup === false) ||
|
|
|
|
|
|
|
|
(this.isSingleMessageInGroup === true && this.isLastMessageInGroup === true)) &&
|
|
|
|
|
|
|
|
'message-triangle'}`}"
|
|
|
|
|
|
|
|
style="${(this.isSingleMessageInGroup === true && this.isLastMessageInGroup === false) ? 'margin-bottom: 0;' : null} |
|
|
|
|
|
|
|
${(this.isFirstMessage === false && this.isSingleMessageInGroup === true && this.isLastMessageInGroup === false) |
|
|
|
|
|
|
|
? 'border-radius: 8px 25px 25px 8px;' |
|
|
|
|
|
|
|
: (this.isFirstMessage === true && this.isSingleMessageInGroup === true && this.isLastMessageInGroup === false)
|
|
|
|
|
|
|
|
? 'border-radius: 27px 25px 25px 12px;' |
|
|
|
|
|
|
|
: (this.isFirstMessage === false && this.isSingleMessageInGroup === true && this.isLastMessageInGroup === true) ?
|
|
|
|
|
|
|
|
'border-radius: 10px 25px 25px 0;'
|
|
|
|
|
|
|
|
: this.isFirstMessage === true
|
|
|
|
|
|
|
|
? 'border-radius: 25px 25px 25px 0px;' |
|
|
|
|
|
|
|
: null |
|
|
|
|
|
|
|
}"> |
|
|
|
|
|
|
|
${this.isFirstMessage ?
|
|
|
|
|
|
|
|
html` |
|
|
|
|
|
|
|
<span class="message-data-name"> |
|
|
|
|
|
|
|
${nameMenu} |
|
|
|
|
|
|
|
</span> |
|
|
|
|
|
|
|
` |
|
|
|
|
|
|
|
: null |
|
|
|
|
|
|
|
} |
|
|
|
${repliedToData && html` |
|
|
|
${repliedToData && html` |
|
|
|
<div class="original-message"> |
|
|
|
<div class="original-message"> |
|
|
|
<p class="original-message-sender">${repliedToData.sendName ?? repliedToData.sender}</p> |
|
|
|
<p class="original-message-sender"> |
|
|
|
<p class="replied-message">${repliedToData.decodedMessage.messageText}</p> |
|
|
|
${repliedToData.sendName ?? cropAddress(repliedToData.sender)} |
|
|
|
|
|
|
|
</p> |
|
|
|
|
|
|
|
<p class="replied-message"> |
|
|
|
|
|
|
|
${repliedToData.decodedMessage.messageText} |
|
|
|
|
|
|
|
</p> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
`}
|
|
|
|
`}
|
|
|
|
${image && !isImageDeleted ? html` |
|
|
|
${image && !isImageDeleted ? html` |
|
|
@ -371,24 +423,10 @@ class MessageTemplate extends LitElement { |
|
|
|
${unsafeHTML(this.emojiPicker.parse(replacedMessage))} |
|
|
|
${unsafeHTML(this.emojiPicker.parse(replacedMessage))} |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div class="message-reactions"> |
|
|
|
|
|
|
|
${reactions.map((reaction)=> { |
|
|
|
|
|
|
|
return html` |
|
|
|
|
|
|
|
<span
|
|
|
|
|
|
|
|
@click=${() => this.sendMessage({ |
|
|
|
|
|
|
|
type: 'reaction', |
|
|
|
|
|
|
|
editedMessageObj: this.messageObj, |
|
|
|
|
|
|
|
reaction: reaction.type, |
|
|
|
|
|
|
|
})}
|
|
|
|
|
|
|
|
class="reactions-bg"> |
|
|
|
|
|
|
|
${reaction.type} ${reaction.qty} |
|
|
|
|
|
|
|
</span>` |
|
|
|
|
|
|
|
})} |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<chat-menu
|
|
|
|
<chat-menu
|
|
|
|
tabindex="0" |
|
|
|
tabindex="0" |
|
|
|
class="chat-hover" |
|
|
|
class="chat-hover" |
|
|
|
style=${this.showBlockAddressIcon && "display: block"} |
|
|
|
style="${this.showBlockAddressIcon ? 'display: block;' : null} ${this.isFirstMessage && 'top: -50px'}" |
|
|
|
toblockaddress="${this.messageObj.sender}"
|
|
|
|
toblockaddress="${this.messageObj.sender}"
|
|
|
|
.showPrivateMessageModal=${() => this.showPrivateMessageModal()} |
|
|
|
.showPrivateMessageModal=${() => this.showPrivateMessageModal()} |
|
|
|
.showBlockUserModal=${() => this.showBlockUserModal()} |
|
|
|
.showBlockUserModal=${() => this.showBlockUserModal()} |
|
|
@ -404,6 +442,23 @@ class MessageTemplate extends LitElement { |
|
|
|
>
|
|
|
|
>
|
|
|
|
</chat-menu> |
|
|
|
</chat-menu> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<div class="message-reactions" style="${reactions.length > 0 &&
|
|
|
|
|
|
|
|
'margin-top: 10px; margin-bottom: 5px;'}"> |
|
|
|
|
|
|
|
${reactions.map((reaction)=> { |
|
|
|
|
|
|
|
return html` |
|
|
|
|
|
|
|
<span
|
|
|
|
|
|
|
|
@click=${() => this.sendMessage({ |
|
|
|
|
|
|
|
type: 'reaction', |
|
|
|
|
|
|
|
editedMessageObj: this.messageObj, |
|
|
|
|
|
|
|
reaction: reaction.type, |
|
|
|
|
|
|
|
})}
|
|
|
|
|
|
|
|
class="reactions-bg"> |
|
|
|
|
|
|
|
${reaction.type} ${reaction.qty} |
|
|
|
|
|
|
|
</span>` |
|
|
|
|
|
|
|
})} |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</li> |
|
|
|
</li> |
|
|
|
<chat-modals
|
|
|
|
<chat-modals
|
|
|
|