diff options
Diffstat (limited to 'source/helpers/on-element-replacement.ts')
-rw-r--r-- | source/helpers/on-element-replacement.ts | 42 |
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); + } + } +} |