summaryrefslogtreecommitdiff
path: root/source/libs/on-pr-merge-panel-open.ts
blob: d8df675b337dac913abdeab389de4cc49f803b42 (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
// Memoization here is used to let onPrMergePanelOpen() be called multiple times without risking multiple attached handlers
import mem from 'mem';
import delegate, {DelegateSubscription, DelegateEvent} from 'delegate-it';

const delegateHandler = mem((callback: EventListener) => (event: DelegateEvent) => {
	if (event.delegateTarget.matches('.open')) {
		callback(event);
	}
});

const sessionResumeHandler = mem((callback: EventListener) => async (event: Event) => {
	await Promise.resolve(); // The `session:resume` event fires a bit too early
	callback(event);
});

export default function (callback: EventListener): DelegateSubscription[] {
	document.addEventListener(
		'session:resume',
		sessionResumeHandler(callback)
	);

	return [
		{
			// Imitate a DelegateSubscription for this event as well
			destroy() {
				document.removeEventListener(
					'session:resume',
					sessionResumeHandler(callback)
				);
			}
		},
		...delegate(
			'#discussion_bucket',
			'.js-merge-pr:not(.is-rebasing)',
			'details:toggled',
			delegateHandler(callback)
		)
	];
}