UNPKG

3.11 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = exports.handleError = exports.handleResponse = exports.handleRequest = void 0;
7
8var _react = _interopRequireDefault(require("react"));
9
10var _axios = _interopRequireDefault(require("axios"));
11
12var _q3UiForms = require("q3-ui-forms");
13
14function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
16const extractResponseMeta = payload => {
17 const {
18 config,
19 data,
20 headers,
21 status
22 } = 'response' in payload ? payload.response : payload;
23 const output = {
24 data,
25 headers,
26 status
27 };
28 if (config) Object.assign(output, {
29 method: config.method,
30 url: config.url
31 });
32 return output;
33};
34
35const queryStorage = key => {
36 try {
37 return JSON.parse(localStorage.getItem(key));
38 } catch (e) {
39 return null;
40 }
41};
42
43const handleRequest = request => {
44 const cache = queryStorage(request.baseURL + request.url);
45 return cache ? Object.assign(request.headers.common, {
46 'If-Match': cache.ETag,
47 'If-Unmodified-Since': cache['Last-Modified']
48 }) : null;
49};
50
51exports.handleRequest = handleRequest;
52
53const handleResponse = d => {
54 const {
55 method,
56 status,
57 data
58 } = extractResponseMeta(d);
59
60 const startsWith = num => String(status).startsWith(String(num));
61
62 return {
63 notify(noti) {
64 if (method !== 'get' && startsWith(2) && data.message) {
65 noti.onSuccess(data.message);
66 } else if (startsWith(4) || startsWith(5)) {
67 noti.onFail(data.message);
68 }
69
70 return this;
71 },
72
73 set() {
74 return this;
75 }
76
77 };
78};
79
80exports.handleResponse = handleResponse;
81
82const handleError = e => {
83 const {
84 data,
85 status
86 } = extractResponseMeta(e);
87 return {
88 notify(noti) {
89 if (status === 412) {
90 noti.onFail('Race condition detected (412)');
91 } else if (data && data.message && status !== 404) {
92 noti.onFail(data.message);
93 }
94
95 return this;
96 },
97
98 refresh() {
99 return Promise.reject(e);
100 }
101
102 };
103};
104
105exports.handleError = handleError;
106
107var _default = () => {
108 const [loading, setLoading] = _react.default.useState(false);
109
110 const noti = (0, _q3UiForms.useNotification)();
111
112 const onRequest = _react.default.useCallback(request => {
113 setLoading(true); // handleRequest(request);
114
115 return request;
116 }, [loading]);
117
118 const onResponse = _react.default.useCallback(response => {
119 setLoading(false);
120 handleResponse(response).notify(noti).set();
121 return response;
122 }, [loading]);
123
124 const onResponseError = _react.default.useCallback(error => {
125 setLoading(false);
126
127 try {
128 return handleError(error).notify(noti).refresh(error);
129 } catch (e) {
130 return Promise.reject(error);
131 }
132 }, [loading]);
133
134 _react.default.useEffect(() => {
135 _axios.default.interceptors.request.use(onRequest, error => {
136 setLoading(false);
137 return error;
138 });
139
140 _axios.default.interceptors.response.use(onResponse, onResponseError);
141 }, [loading]);
142
143 return loading;
144};
145
146exports.default = _default;
\No newline at end of file