Files
accounting-system/frontend/src/api/client.ts
Invoice Master 05ea67144f feat: initial project setup
- Add .NET 8 backend with Clean Architecture
- Add React + Vite + TypeScript frontend
- Implement authentication with JWT
- Implement Azure Blob Storage client
- Implement OCR integration
- Implement supplier matching service
- Implement voucher generation
- Implement Fortnox provider
- Add unit and integration tests
- Add Docker Compose configuration
2026-02-04 20:14:34 +01:00

50 lines
1.4 KiB
TypeScript

import axios from 'axios'
import { useAuthStore } from '../stores/authStore'
const apiClient = axios.create({
baseURL: import.meta.env.VITE_API_URL || 'http://localhost:5000/api/v1',
headers: {
'Content-Type': 'application/json',
},
})
apiClient.interceptors.request.use((config) => {
const token = useAuthStore.getState().accessToken
if (token) {
config.headers.Authorization = `Bearer ${token}`
}
return config
})
apiClient.interceptors.response.use(
(response) => response,
async (error) => {
const originalRequest = error.config
if (error.response?.status === 401 && !originalRequest._retry) {
originalRequest._retry = true
try {
const refreshToken = useAuthStore.getState().refreshToken
const response = await axios.post(`${apiClient.defaults.baseURL}/auth/refresh`, {
refreshToken,
})
const { accessToken, refreshToken: newRefreshToken } = response.data.data.tokens
useAuthStore.getState().updateTokens(accessToken, newRefreshToken)
originalRequest.headers.Authorization = `Bearer ${accessToken}`
return apiClient(originalRequest)
} catch (refreshError) {
useAuthStore.getState().logout()
window.location.href = '/login'
return Promise.reject(refreshError)
}
}
return Promise.reject(error)
}
)
export default apiClient