|
|
@@ -3,6 +3,42 @@ import { ref } from 'vue';
|
|
|
import axios from 'axios';
|
|
|
import { useUserStore } from './user';
|
|
|
|
|
|
+let refreshTokenPromise: Promise<any> | null = null;
|
|
|
+
|
|
|
+axios.interceptors.response.use(
|
|
|
+ response => response,
|
|
|
+ async error => {
|
|
|
+ const originalRequest = error.config;
|
|
|
+
|
|
|
+ if (error.response?.status === 401 && !originalRequest._retry) {
|
|
|
+ originalRequest._retry = true;
|
|
|
+
|
|
|
+ if (!refreshTokenPromise) {
|
|
|
+ const userStore = useUserStore();
|
|
|
+ refreshTokenPromise = axios.post(
|
|
|
+ `${import.meta.env.VITE_API_URL}/users/refresh`,
|
|
|
+ { refresh_token: userStore.refreshToken }
|
|
|
+ ).finally(() => { refreshTokenPromise = null; });
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ const { data } = await refreshTokenPromise;
|
|
|
+ const userStore = useUserStore();
|
|
|
+ userStore.setUser({ userId: data.access_token, name: userStore.name!, refreshToken: data.refresh_token });
|
|
|
+ originalRequest.headers.Authorization = `Bearer ${data.access_token}`;
|
|
|
+ return axios(originalRequest);
|
|
|
+ } catch {
|
|
|
+ const userStore = useUserStore();
|
|
|
+ userStore.logout();
|
|
|
+ window.location.href = '/';
|
|
|
+ return Promise.reject(error);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return Promise.reject(error);
|
|
|
+ }
|
|
|
+);
|
|
|
+
|
|
|
interface FormattedMessage {
|
|
|
role: 'user' | 'assistant';
|
|
|
content: string;
|
|
|
@@ -119,6 +155,7 @@ export const useChatStore = defineStore('chat', () => {
|
|
|
displayContent: data.message.content,
|
|
|
...blankMeta(),
|
|
|
});
|
|
|
+ isLoading.value = false;
|
|
|
}
|
|
|
} catch (error) {
|
|
|
console.error('Error sending message: ', error);
|
|
|
@@ -127,7 +164,6 @@ export const useChatStore = defineStore('chat', () => {
|
|
|
displayContent: 'Error: unable to process request',
|
|
|
...blankMeta(),
|
|
|
});
|
|
|
- } finally {
|
|
|
isLoading.value = false;
|
|
|
}
|
|
|
};
|
|
|
@@ -238,6 +274,7 @@ export const useChatStore = defineStore('chat', () => {
|
|
|
} else {
|
|
|
messages.value[aiMessageIndex].isStreaming = false;
|
|
|
messages.value[aiMessageIndex].phase = 'done';
|
|
|
+ isLoading.value = false;
|
|
|
}
|
|
|
};
|
|
|
waitTypingDone();
|
|
|
@@ -245,6 +282,7 @@ export const useChatStore = defineStore('chat', () => {
|
|
|
} catch (error) {
|
|
|
console.error('Stream error:', error);
|
|
|
messages.value.splice(aiMessageIndex, 1);
|
|
|
+ isLoading.value = false;
|
|
|
throw error;
|
|
|
}
|
|
|
};
|