182 lines
6.9 KiB
Vue
Raw Normal View History

2023-05-02 22:53:27 +02:00
<template>
<div
class="group rounded-lg m-2 shadow-lg hover:border-primary dark:hover:border-primary hover:border-solid hover:border-2 border-2 border-transparent even:bg-bg-light-discussion-odd dark:even:bg-bg-dark-discussion-odd flex-row p-4 pb-2">
<div class="w-30 flex">
<!-- SENDER -->
2023-05-07 18:01:05 +03:00
<div class="w-10 h-10 rounded-lg object-fill drop-shadow-md">
<img :src="getImgUrl()" class="w-10 h-10 rounded-full object-fill text-red-700">
2023-05-02 22:53:27 +02:00
</div>
<p class="drop-shadow-sm py-0 px-2 text-lg text-opacity-95 font-bold ">{{ message.sender }}</p>
</div>
2023-05-07 23:00:30 +03:00
<div class="-mt-4 ml-10 mr-0 pt-1 px-2 ">
2023-05-02 22:53:27 +02:00
<!-- CONTENT/MESSAGE -->
<MarkdownRenderer ref="mdRender" v-if="!editMsgMode" :markdown-text="message.content"></MarkdownRenderer>
<textarea v-if="editMsgMode" ref="mdTextarea" :rows="4"
2023-05-07 23:00:30 +03:00
class="block p-2.5 w-full text-sm text-gray-900 bg-gray-50 rounded-lg border border-gray-300 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
:style="{minHeight:mdRenderHeight+`px`}"
2023-05-07 23:00:30 +03:00
placeholder="Enter message here..." v-model="new_message_content"></textarea>
2023-05-02 22:53:27 +02:00
</div>
<div class="invisible group-hover:visible flex flex-row mt-3 -mb-2">
<!-- MESSAGE CONTROLS -->
2023-05-07 23:00:30 +03:00
<!-- EDIT CONFIRMATION -->
<div v-if="editMsgMode" class="flex items-center duration-75">
<button class="text-2xl hover:text-red-600 duration-75 active:scale-90 p-2" title="Cancel edit" type="button"
@click.stop="editMsgMode = false">
<i data-feather="x"></i>
</button>
<button class="text-2xl hover:text-secondary duration-75 active:scale-90 p-2" title="Update message"
type="button" @click.stop="updateMessage">
<i data-feather="check"></i>
</button>
</div>
<div v-if="!editMsgMode" class="text-lg hover:text-secondary duration-75 active:scale-90 p-2" title="Edit message"
@click.stop="editMsgMode =true">
2023-05-02 22:53:27 +02:00
<i data-feather="edit"></i>
</div>
2023-05-07 18:01:05 +03:00
<div class="text-lg hover:text-secondary duration-75 active:scale-90 p-2" title="Copy message to clipboard"
@click.stop="copyContentToClipboard()">
2023-05-02 22:53:27 +02:00
<i data-feather="copy"></i>
</div>
2023-05-08 17:04:44 +03:00
<div class="text-lg hover:text-secondary duration-75 active:scale-90 p-2" title="Resend message" @click.stop="resendMessage()">
2023-05-02 22:53:27 +02:00
<i data-feather="refresh-cw"></i>
</div>
2023-05-07 23:00:30 +03:00
<!-- DELETE CONFIRMATION -->
<div v-if="deleteMsgMode" class="flex items-center duration-75">
<button class="text-2xl hover:text-red-600 duration-75 active:scale-90 p-2" title="Cancel removal" type="button"
@click.stop="deleteMsgMode = false">
<i data-feather="x"></i>
</button>
<button class="text-2xl hover:text-secondary duration-75 active:scale-90 p-2" title="Confirm removal"
type="button" @click.stop="deleteMsg()">
<i data-feather="check"></i>
</button>
</div>
<div v-if="!deleteMsgMode" class="text-lg hover:text-red-600 duration-75 active:scale-90 p-2"
title="Remove message" @click="deleteMsgMode = true">
2023-05-02 22:53:27 +02:00
<i data-feather="trash"></i>
</div>
2023-05-07 23:00:30 +03:00
<div class="text-lg hover:text-secondary duration-75 active:scale-90 p-2" title="Upvote" @click.stop="rankUp()">
2023-05-02 22:53:27 +02:00
<i data-feather="thumbs-up"></i>
</div>
<div class="flex flex-row items-center">
2023-05-07 23:00:30 +03:00
<div class="text-lg hover:text-red-600 duration-75 active:scale-90 p-2" title="Downvote"
@click.stop="rankDown()">
2023-05-07 18:01:05 +03:00
<i data-feather="thumbs-down"></i>
</div>
2023-05-02 22:53:27 +02:00
<div v-if="message.rank != 0" class="rounded-full px-2 text-sm flex items-center justify-center font-bold"
:class="message.rank > 0 ? 'bg-secondary' : 'bg-red-600'" title="Rank">{{ message.rank }}
</div>
</div>
2023-05-07 18:01:05 +03:00
</div>
2023-05-02 22:53:27 +02:00
</div>
</template>
<script>
2023-05-07 18:01:05 +03:00
import botImgPlaceholder from "../assets/logo.svg"
import userImgPlaceholder from "../assets/default_user.svg"
import { nextTick } from 'vue'
2023-05-02 22:53:27 +02:00
import feather from 'feather-icons'
2023-05-07 10:20:59 +02:00
import MarkdownRenderer from './MarkdownRenderer.vue';
2023-05-02 22:53:27 +02:00
export default {
2023-05-17 09:25:21 -04:00
// eslint-disable-next-line vue/multi-word-component-names
2023-05-02 22:53:27 +02:00
name: 'Message',
2023-05-08 17:04:44 +03:00
emits: ['copy', 'delete', 'rankUp', 'rankDown','updateMessage','resendMessage'],
2023-05-07 10:20:59 +02:00
components: {
MarkdownRenderer
},
2023-05-02 22:53:27 +02:00
props: {
message: Object
},
data() {
return {
2023-05-07 18:01:05 +03:00
2023-05-07 23:00:30 +03:00
senderImg: '',
new_message_content: '',
showConfirmation: false,
editMsgMode: false,
deleteMsgMode: false,
mdRenderHeight:Number
2023-05-07 23:00:30 +03:00
2023-05-02 22:53:27 +02:00
}
2023-05-07 18:01:05 +03:00
}, mounted() {
this.senderImg = botImgPlaceholder
2023-05-07 23:00:30 +03:00
this.new_message_content = this.message.content
2023-05-07 18:01:05 +03:00
nextTick(() => {
feather.replace()
this.mdRenderHeight=this.$refs.mdRender.$el.offsetHeight
2023-05-07 18:01:05 +03:00
})
2023-05-07 18:01:05 +03:00
}, methods: {
copyContentToClipboard() {
2023-05-07 15:40:57 +03:00
this.$emit('copy', this.message.content)
navigator.clipboard.writeText(this.message.content);
2023-05-07 18:01:05 +03:00
},
2023-05-07 23:00:30 +03:00
deleteMsg() {
this.$emit('delete', this.message.id)
this.deleteMsgMode = false
},
rankUp() {
this.$emit('rankUp', this.message.id)
},
rankDown() {
this.$emit('rankDown', this.message.id)
},
updateMessage() {
this.$emit('updateMessage', this.message.id, this.new_message_content)
this.editMsgMode = false
},
2023-05-08 17:04:44 +03:00
resendMessage(){
this.$emit('resendMessage', this.message.id, this.new_message_content)
},
2023-05-07 18:01:05 +03:00
getImgUrl() {
if (this.message.sender == "user") {
return userImgPlaceholder;
}
2023-05-20 16:03:30 +02:00
console.log("Message data")
console.log(this.message)
2023-05-07 18:01:05 +03:00
return botImgPlaceholder;
2023-05-07 15:40:57 +03:00
}
2023-05-07 18:01:05 +03:00
2023-05-07 23:00:30 +03:00
}, watch: {
showConfirmation() {
nextTick(() => {
feather.replace()
2023-05-07 23:00:30 +03:00
})
},
2023-05-07 23:00:30 +03:00
editMsgMode(val){
2023-05-07 23:00:30 +03:00
if(!val){
this.new_message_content = this.message.content
}
2023-05-07 23:00:30 +03:00
nextTick(() => {
feather.replace()
})
},
deleteMsgMode(){
nextTick(() => {
feather.replace()
})
},
}
2023-05-07 18:01:05 +03:00
2023-05-02 22:53:27 +02:00
}
</script>