summaryrefslogtreecommitdiff
path: root/source/helpers/on-element-removal.ts
blob: 4aa3990deeb9205bcd73d822f1e8d9ba660236e4 (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
import mem from 'mem';

const onElementRemoval = mem(async (element: Element, signal?: AbortSignal): Promise<void> => {
	if (signal?.aborted) {
		return;
	}

	return new Promise(resolve => {
		const observer = new ResizeObserver(([{target}], observer) => {
			if (!target.isConnected) {
				observer.disconnect();
				resolve();
			}
		});

		if (signal) {
			signal.addEventListener('abort', () => {
				observer.disconnect();
				resolve();
			}, {
				once: true,
			});
		}

		observer.observe(element);
	});
});

export default onElementRemoval;