vue-wiguet-chatweb 0.1.16 โ 0.1.17
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/components/Chat.vue.d.ts +2 -1
- package/dist/components/MessageList.vue.d.ts +3 -2
- package/dist/components/Widget.vue.d.ts +2 -1
- package/dist/store/index.d.ts +4 -0
- package/dist/style.css +1 -1
- package/dist/vue-wiguet-chatweb.js +1739 -1674
- package/dist/vue-wiguet-chatweb.umd.cjs +6 -6
- package/package.json +1 -1
- package/src/components/Chat.vue +39 -0
- package/src/components/MessageList.vue +57 -3
- package/src/components/Widget.vue +2 -1
package/package.json
CHANGED
package/src/components/Chat.vue
CHANGED
@@ -15,6 +15,7 @@
|
|
15
15
|
:canLoadMoreMessages="messagesData.canLoadMoreMessages"
|
16
16
|
@loadMore="getMessages"
|
17
17
|
@retry="retryMessage"
|
18
|
+
@on-qualifying="(args) => onQualifying(args)"
|
18
19
|
/>
|
19
20
|
</div>
|
20
21
|
|
@@ -70,6 +71,7 @@ import {
|
|
70
71
|
getMessagesApi,
|
71
72
|
sendMessageApi,
|
72
73
|
setVistoToTrueApi,
|
74
|
+
updateMessageApi,
|
73
75
|
} from "../store/index";
|
74
76
|
import { getInformationApi } from "../store";
|
75
77
|
import MessageList from "./MessageList.vue";
|
@@ -96,6 +98,7 @@ const emit = defineEmits([
|
|
96
98
|
"new-message",
|
97
99
|
"clear-new-messages",
|
98
100
|
"not-viewed-total",
|
101
|
+
"onQualifying",
|
99
102
|
]);
|
100
103
|
|
101
104
|
const props = defineProps({
|
@@ -413,6 +416,42 @@ function getOS() {
|
|
413
416
|
return os;
|
414
417
|
}
|
415
418
|
|
419
|
+
function onQualifying({ message, emoji }: { message: Message, emoji: {icon: string, value: number } }) {
|
420
|
+
const callback = async () => {
|
421
|
+
if (!message.id || !emoji) return;
|
422
|
+
|
423
|
+
const idx = searchFromLast<Message>(
|
424
|
+
messagesData.value.data,
|
425
|
+
"id",
|
426
|
+
message.id
|
427
|
+
);
|
428
|
+
|
429
|
+
let prevMessage = messagesData.value?.data?.[idx].message
|
430
|
+
messagesData.value?.data?.[idx] && (messagesData.value.data[idx].message = emoji.icon);
|
431
|
+
|
432
|
+
const msg = await updateMessageApi(message.id, { message: emoji.icon, tipoCalificacionId: emoji.value }, props.tokenAuth);
|
433
|
+
|
434
|
+
if (!msg) {
|
435
|
+
messagesData.value?.data?.[idx] && (messagesData.value.data[idx].message = prevMessage);
|
436
|
+
emit("show-toast", {
|
437
|
+
severity: "error",
|
438
|
+
summary: "Error",
|
439
|
+
detail: "Ocurrio un error al enviar el mensaje, intente nuevamente",
|
440
|
+
life: 5000,
|
441
|
+
});
|
442
|
+
return
|
443
|
+
}
|
444
|
+
|
445
|
+
socketService.value?.emit("sendMessage", {
|
446
|
+
roomId: information?.value?.appChat.id,
|
447
|
+
message,
|
448
|
+
});
|
449
|
+
}
|
450
|
+
|
451
|
+
emit('onQualifying', callback)
|
452
|
+
};
|
453
|
+
|
454
|
+
|
416
455
|
onMounted(async () => {
|
417
456
|
if (appChatId.value) return;
|
418
457
|
|
@@ -26,7 +26,25 @@
|
|
26
26
|
<div class="chat-message">
|
27
27
|
<div class="bubble" :class="message.esCliente ? 'right' : 'left'">
|
28
28
|
<div :class="message.esCliente ? 'content-right' : 'content-left'">
|
29
|
-
<div
|
29
|
+
<div v-if="message.message === '๐๐๐๐๐'" class="flex gap-2" >
|
30
|
+
<div>
|
31
|
+
<strong style="display: block; margin-bottom: 0.5rem;">Ayรบdanos a mejorar nuestro servicio.</strong>
|
32
|
+
<span>Que le pareciรณ la atenciรณn:</span>
|
33
|
+
</div>
|
34
|
+
<a
|
35
|
+
v-for="emoji in emojis"
|
36
|
+
href="javascript:"
|
37
|
+
class="btn-icon"
|
38
|
+
:key="emoji.value"
|
39
|
+
@click="emit('onQualifying', { message, emoji })"
|
40
|
+
>
|
41
|
+
<div class="flex flex-col items-center">
|
42
|
+
<div class="icon">{{ emoji.icon }}</div>
|
43
|
+
<span>{{ emoji.label }}</span>
|
44
|
+
</div>
|
45
|
+
</a>
|
46
|
+
</div>
|
47
|
+
<div v-else class="message-text" style="white-space: pre-line" v-html="textToRichFormat(message.message)"></div>
|
30
48
|
<div class="detail-message flex justify-content-between">
|
31
49
|
<span class="mr-5" v-if="message.sender?.nombreCompleto">
|
32
50
|
{{
|
@@ -53,13 +71,13 @@
|
|
53
71
|
</template>
|
54
72
|
|
55
73
|
<script setup lang="ts">
|
56
|
-
import { PropType, onBeforeMount, ref, watch } from
|
74
|
+
import { PropType, onBeforeMount, ref, watch, h } from 'vue';
|
57
75
|
import { useIntersectionObserver } from "@vueuse/core";
|
58
76
|
import { type Message } from "../dto/app.dto";
|
59
77
|
import { DateTime } from "luxon";
|
60
78
|
import DangerIcon from "./DangerIcon.vue";
|
61
79
|
|
62
|
-
const emit = defineEmits(["loadMore", "retry"]);
|
80
|
+
const emit = defineEmits(["loadMore", "retry", "onQualifying"]);
|
63
81
|
const props = defineProps({
|
64
82
|
messages: {
|
65
83
|
type: Array as PropType<Message[]>,
|
@@ -135,6 +153,14 @@ function textToRichFormat(text: string) {
|
|
135
153
|
return newMessage().replace(/--custom-tag/g, '');
|
136
154
|
}
|
137
155
|
|
156
|
+
const emojis = [
|
157
|
+
{ label: 'Excelente', value: 1, icon: '๐' },
|
158
|
+
{ label: 'Buena', value: 2, icon: '๐' },
|
159
|
+
{ label: 'Aceptable', value: 3, icon: '๐' },
|
160
|
+
{ label: 'Mala', value: 4, icon: '๐' },
|
161
|
+
{ label: 'Muy Mala', value: 5, icon: '๐' },
|
162
|
+
]
|
163
|
+
|
138
164
|
</script>
|
139
165
|
|
140
166
|
<style scoped>
|
@@ -260,4 +286,32 @@ function textToRichFormat(text: string) {
|
|
260
286
|
.messages-container-list {
|
261
287
|
width: 100%;
|
262
288
|
}
|
289
|
+
|
290
|
+
.btn-icon {
|
291
|
+
text-decoration: none;
|
292
|
+
border: none;
|
293
|
+
}
|
294
|
+
.btn-icon span {
|
295
|
+
color: currentColor;
|
296
|
+
text-wrap: nowrap;
|
297
|
+
}
|
298
|
+
|
299
|
+
.btn-icon .icon {
|
300
|
+
font-size: 2rem;
|
301
|
+
}
|
302
|
+
|
303
|
+
.flex {
|
304
|
+
display: flex;
|
305
|
+
flex-wrap: wrap;
|
306
|
+
}
|
307
|
+
.flex-col {
|
308
|
+
flex-direction: column;
|
309
|
+
}
|
310
|
+
.items-center {
|
311
|
+
align-items: center;
|
312
|
+
}
|
313
|
+
.gap-2 {
|
314
|
+
gap: 0.5rem;
|
315
|
+
}
|
316
|
+
|
263
317
|
</style>
|
@@ -50,6 +50,7 @@
|
|
50
50
|
@clear-new-messages="newMessages = 0"
|
51
51
|
@new-message="() => newMessages++"
|
52
52
|
@not-viewed-total="(val) => (newMessages = val)"
|
53
|
+
@on-qualifying="(args)=> emit('onQualifying', args)"
|
53
54
|
/>
|
54
55
|
</div>
|
55
56
|
</div>
|
@@ -63,7 +64,7 @@ import IconTelegram from "./IconTelegram.vue";
|
|
63
64
|
import IconWhatsApp from "./IconWhatsApp.vue";
|
64
65
|
import IconChat from "./IconChat.vue";
|
65
66
|
|
66
|
-
const emit = defineEmits(["show-toast", "show-confirm"]);
|
67
|
+
const emit = defineEmits(["show-toast", "show-confirm", "onQualifying"]);
|
67
68
|
|
68
69
|
const enum MeansCommunication{
|
69
70
|
WHATSAPP,
|