summaryrefslogtreecommitdiff
path: root/source/helpers/on-element-replacement.ts
diff options
context:
space:
mode:
Diffstat (limited to 'source/helpers/on-element-replacement.ts')
-rw-r--r--source/helpers/on-element-replacement.ts42
1 files changed, 42 insertions, 0 deletions
diff --git a/source/helpers/on-element-replacement.ts b/source/helpers/on-element-replacement.ts
new file mode 100644
index 00000000..a4ec40ae
--- /dev/null
+++ b/source/helpers/on-element-replacement.ts
@@ -0,0 +1,42 @@
+import select from 'select-dom';
+
+import onElementRemoval from './on-element-removal';
+
+/**
+Tracks the replacement of an element, identified via selector.
+
+@param selector The unique selector used to find the element and its future replacements
+@param callback The function to call after it's replaced
+*/
+
+export default async function onElementReplacement(
+ selector: string,
+ callback: (element: HTMLElement) => void,
+ {runCallbackOnStart = false, signal}: {runCallbackOnStart?: boolean; signal?: AbortSignal} = {},
+): Promise<void> {
+ if (signal?.aborted) {
+ return;
+ }
+
+ let trackedElement = select(selector);
+ if (!trackedElement) {
+ throw new Error('The element can’t be found');
+ }
+
+ if (runCallbackOnStart) {
+ callback(trackedElement);
+ }
+
+ while (trackedElement) {
+ // eslint-disable-next-line no-await-in-loop
+ await onElementRemoval(trackedElement, signal);
+ if (signal?.aborted) {
+ return;
+ }
+
+ trackedElement = select(selector);
+ if (trackedElement) {
+ callback(trackedElement);
+ }
+ }
+}