|
|
@@ -1,5 +1,5 @@
|
|
|
import { ref } from "vue";
|
|
|
-import { listarConversas, listarMensagensConversa, responderConversa, excluirConversa as excluirConversaApi, buscarMidiaBlob } from "../api/conversas.js";
|
|
|
+import { listarConversas, listarMensagensConversa, responderConversa, excluirConversa as excluirConversaApi, buscarMidiaBlob, gerarSugestaoResposta } from "../api/conversas.js";
|
|
|
|
|
|
let singleton;
|
|
|
|
|
|
@@ -27,6 +27,9 @@ export function useConversas() {
|
|
|
const enviando = ref(false);
|
|
|
const midiaUrls = ref({});
|
|
|
const midiaErros = ref({});
|
|
|
+ const sugestao = ref(null);
|
|
|
+ const sugestaoLoading = ref(false);
|
|
|
+ const sugestaoError = ref("");
|
|
|
|
|
|
let pollTimer = null;
|
|
|
let ultimoTimestamp = null;
|
|
|
@@ -76,6 +79,24 @@ export function useConversas() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ async function buscarSugestao() {
|
|
|
+ if(!conversaAtivaId.value) return;
|
|
|
+ const idAlvo = conversaAtivaId.value;
|
|
|
+ sugestaoLoading.value = true;
|
|
|
+ sugestaoError.value = "";
|
|
|
+ try {
|
|
|
+ const { sugestao: texto } = await gerarSugestaoResposta(idAlvo);
|
|
|
+ if ( conversaAtivaId.value !== idAlvo) return;
|
|
|
+ sugestao.value = texto;
|
|
|
+ } catch (err){
|
|
|
+ if ( conversaAtivaId.value !== idAlvo) return;
|
|
|
+ sugestao.value = null;
|
|
|
+ sugestaoError.value = err?.message ?? "Falha ao gerar sugestão";
|
|
|
+ } finally {
|
|
|
+ if (conversaAtivaId.value === idAlvo) sugestaoLoading.value = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
async function buscarNovasMensagens() {
|
|
|
if (!conversaAtivaId.value || buscandoNovasMensagens) return;
|
|
|
buscandoNovasMensagens = true;
|
|
|
@@ -86,6 +107,7 @@ export function useConversas() {
|
|
|
const novas = results.filter((m) => !idsExistentes.has(m.Id));
|
|
|
mensagens.value = [...mensagens.value, ...novas];
|
|
|
ultimoTimestamp = results[results.length - 1].Timestamp;
|
|
|
+ if ( novas.some((m) => m.Direcao === "entrada")) buscarSugestao();
|
|
|
}
|
|
|
await carregarConversas();
|
|
|
} catch {
|
|
|
@@ -109,6 +131,9 @@ export function useConversas() {
|
|
|
if (conversaAtivaId.value !== id) return;
|
|
|
mensagens.value = results;
|
|
|
ultimoTimestamp = results.length > 0 ? results[results.length - 1].Timestamp : null;
|
|
|
+ sugestao.value = null;
|
|
|
+ sugestaoError.value = "";
|
|
|
+ if (results.length && results[results.length - 1].Direcao === "entrada") buscarSugestao();
|
|
|
} catch (err) {
|
|
|
if (conversaAtivaId.value !== id) return;
|
|
|
mensagensError.value = err?.message ?? "Falha ao carregar mensagens";
|
|
|
@@ -125,6 +150,8 @@ export function useConversas() {
|
|
|
mensagens.value = [];
|
|
|
limparMidiaCache();
|
|
|
ultimoTimestamp = null;
|
|
|
+ sugestao.value = null;
|
|
|
+ sugestaoError.value = "";
|
|
|
}
|
|
|
|
|
|
async function enviarResposta(texto) {
|
|
|
@@ -134,6 +161,8 @@ export function useConversas() {
|
|
|
const mensagem = await responderConversa(conversaAtivaId.value, texto.trim());
|
|
|
mensagens.value.push(mensagem);
|
|
|
ultimoTimestamp = mensagem.Timestamp;
|
|
|
+ sugestao.value = null;
|
|
|
+ sugestaoError.value = "";
|
|
|
await carregarConversas();
|
|
|
} finally {
|
|
|
enviando.value = false;
|
|
|
@@ -157,12 +186,16 @@ export function useConversas() {
|
|
|
enviando,
|
|
|
midiaUrls,
|
|
|
midiaErros,
|
|
|
+ sugestao,
|
|
|
+ sugestaoLoading,
|
|
|
+ sugestaoError,
|
|
|
resolverMidia,
|
|
|
carregarConversas,
|
|
|
abrirConversa,
|
|
|
fecharConversa,
|
|
|
enviarResposta,
|
|
|
- excluirConversa
|
|
|
+ excluirConversa,
|
|
|
+ buscarSugestao
|
|
|
};
|
|
|
|
|
|
return singleton;
|