@bcc-code/vue-bcc-chat-ui 5.6.4 → 5.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chat/data.d.ts +2 -1
- package/dist/chat/index.d.ts +1 -0
- package/dist/components/BccChatMessageBubble.vue.d.ts +1 -1
- package/dist/components/BccChatMessageList.vue.d.ts +13 -0
- package/dist/vue-bcc-chat-ui.css +1 -1
- package/dist/vue-bcc-chat-ui.js +18151 -18135
- package/dist/vue-bcc-chat-ui.js.map +1 -1
- package/package.json +1 -1
- package/src/components/BccChatMessageBubble.vue +7 -53
- package/src/components/BccChatMessageList.vue +5 -3
- package/src/components/BccReplyPreview.vue +5 -6
package/package.json
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import
|
|
3
|
-
import { BaseMessage, CometChat, MediaMessage, User } from '@cometchat/chat-sdk-javascript'
|
|
4
|
-
import DOMPurify from 'dompurify';
|
|
5
|
-
import { inject, ref } from 'vue';
|
|
2
|
+
import { BaseMessage, CometChat, MediaMessage, User } from '@cometchat/chat-sdk-javascript';
|
|
6
3
|
import { CometChatTheme, fontHelper } from '@cometchat/uikit-resources';
|
|
7
|
-
import
|
|
8
|
-
import
|
|
4
|
+
import { inject, ref } from 'vue';
|
|
5
|
+
import chat from "../chat";
|
|
9
6
|
import { offlineStore } from '../offline';
|
|
7
|
+
import BccImageBubble from './BccImageBubble.vue';
|
|
8
|
+
import BccReplyPreview from "./BccReplyPreview.vue";
|
|
10
9
|
|
|
11
10
|
const props = defineProps({
|
|
12
11
|
id: {
|
|
@@ -42,51 +41,6 @@ const props = defineProps({
|
|
|
42
41
|
}
|
|
43
42
|
})
|
|
44
43
|
|
|
45
|
-
function toMarkdownHtml(str: string) {
|
|
46
|
-
str = formatMentionsInText(str);
|
|
47
|
-
|
|
48
|
-
const md = new MarkdownIt({
|
|
49
|
-
breaks: true,
|
|
50
|
-
typographer: true,
|
|
51
|
-
linkify: true,
|
|
52
|
-
html: true
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
str = md.render(str);
|
|
56
|
-
|
|
57
|
-
str = DOMPurify.sanitize(str, {
|
|
58
|
-
ALLOWED_TAGS: [
|
|
59
|
-
"a", // links
|
|
60
|
-
"ul", "ol", "li", // lists
|
|
61
|
-
"p", // paragraphs
|
|
62
|
-
"b", "strong", // bold
|
|
63
|
-
"i", "em", // italics
|
|
64
|
-
"u", // underline
|
|
65
|
-
"s", // strikethrough
|
|
66
|
-
"img", // images
|
|
67
|
-
"blockquote", // indented text
|
|
68
|
-
"hr", // horizontal line
|
|
69
|
-
"pre", // constant width text
|
|
70
|
-
"br", // newline
|
|
71
|
-
"div" // newline on mobile
|
|
72
|
-
]
|
|
73
|
-
})
|
|
74
|
-
|
|
75
|
-
return str
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
function formatMentionsInText(text: string) {
|
|
79
|
-
return text.replace(/<@uid:(.*?)>/g, (_match: string, uid: string) => {
|
|
80
|
-
const user = (props.mentionedUsers || []).find((user) => user.getUid() === uid);
|
|
81
|
-
// Check if a userName exists for the given uid; if not, keep the original match
|
|
82
|
-
if (user) {
|
|
83
|
-
return `**${user.getName()}**`;
|
|
84
|
-
} else {
|
|
85
|
-
return `**@unknown**`;
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
|
|
90
44
|
let parentMsgRef = ref<BaseMessage>();
|
|
91
45
|
if (props.metadata?.replyToMessageId) {
|
|
92
46
|
let guidString = props.guid?.toString()
|
|
@@ -141,9 +95,9 @@ const replyPreviewStyle = {
|
|
|
141
95
|
:src="src"
|
|
142
96
|
/>
|
|
143
97
|
</div>
|
|
144
|
-
<div v-if="text && metadata && metadata.translated_message" v-html="toMarkdownHtml(metadata.translated_message)"
|
|
98
|
+
<div v-if="text && metadata && metadata.translated_message" v-html="chat.toMarkdownHtml(metadata.translated_message, mentionedUsers)"
|
|
145
99
|
class="bcc-chat-msg-bubble bcc-chat-msg-bubble--translation" />
|
|
146
|
-
<div v-if="text" v-html="toMarkdownHtml(text)" class="bcc-chat-msg-bubble" :id="id"
|
|
100
|
+
<div v-if="text" v-html="chat.toMarkdownHtml(text, mentionedUsers)" class="bcc-chat-msg-bubble" :id="id"
|
|
147
101
|
:class="{ 'bcc-chat-msg-bubble--translated': metadata && !!metadata.translated_message }" />
|
|
148
102
|
</div>
|
|
149
103
|
</template>
|
|
@@ -32,6 +32,7 @@ const props = defineProps({
|
|
|
32
32
|
required: false,
|
|
33
33
|
},
|
|
34
34
|
loadMessageId: { type: String, required: false, default: "" },
|
|
35
|
+
displayNoMessagesText: { type: Boolean, required: false, default: true },
|
|
35
36
|
});
|
|
36
37
|
|
|
37
38
|
const componentId = ref(
|
|
@@ -42,7 +43,7 @@ const chatGroupNotFound = ref(false);
|
|
|
42
43
|
|
|
43
44
|
const isChatMessagesEmpty = ref(false);
|
|
44
45
|
|
|
45
|
-
const emit = defineEmits(['groupMembersFetched']);
|
|
46
|
+
const emit = defineEmits(['groupMembersFetched', 'chatEmpty']);
|
|
46
47
|
const groupMembers = ref<ParticipantInfo[]>();
|
|
47
48
|
|
|
48
49
|
const chatInstance: Ref<ChatInstance> = ref({
|
|
@@ -136,6 +137,7 @@ watch([loggedIn, chat.onlineStatus, () => props.chatUid, chat.initialized, () =>
|
|
|
136
137
|
affix: 'prepend'
|
|
137
138
|
}).total === 0) {
|
|
138
139
|
isChatMessagesEmpty.value = true;
|
|
140
|
+
emit('chatEmpty');
|
|
139
141
|
} else {
|
|
140
142
|
isChatMessagesEmpty.value = false;
|
|
141
143
|
}
|
|
@@ -294,8 +296,8 @@ function closeScheduledMessage() {
|
|
|
294
296
|
<div v-else class="bcc-chat-message-list-offline">
|
|
295
297
|
<span>Loading...</span>
|
|
296
298
|
</div>
|
|
297
|
-
<div v-if="isChatMessagesEmpty && chatGroup" class="bcc-chat-message-list-offline pointer-events-none">
|
|
298
|
-
|
|
299
|
+
<div v-if="isChatMessagesEmpty && chatGroup && displayNoMessagesText" class="bcc-chat-message-list-offline pointer-events-none">
|
|
300
|
+
<span>No messages have been sent yet</span>
|
|
299
301
|
</div>
|
|
300
302
|
</div>
|
|
301
303
|
</template>
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
+
import { BaseMessage, MediaMessage } from "@cometchat/chat-sdk-javascript";
|
|
2
3
|
import { CometChatTheme, CometChatUIKitConstants } from "@cometchat/uikit-resources";
|
|
3
4
|
import { inject, ref } from "vue";
|
|
5
|
+
import chat from '../chat';
|
|
6
|
+
import { getMessageTextPreview, getSenderDisplayName, proxyImage } from "../chat/data";
|
|
4
7
|
import { ReplyPreviewStyle } from "../chat/replyStyle";
|
|
5
|
-
import { BaseMessage, MediaMessage } from "@cometchat/chat-sdk-javascript";
|
|
6
|
-
import { getMessageTextPreview, proxyImage, getSenderDisplayName } from "../chat/data";
|
|
7
8
|
|
|
8
9
|
const props = defineProps({
|
|
9
10
|
replyToMessage: { type: BaseMessage },
|
|
@@ -64,9 +65,7 @@ function getThumbnailURL() {
|
|
|
64
65
|
<p class="bcc__reply_preview__title" :style="titleStyle()">
|
|
65
66
|
{{ props.titlePrefix + ( getSenderDisplayName(props.replyToMessage) || "" ) || "Reply to ..." }}
|
|
66
67
|
</p>
|
|
67
|
-
<p class="cc__preview__subtitle" :style="subtitleStyle()"
|
|
68
|
-
{{ getMessageTextPreview(props?.replyToMessage) || "" }}
|
|
69
|
-
</p>
|
|
68
|
+
<p class="cc__preview__subtitle" v-html="chat.toMarkdownHtml(getMessageTextPreview(props?.replyToMessage), props.replyToMessage?.getMentionedUsers()) || ''" :style="subtitleStyle()"/>
|
|
70
69
|
</div>
|
|
71
70
|
</div>
|
|
72
71
|
</template>
|
|
@@ -92,7 +91,7 @@ function getThumbnailURL() {
|
|
|
92
91
|
overflow: hidden;
|
|
93
92
|
display: -webkit-box;
|
|
94
93
|
-webkit-box-orient: vertical;
|
|
95
|
-
-webkit-line-clamp:
|
|
94
|
+
-webkit-line-clamp: 8;
|
|
96
95
|
word-break: break-all;
|
|
97
96
|
}
|
|
98
97
|
.bcc__reply_preview__content > .bcc__reply_preview__title {
|