vue-wiguet-chatweb 0.0.34 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +13 -1
- package/dist/dto/app.dto.d.ts +0 -3
- package/dist/dto/chat.dto.d.ts +7 -0
- package/dist/index.d.ts +8 -8
- package/dist/style.css +1 -1
- package/dist/vue-wiguet-chatweb.js +5418 -4074
- package/dist/vue-wiguet-chatweb.umd.cjs +5 -7
- package/package.json +2 -1
- package/src/components/Chat.vue +76 -59
- package/src/components/Widget.vue +0 -1
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "vue-wiguet-chatweb",
|
3
|
-
"version": "0.0
|
3
|
+
"version": "0.1.0",
|
4
4
|
"type": "module",
|
5
5
|
"files": [
|
6
6
|
"dist",
|
@@ -35,6 +35,7 @@
|
|
35
35
|
"@vueuse/core": "^10.0.0",
|
36
36
|
"axios": "^1.4.0",
|
37
37
|
"luxon": "^3.0.0",
|
38
|
+
"socket.io-client": "^4.7.2",
|
38
39
|
"uuid": "^9.0.1",
|
39
40
|
"vue": "^3.2.0"
|
40
41
|
},
|
package/src/components/Chat.vue
CHANGED
@@ -45,12 +45,12 @@
|
|
45
45
|
</template>
|
46
46
|
|
47
47
|
<script setup lang="ts">
|
48
|
-
import { ref, onMounted, nextTick, PropType, watch } from "vue";
|
48
|
+
import { ref, onMounted, nextTick, PropType, watch, onUnmounted } from "vue";
|
49
49
|
import { v4 as uuidv4 } from "uuid";
|
50
50
|
|
51
|
-
import { RabbitMQService } from "vue-rabbit-frontend";
|
52
51
|
import {
|
53
52
|
type SendMessageBody,
|
53
|
+
ChatInformation,
|
54
54
|
ListMessageBody,
|
55
55
|
Message,
|
56
56
|
} from "../dto/app.dto";
|
@@ -66,10 +66,10 @@ import { getInformationApi } from "../store";
|
|
66
66
|
import MessageList from "./MessageList.vue";
|
67
67
|
import Loader from "./Loader.vue";
|
68
68
|
import { searchFromLast } from "../resources/functions.helpers";
|
69
|
-
import {
|
69
|
+
import { io } from "socket.io-client";
|
70
|
+
import { APP_TYPE } from "../dto/chat.dto";
|
70
71
|
|
71
72
|
//DATA
|
72
|
-
const rabbitMQServiceListen: any = ref(null);
|
73
73
|
const message = ref("");
|
74
74
|
const notViewed = ref(0);
|
75
75
|
|
@@ -77,7 +77,7 @@ const messagesData = ref<{ data: Message[]; canLoadMoreMessages: boolean }>({
|
|
77
77
|
data: [],
|
78
78
|
canLoadMoreMessages: false,
|
79
79
|
});
|
80
|
-
|
80
|
+
|
81
81
|
const appChatId = ref("");
|
82
82
|
const isLoading = ref(false);
|
83
83
|
|
@@ -121,31 +121,15 @@ watch(
|
|
121
121
|
setVistoToTrueApi(appChatId.value, props.tokenAuth);
|
122
122
|
}
|
123
123
|
|
124
|
-
if (
|
124
|
+
if (appChatId.value) return;
|
125
125
|
|
126
126
|
const resp = await getInformationApi(props.tokenAuth);
|
127
127
|
|
128
128
|
if(resp) {
|
129
|
-
virtualHost.value = resp.virtualHost;
|
130
129
|
appChatId.value = resp.appChat.id;
|
131
|
-
connectMsRabbit();
|
132
130
|
}
|
133
131
|
}
|
134
132
|
);
|
135
|
-
onMounted(async () => {
|
136
|
-
if (virtualHost.value && appChatId.value) return;
|
137
|
-
|
138
|
-
const resp = await getInformationApi(props.tokenAuth);
|
139
|
-
|
140
|
-
if(!resp) return;
|
141
|
-
|
142
|
-
virtualHost.value = resp.virtualHost;
|
143
|
-
appChatId.value = resp.appChat.id;
|
144
|
-
emit("not-viewed-total", resp.appChat.totalNoVistosCliente);
|
145
|
-
notViewed.value = resp.appChat.totalNoVistosCliente;
|
146
|
-
getMessages();
|
147
|
-
connectMsRabbit();
|
148
|
-
});
|
149
133
|
|
150
134
|
const submitMessage = async (event: Event) => {
|
151
135
|
if (message.value?.length > 300) {
|
@@ -183,7 +167,6 @@ const submitMessage = async (event: Event) => {
|
|
183
167
|
msPersonaId: props.user.msPersonaId,
|
184
168
|
},
|
185
169
|
};
|
186
|
-
|
187
170
|
|
188
171
|
const idx = messagesData.value.data.push(newMessage) - 1;
|
189
172
|
|
@@ -202,6 +185,14 @@ const submitMessage = async (event: Event) => {
|
|
202
185
|
});
|
203
186
|
} else {
|
204
187
|
messagesData.value.data[idx] = newMsg;
|
188
|
+
|
189
|
+
socketService.value.emit(
|
190
|
+
'sendMessage',
|
191
|
+
{ roomId: information?.value?.appChat.id, message: newMsg },
|
192
|
+
(response: any) => {
|
193
|
+
console.log('🚀 ~ socketService.value.emit ~ response:', response);
|
194
|
+
}
|
195
|
+
);
|
205
196
|
}
|
206
197
|
});
|
207
198
|
|
@@ -268,48 +259,17 @@ const retryMessage = async (message: Message) => {
|
|
268
259
|
);
|
269
260
|
|
270
261
|
messagesData.value.data[idx] = { ...msg, error: undefined };
|
262
|
+
|
263
|
+
socketService.value.emit(
|
264
|
+
'sendMessage',
|
265
|
+
{ roomId: information?.value?.appChat.id, message },
|
266
|
+
);
|
271
267
|
}
|
272
268
|
|
273
269
|
scrollToBottom();
|
274
270
|
});
|
275
271
|
};
|
276
272
|
|
277
|
-
const connectMsRabbit = (app: any = "webchat") => {
|
278
|
-
const { virtualhost } = virtualHost.value;
|
279
|
-
let data = sessionStorage.getItem("tabBrowser");
|
280
|
-
if (!data) {
|
281
|
-
let tab = Date.now();
|
282
|
-
sessionStorage.setItem("tabBrowser", `${tab}`);
|
283
|
-
}
|
284
|
-
rabbitMQServiceListen.value = new RabbitMQService(
|
285
|
-
`${virtualhost}`,
|
286
|
-
`widget_chat_${sessionStorage.getItem("tabBrowser")}`
|
287
|
-
);
|
288
|
-
rabbitMQServiceListen.value.connect();
|
289
|
-
|
290
|
-
rabbitMQServiceListen.value.subscribe(async (val: any) => {
|
291
|
-
if (
|
292
|
-
val.event &&
|
293
|
-
val.event === RABBIT_EVENTS.NEW_MESSAGE &&
|
294
|
-
!val.message.esCliente
|
295
|
-
) {
|
296
|
-
messagesData.value.data.push(val.message);
|
297
|
-
if (props.visible === true) {
|
298
|
-
setVistoToTrueApi(appChatId.value, props.tokenAuth);
|
299
|
-
}
|
300
|
-
if (props.visible === false) {
|
301
|
-
notViewed.value = notViewed.value + 1;
|
302
|
-
emit("new-message");
|
303
|
-
}
|
304
|
-
scrollToBottom();
|
305
|
-
}
|
306
|
-
});
|
307
|
-
};
|
308
|
-
|
309
|
-
const disconnectMsRabbit = () => {
|
310
|
-
rabbitMQServiceListen.value?.disconnectClient();
|
311
|
-
};
|
312
|
-
|
313
273
|
const scrollToBottom = () => {
|
314
274
|
nextTick(() => {
|
315
275
|
if (messageContainerRef.value) {
|
@@ -342,6 +302,63 @@ function autoAdjustHeight() {
|
|
342
302
|
textAreaRef.value.style.height = textAreaRef.value.scrollHeight + "px"
|
343
303
|
}
|
344
304
|
|
305
|
+
const socketService = ref();
|
306
|
+
const information = ref<ChatInformation>();
|
307
|
+
|
308
|
+
function connectMsWebSocket (userChat: ChatInformation ,app: APP_TYPE = APP_TYPE.WEBCHAT) {
|
309
|
+
if (!userChat) throw new Error('user chat is required')
|
310
|
+
|
311
|
+
socketService.value = io(window.VITE_SOCKET_URI, {
|
312
|
+
query: {
|
313
|
+
// TODO: confirmar si se quita o no
|
314
|
+
usuarioId: `${userChat?.chat?.persona?.funcionarioId}`,
|
315
|
+
aplicacion: app,
|
316
|
+
},
|
317
|
+
extraHeaders: { Authorization: props.tokenAuth },
|
318
|
+
});
|
319
|
+
|
320
|
+
socketService.value.on('connect', () => {
|
321
|
+
console.log('Conectado al servidor de sockets');
|
322
|
+
|
323
|
+
socketService.value.emit(
|
324
|
+
'joinRoom',
|
325
|
+
`${userChat?.appChat?.id}`
|
326
|
+
);
|
327
|
+
})
|
328
|
+
|
329
|
+
socketService.value.on('disconnect', () => {
|
330
|
+
console.log('Desconectado del servidor de sockets');
|
331
|
+
});
|
332
|
+
|
333
|
+
socketService.value.on('receiveMessage', (data: any) => {
|
334
|
+
console.log('Mensaje recibido:', data.message, userChat);
|
335
|
+
|
336
|
+
if (data.message.sender.msPersonaId === userChat?.chat?.persona?.msPersonaId) return
|
337
|
+
|
338
|
+
messagesData.value.data.push(data.message);
|
339
|
+
setVistoToTrueApi(data.message.appChatId, props.tokenAuth);
|
340
|
+
scrollToBottom();
|
341
|
+
});
|
342
|
+
}
|
343
|
+
|
344
|
+
onMounted(async () => {
|
345
|
+
if (appChatId.value) return;
|
346
|
+
|
347
|
+
const resp = await getInformationApi(props.tokenAuth);
|
348
|
+
|
349
|
+
if(!resp) return;
|
350
|
+
|
351
|
+
information.value = resp;
|
352
|
+
appChatId.value = resp.appChat.id;
|
353
|
+
notViewed.value = resp.appChat.totalNoVistosCliente;
|
354
|
+
connectMsWebSocket(resp)
|
355
|
+
getMessages();
|
356
|
+
emit("not-viewed-total", resp.appChat.totalNoVistosCliente);
|
357
|
+
});
|
358
|
+
|
359
|
+
onUnmounted(() => {
|
360
|
+
socketService.value.off();
|
361
|
+
});
|
345
362
|
</script>
|
346
363
|
|
347
364
|
<style scoped>
|
@@ -57,7 +57,6 @@
|
|
57
57
|
import { PropType, ref } from "vue";
|
58
58
|
import Chat from "./Chat.vue";
|
59
59
|
import IconWidget from "./IconWidget.vue";
|
60
|
-
import { VirtualHost } from '../dto/app.dto';
|
61
60
|
import IconTelegram from "./IconTelegram.vue";
|
62
61
|
import IconWhatsApp from "./IconWhatsApp.vue";
|
63
62
|
import IconChat from "./IconChat.vue";
|