forked from Qortal/qortal-ui
added reactions
This commit is contained in:
parent
ce7eb44197
commit
b73b9a0ab2
@ -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(/ /gi, ' ').replace(/<br\s*[\/]?>/gi, '\n');
|
const sanitizedMessage = messageText.replace(/ /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,
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
`
|
`
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user