File size: 2,655 Bytes
01d5a5d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/* eslint-disable no-console */
import type { AxiosRequestConfig, AxiosRequestHeaders, AxiosResponse } from 'axios';
import axios from 'axios';

const service = axios.create({
  baseURL: '',
  timeout: 600 * 1000, // Timeout in milliseconds
  headers: {
    'Content-Type': 'application/json', //'application/json;charset=UTF-8',
    lang: 'en-US'.toLowerCase()
  },
  withCredentials: true // Allow cross-domain requests with cookies
});

export function Request<T = unknown, D = unknown>(configParam: AxiosRequestConfig) {
  return service.request<T, AxiosResponse<T>, D>(configParam);
}

export function POST<T = unknown>(configParam: AxiosRequestConfig) {
  return service.request<T, AxiosResponse<T>>({
    ...configParam,
    method: 'post'
  });
}

export function GET<T = unknown>(configParam: AxiosRequestConfig) {
  return service.request<T, AxiosResponse<T>>({
    ...configParam,
    method: 'get'
  });
}

export function DELETE<T = unknown>(configParam: AxiosRequestConfig) {
  return service.request<T, AxiosResponse<T>>({
    ...configParam,
    method: 'delete'
  });
}

/**
 * HTTP request interceptor
 */
service.interceptors.request.use(
  (config) => {
    const headers = config.headers ?? {};
    const timestamp = Date.now().toString();

    if (headers['Content-Type'] === 'application/json') {
      config.data = JSON.stringify(config.data);
    }

    if (!localStorage.getItem('upload') && window.location.pathname !== '/') {
      return Promise.reject('Please login first').finally(() => {
        setTimeout(() => {
          window.location.href = '/';
        }, 500);
      });
    }

    config.headers = {
      timestamp: timestamp,
      ...config.headers
    } as unknown as AxiosRequestHeaders;

    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

/**
 * HTTP response interceptor
 */
service.interceptors.response.use(
  (response) => {
    return checkStatus(response);
  },
  (error) => {
    console.log('Request error:', error);

    if (error.response) {
      console.log('Response error data:', error.response.data);
      console.log('Response error status:', error.response.status);
      console.log('Response error headers:', error.response.headers);
    } else if (error.request) {
      console.log('No response received:', error.request);
    } else {
      console.log('Error setting up request:', error.message);
    }

    throw error;
  }
);

const checkStatus = (response: any) => {
  // server check for custom code

  // http check
  if (response.status >= 200 && response.status < 300) {
    // HTTP normal
    return response;
  }

  return response.json();
};