@capsitech/react-utilities 0.1.8 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/Hooks.js +56 -51
- package/lib/Hooks.js.map +1 -1
- package/lib/Utilities.js +6 -6
- package/lib/index.js +6 -6
- package/lib/src/Hooks/useNetworkState.js +20 -20
- package/lib/src/Hooks/useNetworkState.js.map +1 -1
- package/lib/src/Utilities/ApiUtility.axios.js +211 -205
- package/lib/src/Utilities/ApiUtility.axios.js.map +1 -1
- package/lib/src/Utilities/Countries.js +120 -114
- package/lib/src/Utilities/Countries.js.map +1 -1
- package/lib/src/Utilities/CustomEventEmitter.js +20 -17
- package/lib/src/Utilities/CustomEventEmitter.js.map +1 -1
- package/lib/src/Utilities/FastCompare.js +1 -1
- package/lib/src/Utilities/FastCompare.js.map +1 -1
- package/lib/src/Utilities/HideablePromise.js +10 -4
- package/lib/src/Utilities/HideablePromise.js.map +1 -1
- package/lib/src/Utilities/RouteUtils.js +178 -170
- package/lib/src/Utilities/RouteUtils.js.map +1 -1
- package/lib/src/Utilities/Utils.js +239 -236
- package/lib/src/Utilities/Utils.js.map +1 -1
- package/lib/src/Utilities/dayjs.js +39 -3
- package/lib/src/Utilities/dayjs.js.map +1 -1
- package/lib/src/Utilities/index.js +6 -6
- package/package.json +13 -1
- package/lib/dayjs-aKjfjjRl.mjs +0 -605
- package/lib/dayjs-aKjfjjRl.mjs.map +0 -1
|
@@ -1,222 +1,228 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
var u = Object.defineProperty;
|
|
2
|
+
var g = (i, e, t) => e in i ? u(i, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[e] = t;
|
|
3
|
+
var n = (i, e, t) => g(i, typeof e != "symbol" ? e + "" : e, t);
|
|
4
|
+
import l from "axios";
|
|
5
|
+
import { saveAs as y } from "file-saver";
|
|
6
|
+
import { stringify as f } from "qs";
|
|
7
|
+
var m = /* @__PURE__ */ ((i) => (i.get = "get", i.post = "post", i))(m || {}), A = /* @__PURE__ */ ((i) => (i.downloading = "downloading", i.done = "done", i.error = "error", i))(A || {});
|
|
8
|
+
class E {
|
|
9
|
+
constructor() {
|
|
10
|
+
n(this, "config", {});
|
|
11
|
+
// private getParams = (params?: any) => {
|
|
12
|
+
// if (params) {
|
|
13
|
+
// for (const key in params) {
|
|
14
|
+
// if (params[key] == null || params[key] === undefined || params[key] === '')
|
|
15
|
+
// delete params[key];
|
|
16
|
+
// }
|
|
17
|
+
// }
|
|
18
|
+
// return params;
|
|
19
|
+
// };
|
|
20
|
+
n(this, "getResponse", async (e, t, o) => await l.get(e, {
|
|
21
|
+
params: t,
|
|
22
|
+
paramsSerializer: {
|
|
23
|
+
serialize: (s, r) => f(t, {
|
|
24
|
+
arrayFormat: "indices",
|
|
25
|
+
allowDots: !0,
|
|
26
|
+
skipNulls: !0
|
|
27
|
+
})
|
|
28
|
+
},
|
|
29
|
+
...this._axiosOptions(o || {})
|
|
30
|
+
}));
|
|
31
|
+
n(this, "get", async (e, t, o, s) => {
|
|
32
|
+
const r = await this.getResponse(e, t, s);
|
|
33
|
+
return this.handleResponse(r, o);
|
|
34
|
+
});
|
|
35
|
+
n(this, "getResult", async (e, t, o, s) => {
|
|
36
|
+
try {
|
|
37
|
+
const r = await this.get(e, t, void 0, s);
|
|
38
|
+
if (r.status)
|
|
39
|
+
return r.result;
|
|
40
|
+
this.handleErrorResponse(r.message, r.errors);
|
|
41
|
+
} catch (r) {
|
|
42
|
+
r.isAxiosError ? this.handleAxiosError(r, o) : this.handleResponse(r, o);
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
});
|
|
46
|
+
n(this, "post", async (e, t, o, s) => {
|
|
47
|
+
try {
|
|
48
|
+
const r = await l.post(e, t, this._axiosOptions({ contentType: o, ...s || {} }));
|
|
49
|
+
return this.handleResponse(r);
|
|
50
|
+
} catch (r) {
|
|
51
|
+
if (r != null && r.isAxiosError)
|
|
52
|
+
return this.handleAxiosError(r);
|
|
53
|
+
}
|
|
54
|
+
return {};
|
|
55
|
+
});
|
|
56
|
+
n(this, "put", async (e, t, o, s) => {
|
|
57
|
+
try {
|
|
58
|
+
const r = await l.put(e, t, this._axiosOptions({ contentType: o, ...s || {} }));
|
|
59
|
+
return this.handleResponse(r);
|
|
60
|
+
} catch (r) {
|
|
61
|
+
if (r != null && r.isAxiosError)
|
|
62
|
+
return this.handleAxiosError(r);
|
|
63
|
+
}
|
|
64
|
+
return {};
|
|
65
|
+
});
|
|
66
|
+
n(this, "appendFormDataValues", (e, t, o) => {
|
|
67
|
+
if ((!o || o.length <= 0) && (o = ""), typeof t != "function" && typeof t != "object" && typeof t != "symbol" || t instanceof File) {
|
|
68
|
+
t && o && e.append(o, t);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
for (const s in t) {
|
|
72
|
+
const r = `${o}${o && !o.endsWith(".") ? "." : ""}${s}`;
|
|
73
|
+
if (t[s] instanceof FileList) {
|
|
74
|
+
const a = t[s];
|
|
75
|
+
for (let h = 0; h < a.length; h++)
|
|
76
|
+
e.append(`${r}[${h}]`, a[h]);
|
|
77
|
+
} else
|
|
78
|
+
Array.isArray(t[s]) ? t[s].forEach((a, h) => {
|
|
79
|
+
this.appendFormDataValues(e, a, `${r}[${h}]`);
|
|
80
|
+
}) : typeof t[s] == "object" ? this.appendFormDataValues(e, t[s], r) : t[s] && e.append(r, t[s]);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
n(this, "postForm", async (e, t, o) => {
|
|
84
|
+
let s = new FormData();
|
|
85
|
+
t instanceof FormData ? s = t : this.appendFormDataValues(s, t);
|
|
86
|
+
try {
|
|
87
|
+
const r = await l.post(e, s, this._axiosOptions({ contentType: "multipart/form-data", ...o || {} }));
|
|
88
|
+
return this.handleResponse(r);
|
|
89
|
+
} catch (r) {
|
|
90
|
+
if (r != null && r.isAxiosError)
|
|
91
|
+
return this.handleAxiosError(r);
|
|
92
|
+
}
|
|
93
|
+
return {};
|
|
94
|
+
});
|
|
95
|
+
n(this, "putForm", async (e, t, o) => {
|
|
96
|
+
let s = new FormData();
|
|
97
|
+
t instanceof FormData ? s = t : this.appendFormDataValues(s, t);
|
|
98
|
+
try {
|
|
99
|
+
const r = await l.putForm(e, s, this._axiosOptions({ contentType: "multipart/form-data", ...o || {} }));
|
|
100
|
+
return this.handleResponse(r);
|
|
101
|
+
} catch (r) {
|
|
102
|
+
if (r != null && r.isAxiosError)
|
|
103
|
+
return this.handleAxiosError(r);
|
|
104
|
+
}
|
|
105
|
+
return {};
|
|
106
|
+
});
|
|
107
|
+
n(this, "delete", async (e, t, o) => {
|
|
108
|
+
const s = await l.delete(e, this._axiosOptions({ contentType: t, ...o || {} }));
|
|
109
|
+
return this.handleResponse(s);
|
|
110
|
+
});
|
|
111
|
+
n(this, "getFileName", (e) => {
|
|
112
|
+
var t = void 0;
|
|
113
|
+
if (e && e.indexOf("attachment") !== -1) {
|
|
114
|
+
var o = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/, s = o.exec(e);
|
|
115
|
+
s != null && s[1] && (t = s[1].replace(/['"]/g, ""));
|
|
116
|
+
}
|
|
117
|
+
return t;
|
|
118
|
+
});
|
|
119
|
+
n(this, "downloadFile", async (e, t, o, s) => {
|
|
120
|
+
let r;
|
|
121
|
+
const a = {}, h = this.accessToken;
|
|
122
|
+
h && (a.Authorization = `Bearer ${h}`);
|
|
123
|
+
const d = { headers: a, ...s || {} };
|
|
124
|
+
o === "post" ? r = l.post(e, t, {
|
|
125
|
+
...this._axiosOptions(d),
|
|
126
|
+
responseType: "blob"
|
|
127
|
+
}) : r = l.get(e, {
|
|
128
|
+
params: t,
|
|
129
|
+
paramsSerializer: {
|
|
130
|
+
serialize: (c, p) => f(t, {
|
|
131
|
+
arrayFormat: "indices",
|
|
132
|
+
allowDots: !0,
|
|
133
|
+
skipNulls: !0
|
|
134
|
+
})
|
|
135
|
+
},
|
|
136
|
+
...this._axiosOptions(d),
|
|
137
|
+
responseType: "blob"
|
|
138
|
+
});
|
|
139
|
+
try {
|
|
140
|
+
const c = await r, p = this.getFileName(c.headers.get("Content-Disposition"));
|
|
141
|
+
return y(c.data, p), {
|
|
142
|
+
status: "done"
|
|
143
|
+
/* done */
|
|
144
|
+
};
|
|
145
|
+
} catch (c) {
|
|
146
|
+
return c.isAxiosError ? this.handleResponse(c.response) : this.handleResponse(c), c.response ? {
|
|
147
|
+
status: "error",
|
|
148
|
+
error: c.response.status
|
|
149
|
+
} : { status: "error", error: c.message };
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
n(this, "getAuthHeader", (e) => {
|
|
153
|
+
const t = {
|
|
154
|
+
"Content-Type": e || "application/json",
|
|
155
|
+
Accept: "application/json"
|
|
156
|
+
}, o = this.accessToken;
|
|
157
|
+
return o && (t.Authorization = `Bearer ${o}`), t;
|
|
158
|
+
});
|
|
159
|
+
n(this, "handleResponse", (e, t) => {
|
|
160
|
+
if (!e)
|
|
161
|
+
this.handleError && this.handleError("No response from the server, please try after some time.");
|
|
162
|
+
else if ([401, 403].indexOf(e.status) !== -1) {
|
|
163
|
+
if (t)
|
|
164
|
+
throw e;
|
|
165
|
+
console.error("401 Unauthorized or 403 Forbidden response returned from api");
|
|
166
|
+
}
|
|
167
|
+
return e == null ? void 0 : e.data;
|
|
168
|
+
});
|
|
169
|
+
n(this, "handleAxiosError", (e, t) => {
|
|
170
|
+
var o, s;
|
|
171
|
+
if (t && ((o = e.response) == null ? void 0 : o.status) === 401) throw e;
|
|
172
|
+
if (((s = e.response) == null ? void 0 : s.status) === 400) {
|
|
173
|
+
const r = e.response.data;
|
|
174
|
+
if (r && r.errors) {
|
|
175
|
+
const a = [];
|
|
176
|
+
for (const h in r.errors)
|
|
177
|
+
r.errors[h] && r.errors[h].length > 0 && a.push(r.errors[h][0]);
|
|
178
|
+
return {
|
|
179
|
+
result: null,
|
|
180
|
+
status: !1,
|
|
181
|
+
message: a.length > 0 ? a[0] : "",
|
|
182
|
+
errors: a
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return {};
|
|
187
|
+
});
|
|
188
|
+
n(this, "handleErrorResponse", (e, t) => {
|
|
189
|
+
this.handleError && this.handleError(e, t);
|
|
190
|
+
});
|
|
191
|
+
n(this, "_axiosOptions", (e) => {
|
|
192
|
+
const { contentType: t, headers: o, ...s } = e || {};
|
|
193
|
+
return {
|
|
194
|
+
headers: o || this.getAuthHeader(t),
|
|
195
|
+
baseURL: this.getBaseUrl(),
|
|
196
|
+
...s
|
|
197
|
+
};
|
|
198
|
+
});
|
|
199
|
+
n(this, "getBaseUrl", () => this.config.baseURL || process.env.REACT_APP_API_URL || typeof window != "undefined" && window.__API_BASE_URL__);
|
|
200
|
+
}
|
|
7
201
|
get accessToken() {
|
|
8
202
|
return this.config.accessToken;
|
|
9
203
|
}
|
|
10
|
-
set accessToken(
|
|
11
|
-
this.config.accessToken =
|
|
204
|
+
set accessToken(e) {
|
|
205
|
+
this.config.accessToken = e;
|
|
12
206
|
}
|
|
13
207
|
get handleError() {
|
|
14
|
-
return this.config.handleError || ((
|
|
208
|
+
return this.config.handleError || ((e, t) => {
|
|
15
209
|
});
|
|
16
210
|
}
|
|
17
|
-
set handleError(
|
|
18
|
-
this.config.handleError =
|
|
211
|
+
set handleError(e) {
|
|
212
|
+
this.config.handleError = e;
|
|
19
213
|
}
|
|
20
214
|
/**
|
|
21
215
|
* Configure the API utility with base URL and other options
|
|
22
216
|
* @param config Configuration object
|
|
23
217
|
*/
|
|
24
|
-
configure(
|
|
25
|
-
this.config = { ...this.config, ...
|
|
218
|
+
configure(e) {
|
|
219
|
+
this.config = { ...this.config, ...e };
|
|
26
220
|
}
|
|
27
|
-
// private getParams = (params?: any) => {
|
|
28
|
-
// if (params) {
|
|
29
|
-
// for (const key in params) {
|
|
30
|
-
// if (params[key] == null || params[key] === undefined || params[key] === '')
|
|
31
|
-
// delete params[key];
|
|
32
|
-
// }
|
|
33
|
-
// }
|
|
34
|
-
// return params;
|
|
35
|
-
// };
|
|
36
|
-
getResponse = async (t, e, r) => await c.get(t, {
|
|
37
|
-
params: e,
|
|
38
|
-
paramsSerializer: {
|
|
39
|
-
serialize: (o, s) => p(e, {
|
|
40
|
-
arrayFormat: "indices",
|
|
41
|
-
allowDots: !0,
|
|
42
|
-
skipNulls: !0
|
|
43
|
-
})
|
|
44
|
-
},
|
|
45
|
-
...this._axiosOptions(r || {})
|
|
46
|
-
});
|
|
47
|
-
get = async (t, e, r, o) => {
|
|
48
|
-
const s = await this.getResponse(t, e, o);
|
|
49
|
-
return this.handleResponse(s, r);
|
|
50
|
-
};
|
|
51
|
-
getResult = async (t, e, r, o) => {
|
|
52
|
-
try {
|
|
53
|
-
const s = await this.get(t, e, void 0, o);
|
|
54
|
-
if (s.status)
|
|
55
|
-
return s.result;
|
|
56
|
-
this.handleErrorResponse(s.message, s.errors);
|
|
57
|
-
} catch (s) {
|
|
58
|
-
s.isAxiosError ? this.handleAxiosError(s, r) : this.handleResponse(s, r);
|
|
59
|
-
}
|
|
60
|
-
return null;
|
|
61
|
-
};
|
|
62
|
-
post = async (t, e, r, o) => {
|
|
63
|
-
try {
|
|
64
|
-
const s = await c.post(t, e, this._axiosOptions({ contentType: r, ...o || {} }));
|
|
65
|
-
return this.handleResponse(s);
|
|
66
|
-
} catch (s) {
|
|
67
|
-
if (s?.isAxiosError)
|
|
68
|
-
return this.handleAxiosError(s);
|
|
69
|
-
}
|
|
70
|
-
return {};
|
|
71
|
-
};
|
|
72
|
-
put = async (t, e, r, o) => {
|
|
73
|
-
try {
|
|
74
|
-
const s = await c.put(t, e, this._axiosOptions({ contentType: r, ...o || {} }));
|
|
75
|
-
return this.handleResponse(s);
|
|
76
|
-
} catch (s) {
|
|
77
|
-
if (s?.isAxiosError)
|
|
78
|
-
return this.handleAxiosError(s);
|
|
79
|
-
}
|
|
80
|
-
return {};
|
|
81
|
-
};
|
|
82
|
-
appendFormDataValues = (t, e, r) => {
|
|
83
|
-
if ((!r || r.length <= 0) && (r = ""), typeof e != "function" && typeof e != "object" && typeof e != "symbol" || e instanceof File) {
|
|
84
|
-
e && r && t.append(r, e);
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
for (const o in e) {
|
|
88
|
-
const s = `${r}${r && !r.endsWith(".") ? "." : ""}${o}`;
|
|
89
|
-
if (e[o] instanceof FileList) {
|
|
90
|
-
const n = e[o];
|
|
91
|
-
for (let h = 0; h < n.length; h++)
|
|
92
|
-
t.append(`${s}[${h}]`, n[h]);
|
|
93
|
-
} else
|
|
94
|
-
Array.isArray(e[o]) ? e[o].forEach((n, h) => {
|
|
95
|
-
this.appendFormDataValues(t, n, `${s}[${h}]`);
|
|
96
|
-
}) : typeof e[o] == "object" ? this.appendFormDataValues(t, e[o], s) : e[o] && t.append(s, e[o]);
|
|
97
|
-
}
|
|
98
|
-
};
|
|
99
|
-
postForm = async (t, e, r) => {
|
|
100
|
-
let o = new FormData();
|
|
101
|
-
e instanceof FormData ? o = e : this.appendFormDataValues(o, e);
|
|
102
|
-
try {
|
|
103
|
-
const s = await c.post(t, o, this._axiosOptions({ contentType: "multipart/form-data", ...r || {} }));
|
|
104
|
-
return this.handleResponse(s);
|
|
105
|
-
} catch (s) {
|
|
106
|
-
if (s?.isAxiosError)
|
|
107
|
-
return this.handleAxiosError(s);
|
|
108
|
-
}
|
|
109
|
-
return {};
|
|
110
|
-
};
|
|
111
|
-
putForm = async (t, e, r) => {
|
|
112
|
-
let o = new FormData();
|
|
113
|
-
e instanceof FormData ? o = e : this.appendFormDataValues(o, e);
|
|
114
|
-
try {
|
|
115
|
-
const s = await c.putForm(t, o, this._axiosOptions({ contentType: "multipart/form-data", ...r || {} }));
|
|
116
|
-
return this.handleResponse(s);
|
|
117
|
-
} catch (s) {
|
|
118
|
-
if (s?.isAxiosError)
|
|
119
|
-
return this.handleAxiosError(s);
|
|
120
|
-
}
|
|
121
|
-
return {};
|
|
122
|
-
};
|
|
123
|
-
delete = async (t, e, r) => {
|
|
124
|
-
const o = await c.delete(t, this._axiosOptions({ contentType: e, ...r || {} }));
|
|
125
|
-
return this.handleResponse(o);
|
|
126
|
-
};
|
|
127
|
-
getFileName = (t) => {
|
|
128
|
-
var e = void 0;
|
|
129
|
-
if (t && t.indexOf("attachment") !== -1) {
|
|
130
|
-
var r = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/, o = r.exec(t);
|
|
131
|
-
o != null && o[1] && (e = o[1].replace(/['"]/g, ""));
|
|
132
|
-
}
|
|
133
|
-
return e;
|
|
134
|
-
};
|
|
135
|
-
downloadFile = async (t, e, r, o) => {
|
|
136
|
-
let s;
|
|
137
|
-
const n = {}, h = this.accessToken;
|
|
138
|
-
h && (n.Authorization = `Bearer ${h}`);
|
|
139
|
-
const l = { headers: n, ...o || {} };
|
|
140
|
-
r === "post" ? s = c.post(t, e, {
|
|
141
|
-
...this._axiosOptions(l),
|
|
142
|
-
responseType: "blob"
|
|
143
|
-
}) : s = c.get(t, {
|
|
144
|
-
params: e,
|
|
145
|
-
paramsSerializer: {
|
|
146
|
-
serialize: (a, d) => p(e, {
|
|
147
|
-
arrayFormat: "indices",
|
|
148
|
-
allowDots: !0,
|
|
149
|
-
skipNulls: !0
|
|
150
|
-
})
|
|
151
|
-
},
|
|
152
|
-
...this._axiosOptions(l),
|
|
153
|
-
responseType: "blob"
|
|
154
|
-
});
|
|
155
|
-
try {
|
|
156
|
-
const a = await s, d = this.getFileName(a.headers.get("Content-Disposition"));
|
|
157
|
-
return f(a.data, d), {
|
|
158
|
-
status: "done"
|
|
159
|
-
/* done */
|
|
160
|
-
};
|
|
161
|
-
} catch (a) {
|
|
162
|
-
return a.isAxiosError ? this.handleResponse(a.response) : this.handleResponse(a), a.response ? {
|
|
163
|
-
status: "error",
|
|
164
|
-
error: a.response.status
|
|
165
|
-
} : { status: "error", error: a.message };
|
|
166
|
-
}
|
|
167
|
-
};
|
|
168
|
-
getAuthHeader = (t) => {
|
|
169
|
-
const e = {
|
|
170
|
-
"Content-Type": t || "application/json",
|
|
171
|
-
Accept: "application/json"
|
|
172
|
-
}, r = this.accessToken;
|
|
173
|
-
return r && (e.Authorization = `Bearer ${r}`), e;
|
|
174
|
-
};
|
|
175
|
-
handleResponse = (t, e) => {
|
|
176
|
-
if (!t)
|
|
177
|
-
this.handleError && this.handleError("No response from the server, please try after some time.");
|
|
178
|
-
else if ([401, 403].indexOf(t.status) !== -1) {
|
|
179
|
-
if (e)
|
|
180
|
-
throw t;
|
|
181
|
-
console.error("401 Unauthorized or 403 Forbidden response returned from api");
|
|
182
|
-
}
|
|
183
|
-
return t?.data;
|
|
184
|
-
};
|
|
185
|
-
handleAxiosError = (t, e) => {
|
|
186
|
-
if (e && t.response?.status === 401) throw t;
|
|
187
|
-
if (t.response?.status === 400) {
|
|
188
|
-
const r = t.response.data;
|
|
189
|
-
if (r && r.errors) {
|
|
190
|
-
const o = [];
|
|
191
|
-
for (const s in r.errors)
|
|
192
|
-
r.errors[s] && r.errors[s].length > 0 && o.push(r.errors[s][0]);
|
|
193
|
-
return {
|
|
194
|
-
result: null,
|
|
195
|
-
status: !1,
|
|
196
|
-
message: o.length > 0 ? o[0] : "",
|
|
197
|
-
errors: o
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
return {};
|
|
202
|
-
};
|
|
203
|
-
handleErrorResponse = (t, e) => {
|
|
204
|
-
this.handleError && this.handleError(t, e);
|
|
205
|
-
};
|
|
206
|
-
_axiosOptions = (t) => {
|
|
207
|
-
const { contentType: e, headers: r, ...o } = t || {};
|
|
208
|
-
return {
|
|
209
|
-
headers: r || this.getAuthHeader(e),
|
|
210
|
-
baseURL: this.getBaseUrl(),
|
|
211
|
-
...o
|
|
212
|
-
};
|
|
213
|
-
};
|
|
214
|
-
getBaseUrl = () => this.config.baseURL || process.env.REACT_APP_API_URL || typeof window < "u" && window.__API_BASE_URL__;
|
|
215
221
|
}
|
|
216
|
-
const
|
|
222
|
+
const T = new E();
|
|
217
223
|
export {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
224
|
+
T as ApiUtility,
|
|
225
|
+
A as FileDownloadStatus,
|
|
226
|
+
m as HttpMethods
|
|
221
227
|
};
|
|
222
228
|
//# sourceMappingURL=ApiUtility.axios.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiUtility.axios.js","sources":["../../../src/Utilities/ApiUtility.axios.ts"],"sourcesContent":["import Axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios';\r\nimport { saveAs } from 'file-saver';\r\nimport { stringify } from 'qs';\r\n\r\nexport interface IApiResponse<T = any> {\r\n status: boolean;\r\n result: T;\r\n message?: string;\r\n errors?: {\r\n number: number;\r\n message: string;\r\n suggestion: string;\r\n exception: any;\r\n }[];\r\n}\r\nexport interface IApiListResult<T = any> {\r\n totalRecords: number;\r\n items: T[];\r\n moreRecords?: boolean;\r\n continuationToken?: string;\r\n}\r\n\r\nexport interface IApiListResultWithTotal<TItem = any, TTotal = any> extends IApiListResult<TItem> {\r\n total: TTotal;\r\n}\r\n\r\nexport enum HttpMethods {\r\n get = 'get',\r\n post = 'post',\r\n}\r\nexport enum FileDownloadStatus {\r\n downloading = 'downloading',\r\n done = 'done',\r\n error = 'error',\r\n}\r\nexport type DownloadCallback = (status: FileDownloadStatus, error?: any) => void;\r\n\r\nexport interface IAxiosRequestConfigWithoutParams extends Omit<AxiosRequestConfig, 'params' | 'paramsSerializer'> {\r\n contentType?: string;\r\n}\r\n\r\nexport interface IApiUtilityConfig {\r\n baseURL?: string;\r\n accessToken?: string;\r\n handleError?: (error: string, errors?: any) => void;\r\n}\r\n\r\nclass ApiUtilityBase {\r\n private config: IApiUtilityConfig = {};\r\n\r\n get accessToken() {\r\n return this.config.accessToken;\r\n }\r\n\r\n set accessToken(token: string | undefined) {\r\n this.config.accessToken = token;\r\n }\r\n\r\n get handleError() {\r\n return this.config.handleError || ((error, errors) => {});\r\n }\r\n\r\n set handleError(handler: (error: string, errors?: any) => void) {\r\n this.config.handleError = handler;\r\n }\r\n\r\n /**\r\n * Configure the API utility with base URL and other options\r\n * @param config Configuration object\r\n */\r\n configure(config: IApiUtilityConfig) {\r\n this.config = { ...this.config, ...config };\r\n }\r\n // private getParams = (params?: any) => {\r\n // if (params) {\r\n // for (const key in params) {\r\n // if (params[key] == null || params[key] === undefined || params[key] === '')\r\n // delete params[key];\r\n // }\r\n // }\r\n // return params;\r\n // };\r\n\r\n getResponse = async <T = any>(endpoint: string, params?: any, options?: IAxiosRequestConfigWithoutParams) => {\r\n return await Axios.get<T>(endpoint, {\r\n params,\r\n paramsSerializer: {\r\n serialize: (p, o) => {\r\n return stringify(params, {\r\n arrayFormat: 'indices',\r\n allowDots: true,\r\n skipNulls: true,\r\n });\r\n },\r\n },\r\n ...this._axiosOptions(options || {}),\r\n });\r\n };\r\n\r\n get = async <T = IApiResponse>(endpoint: string, params?: any, throwErrorOn401?: boolean, options?: IAxiosRequestConfigWithoutParams) => {\r\n const response = await this.getResponse<T>(endpoint, params, options);\r\n\r\n const data = this.handleResponse<T>(response, throwErrorOn401);\r\n return data;\r\n };\r\n getResult = async <T = any>(endpoint: string, params?: any, throwErrorOn401?: boolean, options?: IAxiosRequestConfigWithoutParams) => {\r\n try {\r\n const data = await this.get<IApiResponse<T>>(endpoint, params, undefined, options);\r\n\r\n if (data.status) {\r\n return data.result;\r\n } else {\r\n this.handleErrorResponse(data.message, data.errors);\r\n }\r\n } catch (error: any) {\r\n if (error!.isAxiosError) this.handleAxiosError(error, throwErrorOn401);\r\n else this.handleResponse(error, throwErrorOn401);\r\n }\r\n\r\n return null;\r\n };\r\n\r\n post = async <T = IApiResponse>(endpoint: string, body: any, contentType?: string, options?: IAxiosRequestConfigWithoutParams): Promise<T> => {\r\n try {\r\n const response = await Axios.post<T>(endpoint, body, this._axiosOptions({ contentType, ...(options || {}) }));\r\n const data = this.handleResponse<T>(response);\r\n return data;\r\n } catch (ex: any) {\r\n if (ex?.isAxiosError) {\r\n return this.handleAxiosError(ex);\r\n }\r\n }\r\n return {} as T;\r\n };\r\n put = async <T = IApiResponse>(endpoint: string, body: any, contentType?: string, options?: IAxiosRequestConfigWithoutParams): Promise<T> => {\r\n try {\r\n const response = await Axios.put<T>(endpoint, body, this._axiosOptions({ contentType, ...(options || {}) }));\r\n const data = this.handleResponse<T>(response);\r\n return data;\r\n } catch (ex: any) {\r\n if (ex?.isAxiosError) {\r\n return this.handleAxiosError(ex);\r\n }\r\n }\r\n return {} as T;\r\n };\r\n appendFormDataValues = (form: FormData, values: any, preFix?: string) => {\r\n if (!preFix || preFix.length <= 0) preFix = '';\r\n\r\n //check if given object is a string/number/boolean then add directly to the list with prefix\r\n if ((typeof values !== 'function' && typeof values !== 'object' && typeof values !== 'symbol') || values instanceof File) {\r\n if (values && preFix) {\r\n form.append(preFix, values);\r\n }\r\n return;\r\n }\r\n\r\n for (const key in values) {\r\n //prepare a field name\r\n const fieldName = `${preFix}${preFix && !preFix.endsWith('.') ? '.' : ''}${key}`;\r\n\r\n if (values[key] instanceof FileList) {\r\n const fileList: FileList = values[key];\r\n for (let fIndex = 0; fIndex < fileList.length; fIndex++) {\r\n form.append(`${fieldName}[${fIndex}]`, fileList[fIndex]);\r\n }\r\n } else {\r\n if (Array.isArray(values[key])) {\r\n values[key].forEach((el: any, idx: number) => {\r\n this.appendFormDataValues(form, el, `${fieldName}[${idx}]`);\r\n });\r\n } else {\r\n if (typeof values[key] === 'object') {\r\n this.appendFormDataValues(form, values[key], fieldName);\r\n } else if (values[key]) {\r\n form.append(fieldName, values[key]);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n postForm = async <T = IApiResponse>(endpoint: string, params: any, options?: IAxiosRequestConfigWithoutParams) => {\r\n let formData = new FormData();\r\n\r\n if (params instanceof FormData) {\r\n formData = params;\r\n } else {\r\n this.appendFormDataValues(formData, params);\r\n }\r\n\r\n try {\r\n const response = await Axios.post<T>(endpoint, formData, this._axiosOptions({ contentType: 'multipart/form-data', ...(options || {}) }));\r\n const data = this.handleResponse(response);\r\n return data;\r\n } catch (ex: any) {\r\n if (ex?.isAxiosError) {\r\n return this.handleAxiosError(ex);\r\n }\r\n }\r\n return {} as T;\r\n };\r\n putForm = async <T = IApiResponse>(endpoint: string, params: any, options?: IAxiosRequestConfigWithoutParams) => {\r\n let formData = new FormData();\r\n\r\n if (params instanceof FormData) {\r\n formData = params;\r\n } else {\r\n this.appendFormDataValues(formData, params);\r\n }\r\n\r\n try {\r\n const response = await Axios.putForm<T>(endpoint, formData, this._axiosOptions({ contentType: 'multipart/form-data', ...(options || {}) }));\r\n const data = this.handleResponse(response);\r\n return data;\r\n } catch (ex: any) {\r\n if (ex?.isAxiosError) {\r\n return this.handleAxiosError(ex);\r\n }\r\n }\r\n return {} as T;\r\n };\r\n\r\n delete = async <T = IApiResponse>(endpoint: string, contentType?: string, options?: IAxiosRequestConfigWithoutParams) => {\r\n const response = await Axios.delete<T>(endpoint, this._axiosOptions({ contentType, ...(options || {}) }));\r\n const data = this.handleResponse<T>(response);\r\n return data;\r\n };\r\n\r\n private getFileName = (contentDispositionValue: string) => {\r\n var filename: string | undefined = undefined;\r\n if (contentDispositionValue && contentDispositionValue.indexOf('attachment') !== -1) {\r\n var filenameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\r\n var matches = filenameRegex.exec(contentDispositionValue);\r\n if (matches != null && matches[1]) {\r\n filename = matches[1].replace(/['\"]/g, '');\r\n }\r\n }\r\n return filename;\r\n };\r\n downloadFile = async (endpoint: string, params?: any, method?: HttpMethods, options?: IAxiosRequestConfigWithoutParams): Promise<{ status: FileDownloadStatus; error?: any }> => {\r\n let response: Promise<AxiosResponse<any>>;\r\n const headers: any = {};\r\n // return authorization header with jwt token\r\n const token = this.accessToken; // || AuthService.getAuthToken();\r\n if (token) {\r\n headers['Authorization'] = `Bearer ${token}`;\r\n }\r\n const axiosOptions: IAxiosRequestConfigWithoutParams = { headers, ...(options || {}) };\r\n if (method === HttpMethods.post) {\r\n response = Axios.post(endpoint, params, {\r\n ...this._axiosOptions(axiosOptions),\r\n responseType: 'blob',\r\n });\r\n } else {\r\n response = Axios.get(endpoint, {\r\n params,\r\n paramsSerializer: {\r\n serialize: (p, o) => {\r\n return stringify(params, {\r\n arrayFormat: 'indices',\r\n allowDots: true,\r\n skipNulls: true,\r\n });\r\n },\r\n },\r\n ...this._axiosOptions(axiosOptions),\r\n responseType: 'blob',\r\n });\r\n }\r\n\r\n try {\r\n const result_1 = await response;\r\n //extract file name from Content-Disposition header\r\n const fileName = this.getFileName((result_1.headers.get as any)('Content-Disposition'));\r\n //invoke 'Save As' dialog\r\n saveAs(result_1.data, fileName);\r\n return { status: FileDownloadStatus.done };\r\n } catch (error: any) {\r\n if (error!.isAxiosError) {\r\n this.handleResponse(error.response);\r\n } else this.handleResponse(error);\r\n if (error.response) {\r\n return {\r\n status: FileDownloadStatus.error,\r\n error: error.response.status,\r\n };\r\n } else {\r\n return { status: FileDownloadStatus.error, error: error.message };\r\n }\r\n }\r\n };\r\n\r\n getAuthHeader = (contentType?: string) => {\r\n const headers: any = {\r\n 'Content-Type': contentType || 'application/json',\r\n Accept: 'application/json',\r\n };\r\n\r\n // return authorization header with jwt token\r\n const token = this.accessToken; //||AuthService.getAuthToken();\r\n if (token) {\r\n headers['Authorization'] = `Bearer ${token}`;\r\n }\r\n return headers;\r\n };\r\n\r\n handleResponse = <T = IApiResponse>(response: AxiosResponse<T>, throwErrorOn401?: boolean) => {\r\n if (!response) {\r\n if (this.handleError) this.handleError('No response from the server, please try after some time.');\r\n } else if ([401, 403].indexOf(response.status) !== -1) {\r\n if (throwErrorOn401) {\r\n throw response;\r\n } else {\r\n console.error('401 Unauthorized or 403 Forbidden response returned from api');\r\n // // auto logout if 401 Unauthorized or 403 Forbidden response returned from api\r\n // AuthService.logout();\r\n\r\n // window.location.reload();\r\n }\r\n }\r\n return response?.data;\r\n };\r\n handleAxiosError = <T = IApiResponse>(error: AxiosError, throwErrorOn401?: boolean): T => {\r\n if (throwErrorOn401 && error.response?.status === 401) throw error;\r\n else if (error.response?.status === 400) {\r\n const data = (error.response as any).data;\r\n if (data && data.errors) {\r\n const arr: any[] = [];\r\n for (const key in data.errors) {\r\n if (data.errors[key] && data.errors[key].length > 0) {\r\n arr.push(data.errors[key][0]);\r\n }\r\n }\r\n return {\r\n result: null,\r\n status: false,\r\n message: arr.length > 0 ? arr[0] : '',\r\n errors: arr,\r\n } as unknown as T;\r\n }\r\n }\r\n return {} as T;\r\n };\r\n handleErrorResponse = (message: any, errors?: any) => {\r\n if (this.handleError) this.handleError(message, errors);\r\n };\r\n\r\n _axiosOptions = (options?: IAxiosRequestConfigWithoutParams): AxiosRequestConfig => {\r\n const { contentType, headers, ...rest } = options || {};\r\n return {\r\n headers: headers || this.getAuthHeader(contentType),\r\n baseURL: this.getBaseUrl(),\r\n ...rest,\r\n };\r\n };\r\n getBaseUrl = () => {\r\n // Priority: 1. Configured baseURL, 2. Environment variable, 3. undefined\r\n return this.config.baseURL || process.env.REACT_APP_API_URL || (typeof window !== 'undefined' && (window as any).__API_BASE_URL__);\r\n };\r\n}\r\n\r\nexport const ApiUtility = new ApiUtilityBase();\r\n"],"names":["HttpMethods","FileDownloadStatus","ApiUtilityBase","token","error","errors","handler","config","endpoint","params","options","Axios","p","o","stringify","throwErrorOn401","response","data","body","contentType","ex","form","values","preFix","key","fieldName","fileList","fIndex","el","idx","formData","contentDispositionValue","filename","filenameRegex","matches","method","headers","axiosOptions","result_1","fileName","saveAs","arr","message","rest","ApiUtility"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ApiUtility.axios.js","sources":["../../../src/Utilities/ApiUtility.axios.ts"],"sourcesContent":["import Axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios';\r\nimport { saveAs } from 'file-saver';\r\nimport { stringify } from 'qs';\r\n\r\nexport interface IApiResponse<T = any> {\r\n status: boolean;\r\n result: T;\r\n message?: string;\r\n errors?: {\r\n number: number;\r\n message: string;\r\n suggestion: string;\r\n exception: any;\r\n }[];\r\n}\r\nexport interface IApiListResult<T = any> {\r\n totalRecords: number;\r\n items: T[];\r\n moreRecords?: boolean;\r\n continuationToken?: string;\r\n}\r\n\r\nexport interface IApiListResultWithTotal<TItem = any, TTotal = any> extends IApiListResult<TItem> {\r\n total: TTotal;\r\n}\r\n\r\nexport enum HttpMethods {\r\n get = 'get',\r\n post = 'post',\r\n}\r\nexport enum FileDownloadStatus {\r\n downloading = 'downloading',\r\n done = 'done',\r\n error = 'error',\r\n}\r\nexport type DownloadCallback = (status: FileDownloadStatus, error?: any) => void;\r\n\r\nexport interface IAxiosRequestConfigWithoutParams extends Omit<AxiosRequestConfig, 'params' | 'paramsSerializer'> {\r\n contentType?: string;\r\n}\r\n\r\nexport interface IApiUtilityConfig {\r\n baseURL?: string;\r\n accessToken?: string;\r\n handleError?: (error: string, errors?: any) => void;\r\n}\r\n\r\nclass ApiUtilityBase {\r\n private config: IApiUtilityConfig = {};\r\n\r\n get accessToken() {\r\n return this.config.accessToken;\r\n }\r\n\r\n set accessToken(token: string | undefined) {\r\n this.config.accessToken = token;\r\n }\r\n\r\n get handleError() {\r\n return this.config.handleError || ((error, errors) => {});\r\n }\r\n\r\n set handleError(handler: (error: string, errors?: any) => void) {\r\n this.config.handleError = handler;\r\n }\r\n\r\n /**\r\n * Configure the API utility with base URL and other options\r\n * @param config Configuration object\r\n */\r\n configure(config: IApiUtilityConfig) {\r\n this.config = { ...this.config, ...config };\r\n }\r\n // private getParams = (params?: any) => {\r\n // if (params) {\r\n // for (const key in params) {\r\n // if (params[key] == null || params[key] === undefined || params[key] === '')\r\n // delete params[key];\r\n // }\r\n // }\r\n // return params;\r\n // };\r\n\r\n getResponse = async <T = any>(endpoint: string, params?: any, options?: IAxiosRequestConfigWithoutParams) => {\r\n return await Axios.get<T>(endpoint, {\r\n params,\r\n paramsSerializer: {\r\n serialize: (p, o) => {\r\n return stringify(params, {\r\n arrayFormat: 'indices',\r\n allowDots: true,\r\n skipNulls: true,\r\n });\r\n },\r\n },\r\n ...this._axiosOptions(options || {}),\r\n });\r\n };\r\n\r\n get = async <T = IApiResponse>(endpoint: string, params?: any, throwErrorOn401?: boolean, options?: IAxiosRequestConfigWithoutParams) => {\r\n const response = await this.getResponse<T>(endpoint, params, options);\r\n\r\n const data = this.handleResponse<T>(response, throwErrorOn401);\r\n return data;\r\n };\r\n getResult = async <T = any>(endpoint: string, params?: any, throwErrorOn401?: boolean, options?: IAxiosRequestConfigWithoutParams) => {\r\n try {\r\n const data = await this.get<IApiResponse<T>>(endpoint, params, undefined, options);\r\n\r\n if (data.status) {\r\n return data.result;\r\n } else {\r\n this.handleErrorResponse(data.message, data.errors);\r\n }\r\n } catch (error: any) {\r\n if (error!.isAxiosError) this.handleAxiosError(error, throwErrorOn401);\r\n else this.handleResponse(error, throwErrorOn401);\r\n }\r\n\r\n return null;\r\n };\r\n\r\n post = async <T = IApiResponse>(endpoint: string, body: any, contentType?: string, options?: IAxiosRequestConfigWithoutParams): Promise<T> => {\r\n try {\r\n const response = await Axios.post<T>(endpoint, body, this._axiosOptions({ contentType, ...(options || {}) }));\r\n const data = this.handleResponse<T>(response);\r\n return data;\r\n } catch (ex: any) {\r\n if (ex?.isAxiosError) {\r\n return this.handleAxiosError(ex);\r\n }\r\n }\r\n return {} as T;\r\n };\r\n put = async <T = IApiResponse>(endpoint: string, body: any, contentType?: string, options?: IAxiosRequestConfigWithoutParams): Promise<T> => {\r\n try {\r\n const response = await Axios.put<T>(endpoint, body, this._axiosOptions({ contentType, ...(options || {}) }));\r\n const data = this.handleResponse<T>(response);\r\n return data;\r\n } catch (ex: any) {\r\n if (ex?.isAxiosError) {\r\n return this.handleAxiosError(ex);\r\n }\r\n }\r\n return {} as T;\r\n };\r\n appendFormDataValues = (form: FormData, values: any, preFix?: string) => {\r\n if (!preFix || preFix.length <= 0) preFix = '';\r\n\r\n //check if given object is a string/number/boolean then add directly to the list with prefix\r\n if ((typeof values !== 'function' && typeof values !== 'object' && typeof values !== 'symbol') || values instanceof File) {\r\n if (values && preFix) {\r\n form.append(preFix, values);\r\n }\r\n return;\r\n }\r\n\r\n for (const key in values) {\r\n //prepare a field name\r\n const fieldName = `${preFix}${preFix && !preFix.endsWith('.') ? '.' : ''}${key}`;\r\n\r\n if (values[key] instanceof FileList) {\r\n const fileList: FileList = values[key];\r\n for (let fIndex = 0; fIndex < fileList.length; fIndex++) {\r\n form.append(`${fieldName}[${fIndex}]`, fileList[fIndex]);\r\n }\r\n } else {\r\n if (Array.isArray(values[key])) {\r\n values[key].forEach((el: any, idx: number) => {\r\n this.appendFormDataValues(form, el, `${fieldName}[${idx}]`);\r\n });\r\n } else {\r\n if (typeof values[key] === 'object') {\r\n this.appendFormDataValues(form, values[key], fieldName);\r\n } else if (values[key]) {\r\n form.append(fieldName, values[key]);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n postForm = async <T = IApiResponse>(endpoint: string, params: any, options?: IAxiosRequestConfigWithoutParams) => {\r\n let formData = new FormData();\r\n\r\n if (params instanceof FormData) {\r\n formData = params;\r\n } else {\r\n this.appendFormDataValues(formData, params);\r\n }\r\n\r\n try {\r\n const response = await Axios.post<T>(endpoint, formData, this._axiosOptions({ contentType: 'multipart/form-data', ...(options || {}) }));\r\n const data = this.handleResponse(response);\r\n return data;\r\n } catch (ex: any) {\r\n if (ex?.isAxiosError) {\r\n return this.handleAxiosError(ex);\r\n }\r\n }\r\n return {} as T;\r\n };\r\n putForm = async <T = IApiResponse>(endpoint: string, params: any, options?: IAxiosRequestConfigWithoutParams) => {\r\n let formData = new FormData();\r\n\r\n if (params instanceof FormData) {\r\n formData = params;\r\n } else {\r\n this.appendFormDataValues(formData, params);\r\n }\r\n\r\n try {\r\n const response = await Axios.putForm<T>(endpoint, formData, this._axiosOptions({ contentType: 'multipart/form-data', ...(options || {}) }));\r\n const data = this.handleResponse(response);\r\n return data;\r\n } catch (ex: any) {\r\n if (ex?.isAxiosError) {\r\n return this.handleAxiosError(ex);\r\n }\r\n }\r\n return {} as T;\r\n };\r\n\r\n delete = async <T = IApiResponse>(endpoint: string, contentType?: string, options?: IAxiosRequestConfigWithoutParams) => {\r\n const response = await Axios.delete<T>(endpoint, this._axiosOptions({ contentType, ...(options || {}) }));\r\n const data = this.handleResponse<T>(response);\r\n return data;\r\n };\r\n\r\n private getFileName = (contentDispositionValue: string) => {\r\n var filename: string | undefined = undefined;\r\n if (contentDispositionValue && contentDispositionValue.indexOf('attachment') !== -1) {\r\n var filenameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\r\n var matches = filenameRegex.exec(contentDispositionValue);\r\n if (matches != null && matches[1]) {\r\n filename = matches[1].replace(/['\"]/g, '');\r\n }\r\n }\r\n return filename;\r\n };\r\n downloadFile = async (endpoint: string, params?: any, method?: HttpMethods, options?: IAxiosRequestConfigWithoutParams): Promise<{ status: FileDownloadStatus; error?: any }> => {\r\n let response: Promise<AxiosResponse<any>>;\r\n const headers: any = {};\r\n // return authorization header with jwt token\r\n const token = this.accessToken; // || AuthService.getAuthToken();\r\n if (token) {\r\n headers['Authorization'] = `Bearer ${token}`;\r\n }\r\n const axiosOptions: IAxiosRequestConfigWithoutParams = { headers, ...(options || {}) };\r\n if (method === HttpMethods.post) {\r\n response = Axios.post(endpoint, params, {\r\n ...this._axiosOptions(axiosOptions),\r\n responseType: 'blob',\r\n });\r\n } else {\r\n response = Axios.get(endpoint, {\r\n params,\r\n paramsSerializer: {\r\n serialize: (p, o) => {\r\n return stringify(params, {\r\n arrayFormat: 'indices',\r\n allowDots: true,\r\n skipNulls: true,\r\n });\r\n },\r\n },\r\n ...this._axiosOptions(axiosOptions),\r\n responseType: 'blob',\r\n });\r\n }\r\n\r\n try {\r\n const result_1 = await response;\r\n //extract file name from Content-Disposition header\r\n const fileName = this.getFileName((result_1.headers.get as any)('Content-Disposition'));\r\n //invoke 'Save As' dialog\r\n saveAs(result_1.data, fileName);\r\n return { status: FileDownloadStatus.done };\r\n } catch (error: any) {\r\n if (error!.isAxiosError) {\r\n this.handleResponse(error.response);\r\n } else this.handleResponse(error);\r\n if (error.response) {\r\n return {\r\n status: FileDownloadStatus.error,\r\n error: error.response.status,\r\n };\r\n } else {\r\n return { status: FileDownloadStatus.error, error: error.message };\r\n }\r\n }\r\n };\r\n\r\n getAuthHeader = (contentType?: string) => {\r\n const headers: any = {\r\n 'Content-Type': contentType || 'application/json',\r\n Accept: 'application/json',\r\n };\r\n\r\n // return authorization header with jwt token\r\n const token = this.accessToken; //||AuthService.getAuthToken();\r\n if (token) {\r\n headers['Authorization'] = `Bearer ${token}`;\r\n }\r\n return headers;\r\n };\r\n\r\n handleResponse = <T = IApiResponse>(response: AxiosResponse<T>, throwErrorOn401?: boolean) => {\r\n if (!response) {\r\n if (this.handleError) this.handleError('No response from the server, please try after some time.');\r\n } else if ([401, 403].indexOf(response.status) !== -1) {\r\n if (throwErrorOn401) {\r\n throw response;\r\n } else {\r\n console.error('401 Unauthorized or 403 Forbidden response returned from api');\r\n // // auto logout if 401 Unauthorized or 403 Forbidden response returned from api\r\n // AuthService.logout();\r\n\r\n // window.location.reload();\r\n }\r\n }\r\n return response?.data;\r\n };\r\n handleAxiosError = <T = IApiResponse>(error: AxiosError, throwErrorOn401?: boolean): T => {\r\n if (throwErrorOn401 && error.response?.status === 401) throw error;\r\n else if (error.response?.status === 400) {\r\n const data = (error.response as any).data;\r\n if (data && data.errors) {\r\n const arr: any[] = [];\r\n for (const key in data.errors) {\r\n if (data.errors[key] && data.errors[key].length > 0) {\r\n arr.push(data.errors[key][0]);\r\n }\r\n }\r\n return {\r\n result: null,\r\n status: false,\r\n message: arr.length > 0 ? arr[0] : '',\r\n errors: arr,\r\n } as unknown as T;\r\n }\r\n }\r\n return {} as T;\r\n };\r\n handleErrorResponse = (message: any, errors?: any) => {\r\n if (this.handleError) this.handleError(message, errors);\r\n };\r\n\r\n _axiosOptions = (options?: IAxiosRequestConfigWithoutParams): AxiosRequestConfig => {\r\n const { contentType, headers, ...rest } = options || {};\r\n return {\r\n headers: headers || this.getAuthHeader(contentType),\r\n baseURL: this.getBaseUrl(),\r\n ...rest,\r\n };\r\n };\r\n getBaseUrl = () => {\r\n // Priority: 1. Configured baseURL, 2. Environment variable, 3. undefined\r\n return this.config.baseURL || process.env.REACT_APP_API_URL || (typeof window !== 'undefined' && (window as any).__API_BASE_URL__);\r\n };\r\n}\r\n\r\nexport const ApiUtility = new ApiUtilityBase();\r\n"],"names":["HttpMethods","FileDownloadStatus","ApiUtilityBase","__publicField","endpoint","params","options","Axios","p","o","stringify","throwErrorOn401","response","data","error","body","contentType","ex","form","values","preFix","key","fieldName","fileList","fIndex","el","idx","formData","contentDispositionValue","filename","filenameRegex","matches","method","headers","token","axiosOptions","result_1","fileName","saveAs","_a","_b","arr","message","errors","rest","handler","config","ApiUtility"],"mappings":"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"}
|