summaryrefslogtreecommitdiff
path: root/source/helpers/on-element-replacement.ts
blob: f5110205e94d2407f0db353cbbc10f710299b9c8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import {$} from 'select-dom';

import onElementRemoval from './on-element-removal.js';

/**
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 = $(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 = $(selector);
		if (trackedElement) {
			callback(trackedElement);
		}
	}
}