| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  | import axios from "axios"; | 
					
						
							|  |  |  | import { alert } from "~/composables/use-toast"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export default defineNuxtPlugin(() => { | 
					
						
							|  |  |  |   const tokenName = useRuntimeConfig().public.AUTH_TOKEN; | 
					
						
							|  |  |  |   const axiosInstance = axios.create({ | 
					
						
							| 
									
										
										
										
											2025-08-25 12:28:43 -05:00
										 |  |  |     // timeout removed to allow backend to handle timeouts
 | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     baseURL: "/", // api calls already pass with /api
 | 
					
						
							|  |  |  |     withCredentials: true, | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   axiosInstance.interceptors.request.use( | 
					
						
							|  |  |  |     (config) => { | 
					
						
							| 
									
										
										
										
											2025-09-27 12:26:02 -05:00
										 |  |  |       const token = useCookie(tokenName).value; | 
					
						
							|  |  |  |       if (token) { | 
					
						
							|  |  |  |         config.headers.Authorization = `Bearer ${token}`; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       return config; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     (error) => { | 
					
						
							|  |  |  |       return Promise.reject(error); | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |   ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Add response interceptor
 | 
					
						
							|  |  |  |   axiosInstance.interceptors.response.use( | 
					
						
							|  |  |  |     (response) => { | 
					
						
							|  |  |  |       if (response?.data?.message) alert.info(response.data.message as string); | 
					
						
							|  |  |  |       return response; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     (error) => { | 
					
						
							| 
									
										
										
										
											2025-09-21 19:51:19 -05:00
										 |  |  |       if (error?.response?.data?.detail?.message) { | 
					
						
							|  |  |  |         alert.error(error.response.data.detail.message as string); | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // If we receive a 401 Unauthorized response, clear the token cookie and redirect to login
 | 
					
						
							|  |  |  |       if (error?.response?.status === 401) { | 
					
						
							|  |  |  |         // If tokenCookie is not set, we may just be an unauthenticated user using the wrong API, so don't redirect
 | 
					
						
							|  |  |  |         const tokenCookie = useCookie(tokenName); | 
					
						
							|  |  |  |         if (tokenCookie.value) { | 
					
						
							|  |  |  |           tokenCookie.value = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           // Disable beforeunload warnings to prevent "Are you sure you want to leave?" popups
 | 
					
						
							|  |  |  |           window.onbeforeunload = null; | 
					
						
							|  |  |  |           window.location.href = "/login"; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       return Promise.reject(error); | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |   ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     provide: { | 
					
						
							|  |  |  |       axios: axiosInstance, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | }); |