mirror of
https://github.com/BetterSEQTA/BetterSEQTA-Plus.git
synced 2026-06-06 03:34:40 +00:00
fix: waitforElm requiring old system for certain cases
This commit is contained in:
+60
-30
@@ -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,11 +687,11 @@ 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()
|
||||||
})
|
})
|
||||||
|
|
||||||
updateIframesWithDarkMode()
|
updateIframesWithDarkMode()
|
||||||
// Waits for page to call on load, run scripts
|
// Waits for page to call on load, run scripts
|
||||||
document.addEventListener(
|
document.addEventListener(
|
||||||
'load',
|
'load',
|
||||||
@@ -2463,8 +2498,3 @@ export function documentTextColor() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function LoadInit() {
|
|
||||||
console.log('[BetterSEQTA+] Started Init')
|
|
||||||
if (settingsState.onoff) loadHomePage()
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user