very very very basic plugin system works

This commit is contained in:
Alphons Joseph
2025-03-12 19:02:32 +08:00
parent 5eb92bc87a
commit 6b39f60db7
12 changed files with 3402 additions and 3339 deletions
+64
View File
@@ -0,0 +1,64 @@
import { eventManager } from "@/seqta/utils/listeners/EventManager"
import { delay } from "@/seqta/utils/delay"
export async function waitForElm(
selector: string,
usePolling: boolean = false,
interval: number = 100,
): Promise<Element> {
if (usePolling) {
return new Promise((resolve) => {
const checkForElement = () => {
const element = document.querySelector(selector)
if (element) {
resolve(element)
} else {
setTimeout(checkForElement, interval)
}
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", checkForElement)
} else {
checkForElement()
}
})
} else {
return new Promise((resolve) => {
const registerObserver = () => {
const { unregister } = eventManager.register(
`${selector}`,
{
customCheck: (element) => element.matches(selector),
},
async (element) => {
resolve(element)
await delay(1)
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) {
if (unregister) unregister()
resolve(element)
return
}
})
}
}