leonardo 2 місяців тому
батько
коміт
5b4831bf07
3 змінених файлів з 22 додано та 21 видалено
  1. 4 11
      src/api/auth.js
  2. 10 7
      src/api/client.js
  3. 8 3
      src/composables/useChat.js

+ 4 - 11
src/api/auth.js

@@ -1,4 +1,4 @@
-import { apiBaseUrl } from "./client.js";
+import { apiBaseUrl, extractErrorMessage } from "./client.js";
 
 async function parseResponse(res) {
   const contentType = res.headers.get("content-type") ?? "";
@@ -10,13 +10,6 @@ async function parseResponse(res) {
   return text ? { message: text } : {};
 }
 
-function buildErrorMessage(payload, status) {
-  if (payload?.msg) return payload.msg;
-  if (payload?.error) return payload.error;
-  if (payload?.message) return payload.message;
-  return `http_error:${status}`;
-}
-
 export async function loginRequest({ login, senha, rememberMe = false }) {
   const res = await fetch(`${apiBaseUrl}/api/auth/login`, {
     method: "POST",
@@ -33,7 +26,7 @@ export async function loginRequest({ login, senha, rememberMe = false }) {
   const payload = await parseResponse(res);
 
   if (!res.ok || payload?.status === false) {
-    throw new Error(buildErrorMessage(payload, res.status));
+    throw new Error(extractErrorMessage(payload, res.status));
   }
 
   return payload;
@@ -51,7 +44,7 @@ export async function refreshTokenRequest({ refreshToken }) {
   const payload = await parseResponse(res);
 
   if (!res.ok || payload?.status === false) {
-    throw new Error(buildErrorMessage(payload, res.status));
+    throw new Error(extractErrorMessage(payload, res.status));
   }
 
   return payload;
@@ -69,7 +62,7 @@ export async function logoutRequest({ refreshToken } = {}) {
   const payload = await parseResponse(res);
 
   if (!res.ok || payload?.status === false) {
-    throw new Error(buildErrorMessage(payload, res.status));
+    throw new Error(extractErrorMessage(payload, res.status));
   }
 
   return payload;

+ 10 - 7
src/api/client.js

@@ -1,5 +1,12 @@
 export const apiBaseUrl = import.meta.env.VITE_API_URL ?? "http://localhost:3001";
 
+export function extractErrorMessage(payload, status) {
+  if (payload?.msg) return payload.msg;
+  if (payload?.error) return payload.error;
+  if (payload?.message) return payload.message;
+  return `http_error:${status}`;
+}
+
 let _accessToken = null;
 let _refreshFn = null;
 let _authErrorFn = null;
@@ -58,13 +65,9 @@ export async function apiFetch(path, { method = "GET", body } = {}) {
 
   if (!res.ok) {
     const text = await res.text().catch(() => "");
-    let message = text;
-    try {
-      const parsed = JSON.parse(text);
-      if (parsed?.msg) message = parsed.msg;
-      else if (parsed?.error) message = parsed.error;
-    } catch {}
-    throw new Error(message || `http_error:${res.status}`);
+    let payload = null;
+    try { payload = JSON.parse(text); } catch {}
+    throw new Error(extractErrorMessage(payload, res.status) || text || `http_error:${res.status}`);
   }
 
   const contentType = res.headers.get("content-type") ?? "";

+ 8 - 3
src/composables/useChat.js

@@ -7,6 +7,7 @@ import {
   updateConversationTitle as updateConversationTitleAPI,
   deleteConversation as deleteConversationAPI
 } from "../api/conversations.js";
+import { useToast } from "./useToast.js";
 
 let singleton;
 let _streamAbort = null;
@@ -22,6 +23,8 @@ export function resetChatSingleton() {
 export function useChat() {
   if (singleton) return singleton;
 
+  const toast = useToast();
+
   const defaultMessages = [
     {
       role: "assistant",
@@ -65,7 +68,9 @@ export function useChat() {
       }));
     } catch (err) {
       conversations.value = [];
-      conversationsError.value = err?.message || "Erro ao carregar conversas.";
+      if (err?.message !== "session_expired") {
+        conversationsError.value = err?.message || "Erro ao carregar conversas.";
+      }
     } finally {
       conversationsLoading.value = false;
     }
@@ -100,7 +105,7 @@ export function useChat() {
     try {
       await updateConversationTitleAPI(numId, title.trim());
     } catch {
-      // falha ao renomear é silenciosa — o estado local já foi atualizado
+      toast.erro("Não foi possível renomear a conversa.");
     }
     conversations.value = conversations.value.map((c) =>
       c.id === strId ? { ...c, title: title.trim() } : c
@@ -114,7 +119,7 @@ export function useChat() {
     try {
       await deleteConversationAPI(numId);
     } catch {
-      // falha ao excluir é silenciosa — o estado local já foi atualizado
+      toast.erro("Não foi possível excluir a conversa.");
     }
     conversations.value = conversations.value.filter((c) => c.id !== strId);
     if (String(activeConversationId.value) === strId) {