-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
157 lines (123 loc) · 4.28 KB
/
index.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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
const GITHUB_API_URL = 'https:/api.github.com';
function getUser() {
const user = document.getElementById('user').value;
if (!user) {
alert('You should inform a valid user!');
throw Error('You should inform a valid user');
}
return user;
}
function getKey() {
const key = document.getElementById('key').value;
if (!key) {
alert('You should inform a valid api key!');
throw Error('You should inform a valid api key');
}
return key;
}
function getHeadersWithAuth(user, key = null) {
return new Headers({
Accept: 'application/vnd.github.v3+json',
Authorization: 'Basic ' + btoa(user + ':' + key),
});
}
async function requestGitHubInfo(urlEndpoint, headers) {
let url = new URL(GITHUB_API_URL + urlEndpoint);
let params = { per_page: 100, page: 1 };
url.search = new URLSearchParams(params).toString();
let requestOptions = {
method: 'GET',
headers: headers,
};
let allFollowers = [];
while (true) {
let request = await fetch(url, requestOptions);
let response = await request.json();
if (response.length === 0) {
return allFollowers;
}
allFollowers.push(...response);
++params.page;
url.search = new URLSearchParams(params).toString();
}
}
function usefulUserProperties(user) {
return {
avatar_url: user.avatar_url,
login: user.login,
html_url: user.html_url,
};
}
function filterOnlyUsefulInfo(githubUsersList) {
return githubUsersList.map((user) => usefulUserProperties(user));
}
async function listFollowersFrom(headers) {
let urlEndpoint = '/user/followers';
return await requestGitHubInfo(urlEndpoint, headers);
}
async function listFollowingFrom(headers) {
let urlEndpoint = '/user/following';
return await requestGitHubInfo(urlEndpoint, headers);
}
function compare(whoIAmFollowing, whoFollowsMe) {
whoIAmFollowing = whoIAmFollowing.map(
(whoIAmFollowing) => whoIAmFollowing.login
);
whoFollowsMe = whoFollowsMe.map((whoFollowsMe) => whoFollowsMe.login);
return whoIAmFollowing.filter(
(userIAmFollowing) => !whoFollowsMe.includes(userIAmFollowing)
); // compareFunc => item2 == item1 or !=
}
function rebuildObjOfNotFollowingMe(whoIFollowList, notFollowingMeArr) {
let list = [];
for (notFollowingMeLogin of notFollowingMeArr) {
for (whoIFollowUser of whoIFollowList) {
if (whoIFollowUser.login == notFollowingMeLogin) {
list.push(whoIFollowUser);
break;
}
}
}
return list;
}
document.addEventListener('DOMContentLoaded', function () {
document.getElementById('check').addEventListener('click', async function () {
const user = getUser();
const key = getKey();
if (!user || !key) {
return;
}
let spinner = document.getElementById('loading-spinner');
if (spinner) {
spinner.style.display = 'block';
const headers = getHeadersWithAuth(user, key);
const followers = await listFollowersFrom(headers);
const following = await listFollowingFrom(headers);
const filteredFollwing = (window.following =
filterOnlyUsefulInfo(following));
const filteredFollowers = (window.followers =
filterOnlyUsefulInfo(followers));
const notFollowingMeArr = (window.notFollowingMe = compare(
filteredFollwing,
filteredFollowers
));
const listObjOfNotFollowingMe = (window.listObjOfNotFollowingMe =
rebuildObjOfNotFollowingMe(filteredFollwing, notFollowingMeArr));
spinner.style.display = 'none';
let doNotFollowMeListContainer =
document.getElementById('doNotFollowMeList');
doNotFollowMeListContainer.innerHTML = ''; // Clear the container before appending new data
listObjOfNotFollowingMe.forEach((notFollowingMeObj) => {
doNotFollowMeListContainer.innerHTML += `
<div class="col-xs-1 col-sm-2">
<a href="${notFollowingMeObj.html_url}">
<img class="img-thumbnail" src="${notFollowingMeObj.avatar_url}" alt="${notFollowingMeObj.login} (GitHub User)">
<h4>${notFollowingMeObj.login}</h4>
</a>
</div>
`;
});
console.log(listObjOfNotFollowingMe);
}
});
});