-
Notifications
You must be signed in to change notification settings - Fork 106
Expand file tree
/
Copy pathindex.js
More file actions
64 lines (56 loc) · 1.46 KB
/
index.js
File metadata and controls
64 lines (56 loc) · 1.46 KB
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
class APIService {
constructor(services, config = {}) {
this.services = services;
this.config = config;
this.defaultHeaders = {
'Content-Type': 'application/json',
'Accept-Language': 'ru',
};
}
setHeader(name, value = null) {
if (value) {
this.defaultHeaders[name] = value;
} else if (this.defaultHeaders[name]) {
delete this.defaultHeaders[name];
}
}
async request({ url, method = 'GET', headers = {}, ...options }) {
if (!url.match(/^(http|\/\/)/)) url = this.config.baseUrl + url;
try {
const res = await fetch(url, {
method,
headers: { ...this.defaultHeaders, ...headers },
...options,
});
const data = await res.json();
if (data?.translations) {
this.services.i18n.addTranslations(data.translations);
}
return {
data,
status: res.status,
headers: res.headers
};
} catch (e) {
console.error('API request failed:', e);
throw e;
}
}
async fetchItemsDetails(items) {
const updates = {};
await Promise.all(
items.map(async item => {
try {
const res = await this.request({
url: `/api/v1/articles/${item._id}?fields=title,price,description`
});
updates[item._id] = res.data.result;
} catch (e) {
updates[item._id] = item;
}
})
);
return updates;
}
}
export default APIService;