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.

81 lines
1.8 KiB

  1. import Axios, {AxiosError, AxiosRequestConfig, AxiosResponse} from "axios";
  2. interface Response<T> {
  3. code: number
  4. message: string
  5. data: T
  6. }
  7. export const authError = new Error("unauthenticated");
  8. export async function getRequest<T>(url: string): Promise<T> {
  9. const cors = url.includes("//");
  10. return sendRequest<T>({
  11. method: "GET",
  12. url: cors ? url : `/api${url}`,
  13. responseType: "json",
  14. }, cors);
  15. }
  16. export function postRequest<T>(url: string, data: object = {}): Promise<T> {
  17. return sendRequest<T>({
  18. method: "POST",
  19. url: `/api${url}`,
  20. responseType: "json",
  21. data,
  22. });
  23. }
  24. export function putRequest<T>(url: string, data: object): Promise<T> {
  25. return sendRequest<T>({
  26. method: "PUT",
  27. url: `/api${url}`,
  28. responseType: "json",
  29. data,
  30. });
  31. }
  32. export function deleteRequest<T>(url: string): Promise<T> {
  33. return sendRequest<T>({
  34. method: "DELETE",
  35. url: `/api${url}`,
  36. responseType: "json",
  37. });
  38. }
  39. async function sendRequest<T>(config: AxiosRequestConfig, cors: boolean = false): Promise<T> {
  40. try {
  41. const res = await Axios(config);
  42. return await handleResponse(res, cors);
  43. } catch (e) {
  44. if (e === authError) {
  45. throw e;
  46. }
  47. return await handleResponse((e as AxiosError).response as AxiosResponse);
  48. }
  49. }
  50. function handleResponse<T>(response: AxiosResponse, object: boolean = false): Promise<T> {
  51. if (object) {
  52. return Promise.resolve(response.data);
  53. } else {
  54. const obj: Response<T> | undefined = response?.data;
  55. if (![200, 201].includes(response.status)) {
  56. if (response.status === 403) {
  57. return Promise.reject(authError);
  58. } else {
  59. return Promise.reject(obj?.message || "Ukjent feil");
  60. }
  61. }
  62. if (!obj) {
  63. return Promise.reject("Ingen data mottatt");
  64. }
  65. return Promise.resolve(obj.data);
  66. }
  67. }