+1
index.html
+1
index.html
···
133
133
<script src="utils.js"></script>
134
134
<script src="rich_text_lite.js"></script>
135
135
<script src="models.js"></script>
136
+
<script src="menu.js"></script>
136
137
<script src="thread_page.js"></script>
137
138
<script src="posting_stats_page.js"></script>
138
139
<script src="embed_component.js"></script>
+14
-135
skythread.js
+14
-135
skythread.js
···
1
1
function init() {
2
-
let html = $(document.body.parentNode);
3
-
4
2
window.dateLocale = localStorage.getItem('locale') || undefined;
5
3
window.isIncognito = !!localStorage.getItem('incognito');
6
4
window.biohazardEnabled = JSON.parse(localStorage.getItem('biohazard') ?? 'null');
7
5
8
6
window.loginDialog = $(document.querySelector('#login'));
9
-
window.accountMenu = $(document.querySelector('#account_menu'));
10
7
11
8
window.avatarPreloader = buildAvatarPreloader();
12
9
10
+
window.accountMenu = new Menu();
13
11
window.threadPage = new ThreadPage();
14
12
window.postingStatsPage = new PostingStatsPage();
15
-
16
-
html.addEventListener('click', (e) => {
17
-
$id('account_menu').style.visibility = 'hidden';
18
-
});
19
13
20
14
$(document.querySelector('#search form')).addEventListener('submit', (e) => {
21
15
e.preventDefault();
···
67
61
68
62
window.biohazardEnabled = false;
69
63
localStorage.setItem('biohazard', 'false');
70
-
toggleMenuButton('biohazard', false);
64
+
accountMenu.toggleMenuButtonCheck('biohazard', false);
71
65
72
66
for (let p of document.querySelectorAll('p.hidden-replies, .content > .post.blocked, .blocked > .load-post')) {
73
67
$(p).style.display = 'none';
···
78
72
hideDialog(target.closest('.dialog'));
79
73
});
80
74
81
-
$(document.querySelector('#account')).addEventListener('click', (e) => {
82
-
toggleAccountMenu();
83
-
e.stopPropagation();
84
-
});
85
-
86
-
accountMenu.addEventListener('click', (e) => {
87
-
e.stopPropagation();
88
-
});
89
-
90
-
$(accountMenu.querySelector('a[data-action=biohazard]')).addEventListener('click', (e) => {
91
-
e.preventDefault();
92
-
93
-
let hazards = document.querySelectorAll('p.hidden-replies, .content > .post.blocked, .blocked > .load-post');
94
-
95
-
if (window.biohazardEnabled === false) {
96
-
window.biohazardEnabled = true;
97
-
localStorage.setItem('biohazard', 'true');
98
-
toggleMenuButton('biohazard', true);
99
-
Array.from(hazards).forEach(p => { $(p).style.display = 'block' });
100
-
} else {
101
-
window.biohazardEnabled = false;
102
-
localStorage.setItem('biohazard', 'false');
103
-
toggleMenuButton('biohazard', false);
104
-
Array.from(hazards).forEach(p => { $(p).style.display = 'none' });
105
-
}
106
-
});
107
-
108
-
$(accountMenu.querySelector('a[data-action=incognito]')).addEventListener('click', (e) => {
109
-
e.preventDefault();
110
-
111
-
if (isIncognito) {
112
-
localStorage.removeItem('incognito');
113
-
} else {
114
-
localStorage.setItem('incognito', '1');
115
-
}
116
-
117
-
location.reload();
118
-
});
119
-
120
-
$(accountMenu.querySelector('a[data-action=login]')).addEventListener('click', (e) => {
121
-
e.preventDefault();
122
-
toggleDialog(loginDialog);
123
-
$id('account_menu').style.visibility = 'hidden';
124
-
});
125
-
126
-
$(accountMenu.querySelector('a[data-action=logout]')).addEventListener('click', (e) => {
127
-
e.preventDefault();
128
-
logOut();
129
-
});
130
-
131
75
window.appView = new BlueskyAPI('api.bsky.app', false);
132
76
window.blueAPI = new BlueskyAPI('blue.mackuba.eu', false);
133
77
window.accountAPI = new BlueskyAPI(undefined, true);
134
78
135
79
if (accountAPI.isLoggedIn) {
136
80
accountAPI.host = accountAPI.user.pdsEndpoint;
137
-
hideMenuButton('login');
81
+
accountMenu.hideMenuButton('login');
138
82
139
83
if (!isIncognito) {
140
84
window.api = accountAPI;
141
-
showLoggedInStatus(true, api.user.avatar);
85
+
accountMenu.showLoggedInStatus(true, api.user.avatar);
142
86
} else {
143
87
window.api = appView;
144
-
showLoggedInStatus('incognito');
145
-
toggleMenuButton('incognito', true);
88
+
accountMenu.showLoggedInStatus('incognito');
89
+
accountMenu.toggleMenuButtonCheck('incognito', true);
146
90
}
147
91
} else {
148
92
window.api = appView;
149
-
hideMenuButton('logout');
150
-
hideMenuButton('incognito');
93
+
accountMenu.hideMenuButton('logout');
94
+
accountMenu.hideMenuButton('incognito');
151
95
}
152
96
153
-
toggleMenuButton('biohazard', window.biohazardEnabled !== false);
97
+
accountMenu.toggleMenuButtonCheck('biohazard', window.biohazardEnabled !== false);
154
98
155
99
parseQueryParams();
156
100
}
···
248
192
$id('login').classList.toggle('expanded');
249
193
}
250
194
251
-
function toggleAccountMenu() {
252
-
let menu = $id('account_menu');
253
-
menu.style.visibility = (menu.style.visibility == 'visible') ? 'hidden' : 'visible';
254
-
}
255
-
256
-
/** @param {string} buttonName */
257
-
258
-
function showMenuButton(buttonName) {
259
-
let button = $(accountMenu.querySelector(`a[data-action=${buttonName}]`));
260
-
let item = $(button.parentNode);
261
-
item.style.display = 'list-item';
262
-
}
263
-
264
-
/** @param {string} buttonName */
265
-
266
-
function hideMenuButton(buttonName) {
267
-
let button = $(accountMenu.querySelector(`a[data-action=${buttonName}]`));
268
-
let item = $(button.parentNode);
269
-
item.style.display = 'none';
270
-
}
271
-
272
-
/** @param {string} buttonName, @param {boolean} state */
273
-
274
-
function toggleMenuButton(buttonName, state) {
275
-
let button = $(accountMenu.querySelector(`a[data-action=${buttonName}]`));
276
-
let check = $(button.querySelector('.check'));
277
-
check.style.display = (state) ? 'inline' : 'none';
278
-
}
279
-
280
-
/** @param {boolean | 'incognito'} loggedIn, @param {string | undefined | null} [avatar] */
281
-
282
-
function showLoggedInStatus(loggedIn, avatar) {
283
-
let account = $id('account');
284
-
285
-
if (loggedIn === true && avatar) {
286
-
let button = $(account.querySelector('i'));
287
-
288
-
let img = $tag('img.avatar', { src: avatar });
289
-
img.style.display = 'none';
290
-
img.addEventListener('load', () => {
291
-
button.remove();
292
-
img.style.display = 'inline';
293
-
});
294
-
img.addEventListener('error', () => {
295
-
showLoggedInStatus(true, null);
296
-
})
297
-
298
-
account.append(img);
299
-
} else if (loggedIn === false) {
300
-
$id('account').innerHTML = `<i class="fa-regular fa-user-circle fa-xl"></i>`;
301
-
} else if (loggedIn === 'incognito') {
302
-
$id('account').innerHTML = `<i class="fa-solid fa-user-secret fa-lg"></i>`;
303
-
} else {
304
-
account.innerHTML = `<i class="fa-solid fa-user-circle fa-xl"></i>`;
305
-
}
306
-
}
307
-
308
195
function submitLogin() {
309
196
let handle = $id('login_handle', HTMLInputElement);
310
197
let password = $id('login_password', HTMLInputElement);
···
327
214
submit.style.display = 'inline';
328
215
cloudy.style.display = 'none';
329
216
330
-
loadCurrentUserAvatar();
331
-
showMenuButton('logout');
332
-
showMenuButton('incognito');
333
-
hideMenuButton('login');
217
+
accountMenu.loadCurrentUserAvatar();
218
+
219
+
accountMenu.showMenuButton('logout');
220
+
accountMenu.showMenuButton('incognito');
221
+
accountMenu.hideMenuButton('login');
334
222
335
223
let params = new URLSearchParams(location.search);
336
224
let page = params.get('page');
···
371
259
let pds = new BlueskyAPI(pdsEndpoint, true);
372
260
await pds.logIn(identifier, password);
373
261
return pds;
374
-
}
375
-
376
-
function loadCurrentUserAvatar() {
377
-
api.loadCurrentUserAvatar().then((url) => {
378
-
showLoggedInStatus(true, url);
379
-
}).catch((error) => {
380
-
console.log(error);
381
-
showLoggedInStatus(true, null);
382
-
});
383
262
}
384
263
385
264
function logOut() {
+1
-1
types.d.ts
+1
-1
types.d.ts
···
12
12
declare var isIncognito: boolean;
13
13
declare var biohazardEnabled: boolean;
14
14
declare var loginDialog: HTMLElement;
15
-
declare var accountMenu: HTMLElement;
15
+
declare var accountMenu: Menu;
16
16
declare var avatarPreloader: IntersectionObserver;
17
17
declare var threadPage: ThreadPage;
18
18
declare var postingStatsPage: PostingStatsPage;