leonardo 1 ヶ月 前
コミット
9fee52d422
3 ファイル変更30 行追加12 行削除
  1. 22 10
      src/composables/useChat.js
  2. 3 1
      src/composables/useConversas.js
  3. 5 1
      src/composables/useSearch.js

+ 22 - 10
src/composables/useChat.js

@@ -126,9 +126,11 @@ export function useChat() {
       const numId = Number(strId);
       if (!numId) return;
       const data = await getConversationMessages(numId);
+      if (activeConversationId.value !== strId) return;
       const normalized = normalizeApiMessages(data?.items);
       messages.value = normalized.length ? normalized : [...defaultMessages];
     } catch (err) {
+      if (activeConversationId.value !== strId) return;
       messages.value = [...defaultMessages];
       if (err?.message !== "session_expired") {
         conversationsError.value = "Erro ao carregar mensagens da conversa.";
@@ -178,16 +180,23 @@ export function useChat() {
   async function exportConversation(id) {
     const numId = Number(String(id ?? "").trim());
     if (!numId) return;
-    const data = await exportConversationAPI(numId);
-    const conv = conversations.value.find((c) => c.id === String(id));
-    const filename = `conversa-${conv?.title?.slice(0, 40).replace(/[^a-zA-Z0-9À-ÿ\s]/g, "").trim().replace(/\s+/g, "-") || numId}.md`;
-    const blob = new Blob([data.markdown ?? ""], { type: "text/markdown" });
-    const url = URL.createObjectURL(blob);
-    const a = document.createElement("a");
-    a.href = url;
-    a.download = filename;
-    a.click();
-    URL.revokeObjectURL(url);
+    try {
+      const data = await exportConversationAPI(numId);
+      const conv = conversations.value.find((c) => c.id === String(id));
+      const filename = `conversa-${conv?.title?.slice(0, 40).replace(/[^a-zA-Z0-9À-ÿ\s]/g, "").trim().replace(/\s+/g, "-") || numId}.md`;
+      const blob = new Blob([data.markdown ?? ""], { type: "text/markdown" });
+      const url = URL.createObjectURL(blob);
+      const a = document.createElement("a");
+      a.href = url;
+      a.download = filename;
+      a.click();
+      URL.revokeObjectURL(url);
+    } catch (err) {
+      if (err?.message !== "session_expired") {
+        toast.erro("Não foi possível exportar a conversa.");
+        console.warn("[useChat] exportConversation:", err);
+      }
+    }
   }
 
   function searchConversations(query) {
@@ -232,6 +241,9 @@ export function useChat() {
       try {
         const title = trimmed.slice(0, 60);
         const conv = await createConversation(title);
+        if (_streamAbort !== abortController) {
+          return;
+        }
         convId = conv.id;
         activeConversationId.value = String(convId);
         const now = Date.now();

+ 3 - 1
src/composables/useConversas.js

@@ -98,12 +98,14 @@ export function useConversas() {
 
     try {
       const { results } = await listarMensagensConversa(id);
+      if (conversaAtivaId.value !== id) return;
       mensagens.value = results;
       ultimoTimestamp = results.length > 0 ? results[results.length - 1].Timestamp : null;
     } catch (err) {
+      if (conversaAtivaId.value !== id) return;
       mensagensError.value = err?.message ?? "Falha ao carregar mensagens";
     } finally {
-      mensagensLoading.value = false;
+      if (conversaAtivaId.value === id) mensagensLoading.value = false;
     }
 
     pollTimer = setInterval(buscarNovasMensagens, POLL_INTERVAL_MS);

+ 5 - 1
src/composables/useSearch.js

@@ -5,20 +5,24 @@ export function useSearch() {
   const results = ref([]);
   const loading = ref(false);
   const error = ref("");
+  let requestId = 0;
 
   async function run(query) {
     const q = String(query ?? "").trim();
     if (!q) return;
+    const currentRequest = ++requestId;
     loading.value = true;
     error.value = "";
     try {
       const data = await search(q);
+      if (currentRequest !== requestId) return;
       results.value = data.results ?? [];
     } catch (e) {
+      if (currentRequest !== requestId) return;
       error.value = e?.message || "erro";
       results.value = [];
     } finally {
-      loading.value = false;
+      if (currentRequest === requestId) loading.value = false;
     }
   }