-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.js
121 lines (107 loc) · 2.99 KB
/
app.js
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// Custom Http Module
function customHttp() {
return {
get(url, cb) {
try {
const xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.addEventListener("load", () => {
if (Math.floor(xhr.status / 100) !== 2) {
cb(`Error. Status code: ${xhr.status}`, xhr);
return;
}
const response = JSON.parse(xhr.responseText);
cb(null, response);
});
xhr.addEventListener("error", () => {
cb(`Error. Status code: ${xhr.status}`, xhr);
});
xhr.send();
} catch (error) {
cb(error);
}
},
post(url, body, headers, cb) {
try {
const xhr = new XMLHttpRequest();
xhr.open("POST", url);
xhr.addEventListener("load", () => {
if (Math.floor(xhr.status / 100) !== 2) {
cb(`Error. Status code: ${xhr.status}`, xhr);
return;
}
const response = JSON.parse(xhr.responseText);
cb(null, response);
});
xhr.addEventListener("error", () => {
cb(`Error. Status code: ${xhr.status}`, xhr);
});
if (headers) {
Object.entries(headers).forEach(([key, value]) => {
xhr.setRequestHeader(key, value);
});
}
xhr.send(JSON.stringify(body));
} catch (error) {
cb(error);
}
}
};
}
// Init http module
const http = customHttp();
const newsService = (function() {
const apiKey = "0902e0fbe40b44a0b64337a0b9b6ac3d";
const apiUrl = "https://newsapi.org/v2";
return {
topHeadlines(country = "ua", cb) {
http.get(
`${apiUrl}/top-headlines?country=${country}&category=technology&apiKey=${apiKey}`,
cb
);
},
everything(query, cb) {
`${apiUrl}/everything?q=${query}&apiKey=${apiKey}`, cb;
}
};
})();
const form = document.forms[0];
// init selects
document.addEventListener("DOMContentLoaded", function() {
M.AutoInit();
loadNews();
});
function loadNews() {
newsService.topHeadlines("ru", onGetResponse);
}
function onGetResponse(err, res) {
console.log(res);
renderNews(res.articles);
}
function renderNews(news) {
const newsContainer = document.querySelector(".news-container .row");
let fragment = "";
news.forEach(newsIteam => {
const el = newsTemplate(newsIteam);
fragment += el;
});
newsContainer.insertAdjacentHTML("afterbegin", fragment);
}
function newsTemplate({ urlToImage, title, url, description }) {
return `
<div class="col s12 m12">
<div class="card">
<div class="card-image">
<img src="${urlToImage}">
<span class="card-title">${title || ""}</span>
</div>
<div class="card-content">
<p>${description || ""}</p>
</div>
<div class="card-action">
<a href="${url}">Read More</a>
</div>
</div>
</div>
`;
}