You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
1.4 KiB

2 years ago
  1. import Axios, {AxiosError, AxiosRequestConfig, AxiosResponse} from "axios";
  2. interface Response<T> {
  3. code: number
  4. message: string
  5. data: T
  6. }
  7. export async function getRequest<T>(url: string): Promise<T> {
  8. return sendRequest<T>({
  9. method: "GET",
  10. url: `/api${url}`,
  11. responseType: "json",
  12. });
  13. }
  14. export function postRequest<T>(url: string, data: object = {}): Promise<T> {
  15. return sendRequest<T>({
  16. method: "POST",
  17. url: `/api${url}`,
  18. responseType: "json",
  19. data,
  20. });
  21. }
  22. export function putRequest<T>(url: string, data: object): Promise<T> {
  23. return sendRequest<T>({
  24. method: "PUT",
  25. url: `/api${url}`,
  26. responseType: "json",
  27. data,
  28. });
  29. }
  30. export function deleteRequest<T>(url: string): Promise<T> {
  31. return sendRequest<T>({
  32. method: "DELETE",
  33. url: `/api${url}`,
  34. responseType: "json",
  35. });
  36. }
  37. async function sendRequest<T>(config: AxiosRequestConfig): Promise<T> {
  38. try {
  39. const res = await Axios(config);
  40. return await handleResponse(res);
  41. } catch (e) {
  42. return await handleResponse((e as AxiosError).response as AxiosResponse);
  43. }
  44. }
  45. function handleResponse<T>(response: AxiosResponse): Promise<T> {
  46. const obj: Response<T> = response.data;
  47. if (![200, 201].includes(response.status)) {
  48. if (response.status === 403) {
  49. return Promise.reject(obj.message);
  50. }
  51. }
  52. return Promise.resolve(obj.data);
  53. }