first commit

This commit is contained in:
2026-01-10 04:57:43 +00:00
parent 16a76a2cd6
commit 232968de1e
131 changed files with 43262 additions and 0 deletions

102
frontend/src/utils/axios.js Normal file
View File

@@ -0,0 +1,102 @@
import axios from 'axios'
import { useAuthStore } from '@/stores/auth'
import { useToast } from 'vue-toastification'
// Create axios instance
const axiosInstance = axios.create({
baseURL: import.meta.env.VITE_API_URL || '/api',
timeout: 15000,
withCredentials: true,
headers: {
'Content-Type': 'application/json',
},
})
// Request interceptor
axiosInstance.interceptors.request.use(
(config) => {
// You can add auth token to headers here if needed
// const token = localStorage.getItem('token')
// if (token) {
// config.headers.Authorization = `Bearer ${token}`
// }
return config
},
(error) => {
return Promise.reject(error)
}
)
// Response interceptor
axiosInstance.interceptors.response.use(
(response) => {
return response
},
async (error) => {
const toast = useToast()
const authStore = useAuthStore()
if (error.response) {
const { status, data } = error.response
switch (status) {
case 401:
// Unauthorized - token expired or invalid
if (data.code === 'TokenExpired') {
// Try to refresh token
try {
const refreshed = await authStore.refreshToken()
if (refreshed) {
// Retry the original request
return axiosInstance.request(error.config)
}
} catch (refreshError) {
// Refresh failed, logout user
authStore.clearUser()
window.location.href = '/'
}
} else {
authStore.clearUser()
toast.error('Please login to continue')
}
break
case 403:
// Forbidden
toast.error(data.message || 'Access denied')
break
case 404:
// Not found
toast.error(data.message || 'Resource not found')
break
case 429:
// Too many requests
toast.error('Too many requests. Please slow down.')
break
case 500:
// Server error
toast.error('Server error. Please try again later.')
break
default:
// Other errors
if (data.message) {
toast.error(data.message)
}
}
} else if (error.request) {
// Request made but no response
toast.error('Network error. Please check your connection.')
} else {
// Something else happened
toast.error('An unexpected error occurred')
}
return Promise.reject(error)
}
)
export default axiosInstance