fix: waitforElm requiring old system for certain cases

This commit is contained in:
sethburkart123
2024-06-19 09:40:27 +10:00
parent 81a72061ca
commit 2d4e02d0df
4 changed files with 77 additions and 37 deletions
+59 -29
View File
@@ -26,7 +26,7 @@ import { injectYouTubeVideo } from './seqta/ui/VideoLoader'
import { initializeSettingsState, settingsState } from './seqta/utils/listeners/SettingsState' import { initializeSettingsState, settingsState } from './seqta/utils/listeners/SettingsState'
import { StorageChangeHandler } from './seqta/utils/listeners/StorageChanges' import { StorageChangeHandler } from './seqta/utils/listeners/StorageChanges'
import { AddBetterSEQTAElements } from './seqta/ui/AddBetterSEQTAElements' import { AddBetterSEQTAElements } from './seqta/ui/AddBetterSEQTAElements'
import { eventManager } from './seqta/utils/listeners/EventManager' import { eventManager, initializeEventManager } from './seqta/utils/listeners/EventManager'
declare global { declare global {
interface Window { interface Window {
@@ -312,7 +312,7 @@ export function OpenWhatsNewPopup() {
}) })
} }
async function finishLoad() { export async function finishLoad() {
try { try {
document.querySelector('.legacy-root')?.classList.remove('hidden'); document.querySelector('.legacy-root')?.classList.remove('hidden');
@@ -377,35 +377,63 @@ export function RemoveBackground() {
bk3[0].remove() bk3[0].remove()
} }
export async function waitForElm(selector: string) { export async function waitForElm(selector: string, usePolling: boolean = false, interval: number = 100): Promise<Element> {
console.log('[BetterSEQTA+] Waiting for element:', selector);
if (usePolling) {
return new Promise((resolve) => { return new Promise((resolve) => {
const querySelector = () => document.querySelector(selector); const checkForElement = () => {
const element = document.querySelector(selector);
if (querySelector()) { if (element) {
return resolve(querySelector()); console.log('[BetterSEQTA+] Element found:', selector);
resolve(element);
} else {
setTimeout(checkForElement, interval);
} }
};
const observer = new MutationObserver(() => { if (document.readyState === 'loading') {
if (querySelector()) { document.addEventListener('DOMContentLoaded', checkForElement);
resolve(querySelector()); } else {
observer.disconnect(); checkForElement();
} }
}); });
if (document.body) {
observer.observe(document.body, {
childList: true,
subtree: true,
});
} else { } else {
document.addEventListener('DOMContentLoaded', () => { return new Promise((resolve) => {
observer.observe(document.body, { const registerObserver = () => {
childList: true, const { unregister } = eventManager.register(`${selector}`, {
subtree: true, customCheck: (element) => element.matches(selector)
}, (element) => {
console.log('[BetterSEQTA+] Element found:', selector);
resolve(element);
unregister(); // Remove the listener once the element is found
}); });
return unregister;
};
let unregister = null;
if (document.readyState === 'loading') {
// DOM is still loading, wait for it to be ready
document.addEventListener('DOMContentLoaded', () => {
unregister = registerObserver();
});
} else {
unregister = registerObserver();
}
const querySelector = () => document.querySelector(selector);
const element = querySelector();
if (element) {
console.log('[BetterSEQTA+] Element found:', selector);
if (unregister) unregister();
resolve(element);
return;
}
}); });
} }
});
} }
export function GetCSSElement(file: string) { export function GetCSSElement(file: string) {
@@ -531,7 +559,9 @@ async function handleSublink(sublink: string | undefined): Promise<void> {
case 'home': case 'home':
case undefined: case undefined:
window.location.replace(`${location.origin}/#?page=/home`); window.location.replace(`${location.origin}/#?page=/home`);
LoadInit(); console.log('[BetterSEQTA+] Started Init')
if (settingsState.onoff) loadHomePage()
finishLoad();
break; break;
default: default:
await handleDefault(); await handleDefault();
@@ -565,6 +595,8 @@ async function handleMessages(node: Element): Promise<void> {
document.title = 'Direct Messages ― SEQTA Learn'; document.title = 'Direct Messages ― SEQTA Learn';
SortMessagePageItems(node); SortMessagePageItems(node);
if (!settingsState.animations) return;
await waitForElm('[data-message]'); await waitForElm('[data-message]');
animate( animate(
'[data-message]', '[data-message]',
@@ -579,6 +611,7 @@ async function handleMessages(node: Element): Promise<void> {
async function handleDashboard(node: Element): Promise<void> { async function handleDashboard(node: Element): Promise<void> {
if (!(node instanceof HTMLElement)) return; if (!(node instanceof HTMLElement)) return;
if (!settingsState.animations) return;
await waitForElm('.dashlet'); await waitForElm('.dashlet');
animate( animate(
@@ -594,6 +627,7 @@ async function handleDashboard(node: Element): Promise<void> {
async function handleDocuments(node: Element): Promise<void> { async function handleDocuments(node: Element): Promise<void> {
if (!(node instanceof HTMLElement)) return; if (!(node instanceof HTMLElement)) return;
if (!settingsState.animations) return;
await waitForElm('.document'); await waitForElm('.document');
animate( animate(
@@ -609,6 +643,7 @@ async function handleDocuments(node: Element): Promise<void> {
async function handleReports(node: Element): Promise<void> { async function handleReports(node: Element): Promise<void> {
if (!(node instanceof HTMLElement)) return; if (!(node instanceof HTMLElement)) return;
if (!settingsState.animations) return;
await waitForElm('.report'); await waitForElm('.report');
animate( animate(
@@ -652,7 +687,7 @@ export function tryLoad() {
elm.classList.remove('active') elm.classList.remove('active')
}) })
waitForElm('.code').then((elm: any) => { waitForElm('.code', true, 50).then((elm: any) => {
if (!elm.innerText.includes('BetterSEQTA')) LoadPageElements() if (!elm.innerText.includes('BetterSEQTA')) LoadPageElements()
}) })
@@ -2463,8 +2498,3 @@ export function documentTextColor() {
} }
} }
} }
function LoadInit() {
console.log('[BetterSEQTA+] Started Init')
if (settingsState.onoff) loadHomePage()
}
+1
View File
@@ -177,6 +177,7 @@ const DefaultValues: SettingsState = {
selectedColor: 'linear-gradient(40deg, rgba(201,61,0,1) 0%, RGBA(170, 5, 58, 1) 100%)', selectedColor: 'linear-gradient(40deg, rgba(201,61,0,1) 0%, RGBA(170, 5, 58, 1) 100%)',
originalSelectedColor: '', originalSelectedColor: '',
DarkMode: true, DarkMode: true,
animations: true,
shortcuts: [ shortcuts: [
{ {
name: 'YouTube', name: 'YouTube',
+9 -1
View File
@@ -33,6 +33,12 @@ class EventManager {
return EventManager.instance; return EventManager.instance;
} }
public static async initialize(): Promise<EventManager> {
const instance = EventManager.getInstance();
await instance.startObserving();
return instance;
}
public register(event: string, options: EventListenerOptions, callback: (element: Element) => void): { unregister: () => void } { public register(event: string, options: EventListenerOptions, callback: (element: Element) => void): { unregister: () => void } {
const id = this.generateUniqueId(); const id = this.generateUniqueId();
if (!this.listeners.has(event)) { if (!this.listeners.has(event)) {
@@ -57,7 +63,7 @@ class EventManager {
} }
} }
private startObserving(parentElement?: Element): void { private async startObserving(parentElement?: Element): Promise<void> {
const elementToObserve = parentElement || document.documentElement; const elementToObserve = parentElement || document.documentElement;
if (!this.mutationObservers.has(elementToObserve)) { if (!this.mutationObservers.has(elementToObserve)) {
const observer = new MutationObserver(this.handleMutations.bind(this)); const observer = new MutationObserver(this.handleMutations.bind(this));
@@ -113,6 +119,7 @@ class EventManager {
} }
private async checkElement(element: Element): Promise<void> { private async checkElement(element: Element): Promise<void> {
if (element.classList.contains('code')) console.log('Code Detected!');
for (const [event, listeners] of this.listeners.entries()) { for (const [event, listeners] of this.listeners.entries()) {
for (const { id, options, callback } of listeners) { for (const { id, options, callback } of listeners) {
if (this.matchesOptions(element, options)) { if (this.matchesOptions(element, options)) {
@@ -140,3 +147,4 @@ class EventManager {
} }
export const eventManager = EventManager.getInstance(); export const eventManager = EventManager.getInstance();
export const initializeEventManager = async () => await EventManager.initialize();
+1
View File
@@ -34,6 +34,7 @@ export interface SettingsState {
transparencyEffects: boolean; transparencyEffects: boolean;
justupdated?: boolean; justupdated?: boolean;
timeFormat?: string; timeFormat?: string;
animations: boolean;
} }
interface ToggleItem { interface ToggleItem {