Thread viewer for Bluesky

fixed/silenced some typescript warnings

+7
models.js
··· 71 pageRoot; 72 73 /** 74 * Depth of the post in the getPostThread response it was loaded from, starting from 0. May be negative. 75 * @type {number | undefined} 76 */
··· 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
··· 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
··· 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
··· 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;