index.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import type { AxiosRequestConfig } from 'axios'
  2. import axios from 'axios'
  3. import { storeToRefs } from 'pinia'
  4. import NProgress from 'nprogress'
  5. import { useSettingsStore, useUserStore } from '@/pinia'
  6. import 'nprogress/nprogress.css'
  7. import router from '@/routes'
  8. import use2FAModal from '@/components/TwoFA/use2FAModal'
  9. const user = useUserStore()
  10. const settings = useSettingsStore()
  11. const { token, secureSessionId } = storeToRefs(user)
  12. const instance = axios.create({
  13. baseURL: import.meta.env.VITE_API_ROOT,
  14. timeout: 50000,
  15. headers: { 'Content-Type': 'application/json' },
  16. transformRequest: [function (data, headers) {
  17. if (!(headers) || headers['Content-Type'] === 'multipart/form-data;charset=UTF-8')
  18. return data
  19. else
  20. headers['Content-Type'] = 'application/json'
  21. return JSON.stringify(data)
  22. }],
  23. })
  24. instance.interceptors.request.use(
  25. config => {
  26. NProgress.start()
  27. if (token.value) {
  28. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  29. (config.headers as any).Authorization = token.value
  30. }
  31. if (settings.environment.id) {
  32. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  33. (config.headers as any)['X-Node-ID'] = settings.environment.id
  34. }
  35. if (secureSessionId.value) {
  36. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  37. (config.headers as any)['X-Secure-Session-ID'] = secureSessionId.value
  38. }
  39. return config
  40. },
  41. err => {
  42. return Promise.reject(err)
  43. },
  44. )
  45. instance.interceptors.response.use(
  46. response => {
  47. NProgress.done()
  48. return Promise.resolve(response.data)
  49. },
  50. async error => {
  51. NProgress.done()
  52. const otpModal = use2FAModal()
  53. switch (error.response.status) {
  54. case 401:
  55. secureSessionId.value = ''
  56. await otpModal.open()
  57. break
  58. case 403:
  59. user.logout()
  60. await router.push('/login')
  61. break
  62. }
  63. return Promise.reject(error.response.data)
  64. },
  65. )
  66. const http = {
  67. get(url: string, config: AxiosRequestConfig = {}) {
  68. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  69. return instance.get<any, any>(url, config)
  70. },
  71. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  72. post(url: string, data: any = undefined, config: AxiosRequestConfig = {}) {
  73. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  74. return instance.post<any, any>(url, data, config)
  75. },
  76. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  77. put(url: string, data: any = undefined, config: AxiosRequestConfig = {}) {
  78. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  79. return instance.put<any, any>(url, data, config)
  80. },
  81. delete(url: string, config: AxiosRequestConfig = {}) {
  82. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  83. return instance.delete<any, any>(url, config)
  84. },
  85. patch(url: string, config: AxiosRequestConfig = {}) {
  86. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  87. return instance.patch<any, any>(url, config)
  88. },
  89. }
  90. export default http