axios.ts 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import { Response } from "@/types";
  2. import { Toast } from "antd-mobile";
  3. import axios, { AxiosInstance, AxiosResponse, InternalAxiosRequestConfig } from "axios";
  4. import type { AxiosOptions } from "./type";
  5. import { setupConfig } from "@/api/setup";
  6. import { defaultLocale } from "@/i18n/routing";
  7. import { getCookies, getToken } from "@/utils/Cookies";
  8. interface CustomRequestConfig {
  9. toast?: boolean;
  10. }
  11. const getInitBaseUrl = () => {
  12. const str = sessionStorage.getItem("config");
  13. if (str) return JSON.parse(str);
  14. return fetch("https://static.tiktokjakjkl.icu/test/index.json")
  15. .then((res) => res.json())
  16. .then((config) => {
  17. sessionStorage.setItem("config", JSON.stringify(config));
  18. return config;
  19. });
  20. };
  21. const errorHandle = (status: number): void => {
  22. const msgMap: Record<number, string> = {
  23. 1022: "Restrição anormal de conta",
  24. 6002: "Nenhum bônus não pode ser reclamado no modo bônus ativado",
  25. 6001: "As condições do bônus de esvaziamento não são atendidas",
  26. };
  27. const msg = msgMap[status];
  28. if (msg) {
  29. Toast.show({
  30. icon: "fail",
  31. content: msg,
  32. });
  33. }
  34. };
  35. export default class Request {
  36. private axiosInstance: AxiosInstance;
  37. private readonly options: AxiosOptions;
  38. constructor(options: AxiosOptions) {
  39. this.axiosInstance = axios.create(options);
  40. this.options = options;
  41. this.setupInterceptors();
  42. }
  43. setupInterceptors() {
  44. // 定义拦截器
  45. const {
  46. options: { transform },
  47. axiosInstance,
  48. } = this;
  49. // 如果没有自定义拦截器则返回
  50. if (!transform) {
  51. return;
  52. }
  53. // 解包拦截器
  54. const {
  55. requestInterceptor,
  56. requestInterceptorCatch,
  57. responseInterceptor,
  58. responseInterceptorCatch,
  59. } = transform;
  60. /**
  61. * @description 全局请求拦截
  62. */
  63. axiosInstance.interceptors.request.use(
  64. async (config: InternalAxiosRequestConfig & CustomRequestConfig) => {
  65. const result = await setupConfig();
  66. config.baseURL = result.NEXT_PUBLIC_BASE_URL;
  67. if (requestInterceptor) {
  68. config = requestInterceptor(config);
  69. // header请求头添加token
  70. config.headers["Token"] = getToken() || "";
  71. config.headers["language"] = getCookies("language") || defaultLocale;
  72. config.headers["x-renter-id"] =
  73. document?.querySelector("html")?.dataset?.renterid;
  74. if (config && config?.toast) {
  75. Toast.show({
  76. icon: "loading",
  77. maskClickable: false,
  78. });
  79. }
  80. }
  81. return config;
  82. },
  83. (error) => {
  84. if (requestInterceptorCatch) {
  85. requestInterceptorCatch(error);
  86. }
  87. }
  88. );
  89. /**
  90. * @description 全局响应拦截
  91. */
  92. axiosInstance.interceptors.response.use(
  93. (res) => {
  94. // Toast.clear();
  95. if (responseInterceptor) {
  96. res = responseInterceptor(res);
  97. }
  98. return res;
  99. },
  100. (error) => {
  101. if (responseInterceptorCatch) {
  102. responseInterceptorCatch(error);
  103. }
  104. Toast.clear();
  105. }
  106. );
  107. }
  108. /**
  109. * @description 单个实列请求
  110. */
  111. request<T = unknown, R = unknown>(config: AxiosOptions): Promise<Response<T> & R> {
  112. return new Promise((resolve, reject) => {
  113. this.axiosInstance
  114. .request<unknown, AxiosResponse<Response<T> & R>>(config)
  115. .then(async (res) => {
  116. const { transform } = config;
  117. if (transform && transform.responseInterceptor) {
  118. res = transform.responseInterceptor(res);
  119. }
  120. if ((res && res.data && res.data.code === 200) || res?.data?.code === 2000) {
  121. resolve(res.data);
  122. } else {
  123. if (res.data?.code) {
  124. errorHandle(res.data?.code);
  125. }
  126. reject(res);
  127. }
  128. })
  129. .catch((error) => {
  130. reject(error);
  131. });
  132. });
  133. }
  134. get<T, R = unknown>(config: AxiosOptions): Promise<Response<T> & R> {
  135. return this.request({ ...config, method: "get" });
  136. }
  137. post<T, R = unknown>(config: AxiosOptions): Promise<Response<T> & R> {
  138. return this.request({ ...config, method: "post" });
  139. }
  140. put<T, R = unknown>(config: AxiosOptions): Promise<Response<T> & R> {
  141. return this.request({ ...config, method: "put" });
  142. }
  143. delete<T, R = unknown>(config: AxiosOptions): Promise<Response<T> & R> {
  144. return this.request({ ...config, method: "delete" });
  145. }
  146. }