Skip to content

Commit 84164a5

Browse files
committed
(fix) add users tag messages UI
1 parent 2c46bb5 commit 84164a5

File tree

7 files changed

+56
-17
lines changed

7 files changed

+56
-17
lines changed

demo/src/ChatContainer.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ export default {
414414
}
415415
},
416416
417-
async sendMessage({ content, roomId, file, replyMessage }) {
417+
async sendMessage({ content, roomId, file, replyMessage, usersTag }) {
418418
const message = {
419419
sender_id: this.currentUserId,
420420
content,

src/ChatWindow/ChatWindow.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@ export default {
328328
329329
a {
330330
color: #0d579c;
331+
font-weight: 500;
331332
}
332333
333334
.vac-chat-container {

src/ChatWindow/FormatMessage.vue

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,19 @@
77
:key="i"
88
:class="{
99
'vac-text-ellipsis': singleLine,
10-
'vac-text-deleted': deleted,
1110
'vac-text-bold': checkType(message, 'bold'),
12-
'vac-text-italic': checkType(message, 'italic'),
11+
'vac-text-italic': checkType(message, 'italic') || deleted,
1312
'vac-text-strike': checkType(message, 'strike'),
1413
'vac-text-underline': checkType(message, 'underline'),
1514
'vac-text-inline-code':
1615
!singleLine && checkType(message, 'inline-code'),
1716
'vac-text-multiline-code':
18-
!singleLine && checkType(message, 'multiline-code')
17+
!singleLine && checkType(message, 'multiline-code'),
18+
'vac-text-tag': checkType(message, 'tag')
1919
}"
2020
:href="message.href"
21-
target="_blank"
21+
:target="message.href ? '_blank' : null"
22+
@click="openTag(message)"
2223
>
2324
<slot name="deleted-icon" v-bind="{ deleted }">
2425
<svg-icon v-if="deleted" name="deleted" class="vac-icon-deleted" />
@@ -27,7 +28,7 @@
2728
</component>
2829
</template>
2930
</div>
30-
<div v-else>{{ content }}</div>
31+
<div v-else>{{ formattedContent }}</div>
3132
</div>
3233
</template>
3334

@@ -43,30 +44,44 @@ export default {
4344
props: {
4445
content: { type: [String, Number], required: true },
4546
deleted: { type: Boolean, default: false },
47+
users: { type: Array, default: () => [] },
4648
linkify: { type: Boolean, default: true },
4749
singleLine: { type: Boolean, default: false },
4850
textFormatting: { type: Boolean, required: true }
4951
},
5052
5153
computed: {
5254
linkifiedMessage() {
53-
return formatString(this.content, this.linkify)
55+
return formatString(this.formatTags(this.content), this.linkify)
56+
},
57+
formattedContent() {
58+
return this.formatTags(this.content)
5459
}
5560
},
5661
5762
methods: {
5863
checkType(message, type) {
5964
return message.types.indexOf(type) !== -1
65+
},
66+
formatTags(content) {
67+
this.users.forEach(user => {
68+
const index = content.indexOf(user._id)
69+
const isTag = content.substring(index - 9, index) === '<usertag>'
70+
if (isTag) content = content.replace(user._id, `@${user.username}`)
71+
})
72+
73+
return content
74+
},
75+
openTag(message) {
76+
if (!this.singleLine && this.checkType(message, 'tag')) {
77+
// TODO: emit event
78+
}
6079
}
6180
}
6281
}
6382
</script>
6483

6584
<style>
66-
.vac-text-deleted {
67-
font-style: italic;
68-
}
69-
7085
.vac-icon-deleted {
7186
height: 14px;
7287
width: 14px;

src/ChatWindow/Message.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
<div v-else-if="!message.file">
7777
<format-message
7878
:content="message.content"
79+
:users="roomUsers"
7980
:text-formatting="textFormatting"
8081
>
8182
<template v-slot:deleted-icon="data">
@@ -126,6 +127,7 @@
126127
</div>
127128
<format-message
128129
:content="message.content"
130+
:users="roomUsers"
129131
:text-formatting="textFormatting"
130132
></format-message>
131133
</div>

src/ChatWindow/Room.vue

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,7 @@ export default {
438438
recordedChunks: [],
439439
keepKeyboardOpen: false,
440440
filteredUsersTag: [],
441+
selectedUsersTag: [],
441442
textareaCursorPosition: null,
442443
roomFooterHeight: 0
443444
}
@@ -656,6 +657,8 @@ export default {
656657
space +
657658
this.message.substr(endPosition, this.message.length - 1)
658659
660+
this.selectedUsersTag = [...this.selectedUsersTag, { ...user }]
661+
659662
this.focusTextarea()
660663
},
661664
resetUsersTag() {
@@ -754,6 +757,7 @@ export default {
754757
return
755758
}
756759
760+
this.selectedUsersTag = []
757761
this.resetUsersTag()
758762
this.resetTextareaSize()
759763
this.message = ''
@@ -790,22 +794,33 @@ export default {
790794
if (this.keepKeyboardOpen) this.$refs['roomTextarea'].focus()
791795
},
792796
sendMessage() {
793-
if (!this.file && !this.message.trim()) return
797+
let message = this.message.trim()
798+
799+
if (!this.file && !message) return
800+
801+
this.selectedUsersTag.forEach(user => {
802+
message = message.replace(
803+
`@${user.username}`,
804+
`<usertag>${user._id}</usertag>`
805+
)
806+
})
794807
795808
if (this.editedMessage._id) {
796-
if (this.editedMessage.content !== this.message || this.file) {
809+
if (this.editedMessage.content !== message || this.file) {
797810
this.$emit('edit-message', {
798811
messageId: this.editedMessage._id,
799-
newContent: this.message.trim(),
812+
newContent: message,
800813
file: this.file,
801-
replyMessage: this.messageReply
814+
replyMessage: this.messageReply,
815+
usersTag: this.selectedUsersTag
802816
})
803817
}
804818
} else {
805819
this.$emit('send-message', {
806-
content: this.message.trim(),
820+
content: message,
807821
file: this.file,
808-
replyMessage: this.messageReply
822+
replyMessage: this.messageReply,
823+
usersTag: this.selectedUsersTag
809824
})
810825
}
811826

src/ChatWindow/RoomsList.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@
106106
v-else-if="room.lastMessage"
107107
:content="getLastMessage(room)"
108108
:deleted="!!room.lastMessage.deleted && !typingUsers(room)"
109+
:users="room.users"
109110
:linkify="false"
110111
:text-formatting="textFormatting"
111112
:single-line="true"

src/utils/formatString.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ const pseudo_markdown = {
5353
end: '`',
5454
allowed_chars: '.',
5555
type: 'inline-code'
56+
},
57+
'<usertag>': {
58+
allowed_chars: '.',
59+
end: '</usertag>',
60+
type: 'tag'
5661
}
5762
// ':': {
5863
// allowed_chars: '[a-z_]',

0 commit comments

Comments
 (0)