added reactions

This commit is contained in:
Phillip Lang Martinez 2022-10-30 01:00:31 +03:00
parent ce7eb44197
commit b73b9a0ab2
3 changed files with 123 additions and 14 deletions

View File

@ -315,7 +315,6 @@ class ChatPage extends LitElement {
// Attach Event Handler // Attach Event Handler
this.emojiPickerHandler.addEventListener('click', () => this.emojiPicker.togglePicker(this.emojiPickerHandler)); this.emojiPickerHandler.addEventListener('click', () => this.emojiPicker.togglePicker(this.emojiPickerHandler));
window.addEventListener('storage', () => { window.addEventListener('storage', () => {
const checkLanguage = localStorage.getItem('qortalLanguage') const checkLanguage = localStorage.getItem('qortalLanguage')
use(checkLanguage) use(checkLanguage)
@ -429,6 +428,7 @@ class ChatPage extends LitElement {
.setRepliedToMessageObj=${(val) => this.setRepliedToMessageObj(val)} .setRepliedToMessageObj=${(val) => this.setRepliedToMessageObj(val)}
.setEditedMessageObj=${(val) => this.setEditedMessageObj(val)} .setEditedMessageObj=${(val) => this.setEditedMessageObj(val)}
.focusChatEditor=${() => this.focusChatEditor()} .focusChatEditor=${() => this.focusChatEditor()}
.sendMessage=${(val)=> this._sendMessage(val)}
> >
</chat-scroller>` </chat-scroller>`
} }
@ -991,7 +991,7 @@ class ChatPage extends LitElement {
// Add to the messages... TODO: Save messages to localstorage and fetch from it to make it persistent... // Add to the messages... TODO: Save messages to localstorage and fetch from it to make it persistent...
} }
_sendMessage() { _sendMessage(outSideMsg) {
// have params to determine if it's a reply or not // have params to determine if it's a reply or not
// have variable to determine if it's a response, holds signature in constructor // have variable to determine if it's a response, holds signature in constructor
// need original message signature // need original message signature
@ -1007,9 +1007,58 @@ class ChatPage extends LitElement {
const sanitizedMessage = messageText.replace(/&nbsp;/gi, ' ').replace(/<br\s*[\/]?>/gi, '\n'); const sanitizedMessage = messageText.replace(/&nbsp;/gi, ' ').replace(/<br\s*[\/]?>/gi, '\n');
const trimmedMessage = sanitizedMessage.trim(); const trimmedMessage = sanitizedMessage.trim();
if(outSideMsg && outSideMsg.type === 'reaction'){
typeMessage = 'edit'
let chatReference = outSideMsg.editedMessageObj.reference
if (/^\s*$/.test(trimmedMessage)) { if(outSideMsg.editedMessageObj.chatReference){
chatReference = outSideMsg.editedMessageObj.chatReference
}
let message = ""
try {
const parsedMessageObj = JSON.parse(outSideMsg.editedMessageObj.decodedMessage)
message = parsedMessageObj
} catch (error) {
message = outSideMsg.editedMessageObj.decodedMessage
}
let reactions = message.reactions || []
const findEmojiIndex = reactions.findIndex((reaction)=> reaction.type === outSideMsg.reaction)
if(findEmojiIndex !== -1){
let users = reactions[findEmojiIndex].users || []
const findUserIndex = users.find((user)=> user === this.selectedAddress.address )
if(findUserIndex !== -1){
users.splice(findUserIndex, 1)
} else {
users.push(this.selectedAddress.address)
}
reactions[findEmojiIndex] = {
...reactions[findEmojiIndex],
qty: users.length,
users
}
if(users.length === 0){
reactions.splice(findEmojiIndex, 1)
}
} else {
reactions = [...reactions, {
type: outSideMsg.reaction,
qty: 1,
users: [this.selectedAddress.address]
}]
}
const messageObject = {
...message,
reactions
}
const stringifyMessageObject = JSON.stringify(messageObject)
this.sendMessage(stringifyMessageObject, typeMessage, chatReference);
} else if (/^\s*$/.test(trimmedMessage)) {
this.isLoading = false; this.isLoading = false;
this.chatEditor.enable(); this.chatEditor.enable();
} else if (trimmedMessage.length >= 256) { } else if (trimmedMessage.length >= 256) {
@ -1046,7 +1095,7 @@ class ChatPage extends LitElement {
message = parsedMessageObj message = parsedMessageObj
} catch (error) { } catch (error) {
message = this.messageObj.decodedMessage message = this.editedMessageObj.decodedMessage
} }
const messageObject = { const messageObject = {
...message, ...message,

View File

@ -320,4 +320,13 @@ export const chatStyles = css`
padding: 3px 8px; padding: 3px 8px;
box-shadow: rgba(77, 77, 82, 0.2) 0px 7px 29px 0px; box-shadow: rgba(77, 77, 82, 0.2) 0px 7px 29px 0px;
} }
.reactions-bg {
background-color: #3C4048;
border-radius: 10px;
padding: 4px;
color: white;
margin-right: 10px;
cursor: pointer
}
` `

View File

@ -13,6 +13,8 @@ import '@vaadin/icon';
import '@material/mwc-button'; 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';
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 {
@ -27,7 +29,8 @@ class ChatScroller extends LitElement {
hideMessages: { type: Array }, hideMessages: { type: Array },
setRepliedToMessageObj: { type: Function }, setRepliedToMessageObj: { type: Function },
setEditedMessageObj: { type: Function }, setEditedMessageObj: { type: Function },
focusChatEditor: { type: Function } focusChatEditor: { type: Function },
sendMessage: { type: Function}
} }
} }
@ -44,8 +47,6 @@ class ChatScroller extends LitElement {
render() { render() {
console.log({messages: this.messages})
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>
@ -61,6 +62,7 @@ class ChatScroller extends LitElement {
.setRepliedToMessageObj=${this.setRepliedToMessageObj} .setRepliedToMessageObj=${this.setRepliedToMessageObj}
.setEditedMessageObj=${this.setEditedMessageObj} .setEditedMessageObj=${this.setEditedMessageObj}
.focusChatEditor=${this.focusChatEditor} .focusChatEditor=${this.focusChatEditor}
.sendMessage=${this.sendMessage}
> >
</message-template>` </message-template>`
)} )}
@ -82,11 +84,6 @@ class ChatScroller extends LitElement {
return changedProperties.has('messages'); return changedProperties.has('messages');
} }
async updated(changedProperties) {
console.log({changedProperties})
}
async firstUpdated() { async firstUpdated() {
this.viewElement = this.shadowRoot.getElementById('viewElement') this.viewElement = this.shadowRoot.getElementById('viewElement')
this.upObserverElement = this.shadowRoot.getElementById('upObserver') this.upObserverElement = this.shadowRoot.getElementById('upObserver')
@ -166,6 +163,7 @@ class MessageTemplate extends LitElement {
setRepliedToMessageObj: { type: Function }, setRepliedToMessageObj: { type: Function },
setEditedMessageObj: { type: Function }, setEditedMessageObj: { type: Function },
focusChatEditor: { type: Function }, focusChatEditor: { type: Function },
sendMessage: { type: Function }
} }
} }
@ -210,11 +208,14 @@ class MessageTemplate extends LitElement {
render() { render() {
const hidemsg = this.hideMessages const hidemsg = this.hideMessages
let message = "" let message = ""
let reactions = []
let repliedToData = null let repliedToData = null
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
reactions = parsedMessageObj.reactions || []
} catch (error) { } catch (error) {
message = this.messageObj.decodedMessage message = this.messageObj.decodedMessage
} }
@ -269,6 +270,16 @@ class MessageTemplate extends LitElement {
`} `}
<div id="messageContent" class="message"> <div id="messageContent" class="message">
${unsafeHTML(this.emojiPicker.parse(this.escapeHTML(message)))} ${unsafeHTML(this.emojiPicker.parse(this.escapeHTML(message)))}
</div>
<div>
${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>
<chat-menu <chat-menu
tabindex="0" tabindex="0"
@ -285,6 +296,7 @@ class MessageTemplate extends LitElement {
.focusChatEditor=${this.focusChatEditor} .focusChatEditor=${this.focusChatEditor}
.myAddress=${this.myAddress} .myAddress=${this.myAddress}
@blur=${() => this.showBlockIconFunc(false)} @blur=${() => this.showBlockIconFunc(false)}
.sendMessage=${this.sendMessage}
> >
</chat-menu> </chat-menu>
</div> </div>
@ -317,7 +329,9 @@ class ChatMenu extends LitElement {
setRepliedToMessageObj: { type: Function }, setRepliedToMessageObj: { type: Function },
setEditedMessageObj: { type: Function }, setEditedMessageObj: { type: Function },
focusChatEditor: { type: Function }, focusChatEditor: { type: Function },
myAddress: { type: Object } myAddress: { type: Object },
emojiPicker: { attribute: false },
sendMessage: {type: Function}
} }
} }
@ -341,6 +355,34 @@ class ChatMenu extends LitElement {
console.error('Copy to clipboard error:', err) console.error('Copy to clipboard error:', err)
} }
} }
firstUpdated(){
this.emojiPicker = new EmojiPicker({
style: "twemoji",
twemojiBaseUrl: '/emoji/',
showPreview: false,
showVariants: false,
showAnimation: false,
position: 'top-start',
boxShadow: 'rgba(4, 4, 5, 0.15) 0px 0px 0px 1px, rgba(0, 0, 0, 0.24) 0px 8px 16px 0px'
});
this.emojiPicker.on('emoji', selection => {
this.sendMessage({
type: 'reaction',
editedMessageObj: this.originalMessage,
reaction: selection.emoji,
})
});
}
render() { render() {
return html` return html`
@ -360,6 +402,15 @@ class ChatMenu extends LitElement {
}}"> }}">
<vaadin-icon icon="vaadin:reply" slot="icon"></vaadin-icon> <vaadin-icon icon="vaadin:reply" slot="icon"></vaadin-icon>
</div> </div>
<div
class="menu-icon tooltip reaction"
data-text="${translate("blockpage.bcchange13")}"
@click=${(e) => {
this.emojiPicker.togglePicker(e.target)
}}
>
<vaadin-icon icon="vaadin:smiley-o" slot="icon"></vaadin-icon>
</div>
${this.myAddress === this.originalMessage.sender ? ( ${this.myAddress === this.originalMessage.sender ? (
html` html`
<div <div