diff --git a/src/components/instance/InstanceBody.vue b/src/components/instance/InstanceBody.vue index 3327548..d2d0898 100644 --- a/src/components/instance/InstanceBody.vue +++ b/src/components/instance/InstanceBody.vue @@ -28,7 +28,8 @@ import Chatwoot from "./settings/Chatwoot.vue"; import Typebot from "./settings/Typebot.vue"; import MyGroups from "./message/MyGroups.vue"; - +import MyChats from "./message/MyChats.vue"; +import HasWhatsapp from "./message/HasWhatsapp.vue"; export default { components: { Webhook, @@ -36,7 +37,9 @@ export default { Rabbitmq, Chatwoot, Typebot, - MyGroups + MyGroups, + MyChats, + HasWhatsapp, }, data: () => ({ tab: "settings", @@ -51,7 +54,7 @@ export default { id: "message", icon: "mdi-message", title: "Mensagens", - components: ["MyGroups"], + components: ["HasWhatsapp","MyGroups", "MyChats"], }, ], }), diff --git a/src/components/instance/message/HasWhatsapp.vue b/src/components/instance/message/HasWhatsapp.vue new file mode 100644 index 0000000..06f7821 --- /dev/null +++ b/src/components/instance/message/HasWhatsapp.vue @@ -0,0 +1,117 @@ + + + diff --git a/src/components/instance/message/MyChats.vue b/src/components/instance/message/MyChats.vue new file mode 100644 index 0000000..9c1d435 --- /dev/null +++ b/src/components/instance/message/MyChats.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/src/components/instance/message/MyGroups.vue b/src/components/instance/message/MyGroups.vue index 7427107..ff94fc4 100644 --- a/src/components/instance/message/MyGroups.vue +++ b/src/components/instance/message/MyGroups.vue @@ -35,6 +35,11 @@ :headers="[ { title: 'Nome', value: 'subject' }, { title: 'ID', value: 'id', align: 'center' }, + { + title: 'Criado em', + value: 'creation', + align: 'center', + }, ]" :items="groups" :no-data-text="loading ? '' : 'Nenhum grupo encontrado'" @@ -43,6 +48,7 @@ :items-per-page="5" class="elevation-0" > + + + + + @@ -73,7 +80,7 @@ import instanceController from "@/services/instanceController"; export default { - name: "InstanceWebsocket", + name: "MyGroups", props: { instance: { type: Object, @@ -90,8 +97,12 @@ export default { }), methods: { + formatTimestamp(timestamp) { + if (!timestamp) return ""; + return new Date(timestamp).toLocaleString(); + }, copy(group) { - if(this.copied.includes(group.id)) return + if (this.copied.includes(group.id)) return; const el = document.createElement("textarea"); el.value = group.id; diff --git a/src/components/modal/ConnectPhone.vue b/src/components/modal/ConnectPhone.vue index a507270..da593dc 100644 --- a/src/components/modal/ConnectPhone.vue +++ b/src/components/modal/ConnectPhone.vue @@ -70,6 +70,7 @@ export default { if (response.base64) this.qrCode = response.base64; else if (response.instance) { this.dialog = false; + this.AppStore.reconnect(); return; } else throw new Error("Não foi possível carregar o QR Code, se o erro persistir, reinicie a API e tente novamente."); diff --git a/src/services/instanceChatController.js b/src/services/instanceChatController.js new file mode 100644 index 0000000..ecfdec6 --- /dev/null +++ b/src/services/instanceChatController.js @@ -0,0 +1,33 @@ + +import http from "../http-common"; + +const getAll = async (instanceName) => { + return await http + .get("/chat/findChats/:instance", { + params: { + instance: instanceName + } + }) + .then((r) => r.data) + .catch((error) => { + throw error.response?.data || error.response || error; + }); +} + +const hasWhatsapp = async (instanceName, numbers) => { + return await http + .post("/chat/whatsappNumbers/:instance", { numbers }, { + params: { + instance: instanceName + } + }) + .then((r) => r.data) + .catch((error) => { + throw error.response?.data || error.response || error; + }); +} + +export default { + getAll: getAll, + hasWhatsapp: hasWhatsapp +} \ No newline at end of file diff --git a/src/services/instanceController.js b/src/services/instanceController.js index ca39c75..0b83239 100644 --- a/src/services/instanceController.js +++ b/src/services/instanceController.js @@ -58,8 +58,22 @@ const restart = async (instanceName) => { }); } +const deleteInstance = async (instanceName) => { + return await http + .delete("/instance/delete/:instance", { + params: { + instance: instanceName + } + }) + .then((r) => r.data) + .catch((error) => { + throw error.response?.data || error.response || error; + }); +} + import settings from "./instanceSettingsController.js"; import group from "./instanceGroupController.js"; +import chat from "./instanceChatController.js"; export default { fetchAll, @@ -67,7 +81,9 @@ export default { connect, logout, restart, + delete: deleteInstance, ...settings, - group + group, + chat }; diff --git a/src/views/Home.vue b/src/views/Home.vue index 0e5ff7e..4cf2c1d 100644 --- a/src/views/Home.vue +++ b/src/views/Home.vue @@ -32,7 +32,7 @@ :items-per-page="10" > + @@ -63,26 +64,30 @@ {{ statusMapper[item.instance.status].text }} + @@ -97,6 +102,7 @@ import { useAppStore } from "@/store/app"; import CreateInstance from "@/components/modal/CreateInstance"; import statusMapper from "@/helpers/mappers/status"; +import instanceController from "@/services/instanceController"; export default { name: "HomeInstance", @@ -106,6 +112,7 @@ export default { data: () => ({ AppStore: useAppStore(), loading: false, + loadingDelete: false, error: false, statusMapper: statusMapper, headers: [ @@ -123,6 +130,24 @@ export default { addInstance() { this.$refs.createInstanceModal.open(); }, + async deleteInstance(instanceName) { + try { + this.loadingDelete = instanceName; + const confirm = window.confirm( + `Tem certeza que deseja excluir a instância ${instanceName}?` + ); + if (!confirm) return; + + + await instanceController.logout(instanceName).catch(() => {}); + await instanceController.delete(instanceName); + await this.AppStore.reconnect(); + } catch (e) { + this.error = e.message?.message || e.message || e; + } finally { + this.loadingDelete = false; + } + }, async getInstances() { try { this.loading = true;