+7
models.js
+7
models.js
···
71
pageRoot;
72
73
/**
74
+
* Info about the author of the "grandparent" post. Included only in feedPost views, for the purposes
75
+
* of feed filtering algorithm.
76
+
* @type {json | undefined}
77
+
*/
78
+
grandparentAuthor;
79
+
80
+
/**
81
* Depth of the post in the getPostThread response it was loaded from, starting from 0. May be negative.
82
* @type {number | undefined}
83
*/
+2
-2
post_component.js
+2
-2
post_component.js
···
380
link.addEventListener('click', (e) => {
381
e.preventDefault();
382
loadMore.innerHTML = `<img class="loader" src="icons/sunny.png">`;
383
-
loadSubtree(this.post, loadMore.closest('.post'));
384
});
385
386
loadMore.appendChild(link);
···
416
417
loadHiddenReplies(loadMoreButton) {
418
loadMoreButton.innerHTML = `<img class="loader" src="icons/sunny.png">`;
419
-
loadHiddenSubtree(this.post, loadMoreButton.closest('.post'));
420
}
421
422
/** @param {HTMLLinkElement} authorLink */
···
380
link.addEventListener('click', (e) => {
381
e.preventDefault();
382
loadMore.innerHTML = `<img class="loader" src="icons/sunny.png">`;
383
+
loadSubtree(this.post, this.rootElement);
384
});
385
386
loadMore.appendChild(link);
···
416
417
loadHiddenReplies(loadMoreButton) {
418
loadMoreButton.innerHTML = `<img class="loader" src="icons/sunny.png">`;
419
+
loadHiddenSubtree(this.post, this.rootElement);
420
}
421
422
/** @param {HTMLLinkElement} authorLink */
+15
-10
skythread.js
+15
-10
skythread.js
···
7
window.biohazardEnabled = JSON.parse(localStorage.getItem('biohazard') ?? 'null');
8
9
window.loginDialog = document.querySelector('#login');
10
11
html.addEventListener('click', (e) => {
12
$id('account_menu').style.visibility = 'hidden';
···
52
window.loadInfohazard = undefined;
53
}
54
55
-
hideDialog(e.target.closest('.dialog'));
56
});
57
58
document.querySelector('#biohazard_hide').addEventListener('click', (e) => {
···
66
p.style.display = 'none';
67
}
68
69
-
hideDialog(e.target.closest('.dialog'));
70
});
71
72
document.querySelector('#account').addEventListener('click', (e) => {
···
74
e.stopPropagation();
75
});
76
77
-
document.querySelector('#account_menu').addEventListener('click', (e) => {
78
e.stopPropagation();
79
});
80
81
-
document.querySelector('#account_menu a[data-action=biohazard]').addEventListener('click', (e) => {
82
e.preventDefault();
83
84
let hazards = document.querySelectorAll('p.hidden-replies, .content > .post.blocked, .blocked > .load-post');
···
96
}
97
});
98
99
-
document.querySelector('#account_menu a[data-action=incognito]').addEventListener('click', (e) => {
100
e.preventDefault();
101
102
if (isIncognito) {
···
108
location.reload();
109
});
110
111
-
document.querySelector('#account_menu a[data-action=login]').addEventListener('click', (e) => {
112
e.preventDefault();
113
toggleDialog(loginDialog);
114
$id('account_menu').style.visibility = 'hidden';
115
});
116
117
-
document.querySelector('#account_menu a[data-action=logout]').addEventListener('click', (e) => {
118
e.preventDefault();
119
logOut();
120
});
···
248
/** @param {string} buttonName */
249
250
function showMenuButton(buttonName) {
251
-
let button = document.querySelector(`#account_menu a[data-action=${buttonName}]`);
252
button.parentNode.style.display = 'list-item';
253
}
254
255
/** @param {string} buttonName */
256
257
function hideMenuButton(buttonName) {
258
-
let button = document.querySelector(`#account_menu a[data-action=${buttonName}]`);
259
button.parentNode.style.display = 'none';
260
}
261
262
/** @param {string} buttonName, @param {boolean} state */
263
264
function toggleMenuButton(buttonName, state) {
265
-
let button = document.querySelector(`#account_menu a[data-action=${buttonName}]`);
266
button.querySelector('.check').style.display = (state) ? 'inline' : 'none';
267
}
268
···
7
window.biohazardEnabled = JSON.parse(localStorage.getItem('biohazard') ?? 'null');
8
9
window.loginDialog = document.querySelector('#login');
10
+
window.accountMenu = document.querySelector('#account_menu');
11
12
html.addEventListener('click', (e) => {
13
$id('account_menu').style.visibility = 'hidden';
···
53
window.loadInfohazard = undefined;
54
}
55
56
+
let target = /** @type {AnyElement} */ (/** @type {unknown} */ (e.target));
57
+
58
+
hideDialog(target.closest('.dialog'));
59
});
60
61
document.querySelector('#biohazard_hide').addEventListener('click', (e) => {
···
69
p.style.display = 'none';
70
}
71
72
+
let target = /** @type {AnyElement} */ (/** @type {unknown} */ (e.target));
73
+
74
+
hideDialog(target.closest('.dialog'));
75
});
76
77
document.querySelector('#account').addEventListener('click', (e) => {
···
79
e.stopPropagation();
80
});
81
82
+
accountMenu.addEventListener('click', (e) => {
83
e.stopPropagation();
84
});
85
86
+
accountMenu.querySelector('a[data-action=biohazard]').addEventListener('click', (e) => {
87
e.preventDefault();
88
89
let hazards = document.querySelectorAll('p.hidden-replies, .content > .post.blocked, .blocked > .load-post');
···
101
}
102
});
103
104
+
accountMenu.querySelector('a[data-action=incognito]').addEventListener('click', (e) => {
105
e.preventDefault();
106
107
if (isIncognito) {
···
113
location.reload();
114
});
115
116
+
accountMenu.querySelector('a[data-action=login]').addEventListener('click', (e) => {
117
e.preventDefault();
118
toggleDialog(loginDialog);
119
$id('account_menu').style.visibility = 'hidden';
120
});
121
122
+
accountMenu.querySelector('a[data-action=logout]').addEventListener('click', (e) => {
123
e.preventDefault();
124
logOut();
125
});
···
253
/** @param {string} buttonName */
254
255
function showMenuButton(buttonName) {
256
+
let button = accountMenu.querySelector(`a[data-action=${buttonName}]`);
257
button.parentNode.style.display = 'list-item';
258
}
259
260
/** @param {string} buttonName */
261
262
function hideMenuButton(buttonName) {
263
+
let button = accountMenu.querySelector(`a[data-action=${buttonName}]`);
264
button.parentNode.style.display = 'none';
265
}
266
267
/** @param {string} buttonName, @param {boolean} state */
268
269
function toggleMenuButton(buttonName, state) {
270
+
let button = accountMenu.querySelector(`a[data-action=${buttonName}]`);
271
button.querySelector('.check').style.display = (state) ? 'inline' : 'none';
272
}
273
+4
types.d.ts
+4
types.d.ts
···
12
declare var isIncognito: boolean;
13
declare var biohazardEnabled: boolean;
14
declare var loginDialog: AnyElement;
15
16
type SomeElement = Element | HTMLElement | AnyElement;
17
type json = Record<string, any>;
···
20
classList: CSSClassList;
21
className: string;
22
innerText: string;
23
nextElementSibling: AnyElement;
24
parentNode: AnyElement;
25
src: string;
···
31
32
append(...e: Array<string | SomeElement>): void;
33
appendChild(e: SomeElement): void;
34
querySelector(q: string): AnyElement;
35
prepend(...e: Array<string | SomeElement>): void;
36
remove(): void;
37
replaceChildren(e: SomeElement): void;
···
12
declare var isIncognito: boolean;
13
declare var biohazardEnabled: boolean;
14
declare var loginDialog: AnyElement;
15
+
declare var accountMenu: AnyElement;
16
17
type SomeElement = Element | HTMLElement | AnyElement;
18
type json = Record<string, any>;
···
21
classList: CSSClassList;
22
className: string;
23
innerText: string;
24
+
innerHTML: string;
25
nextElementSibling: AnyElement;
26
parentNode: AnyElement;
27
src: string;
···
33
34
append(...e: Array<string | SomeElement>): void;
35
appendChild(e: SomeElement): void;
36
+
closest(q: string): AnyElement;
37
querySelector(q: string): AnyElement;
38
+
querySelectorAll(q: string): AnyElement[];
39
prepend(...e: Array<string | SomeElement>): void;
40
remove(): void;
41
replaceChildren(e: SomeElement): void;