blob: 85eb8828195cdb55fee4a05731eacfc2e39ece68 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import mem from 'mem';
import delegate, {DelegateEvent, DelegateEventHandler} from 'delegate-it';
// This lets you call `onDiffFileLoad` multiple times with the same callback but only ever a `load` listener is registered
const getDeduplicatedHandler = mem((callback: EventListener): DelegateEventHandler => (event: DelegateEvent) => {
event.delegateTarget.addEventListener('load', callback);
});
function createFragmentLoadListener(fragmentSelector: string, callback: EventListener, signal: AbortSignal): void {
// `loadstart` is fired when the fragment is still attached so event delegation works.
// `load` is fired after it’s detached, so `delegate` would never listen to it.
// This is why we listen to a global `loadstart` and then add a specific `load` listener on the element, which is fired even when the element is detached.
delegate(fragmentSelector, 'loadstart', getDeduplicatedHandler(callback), {capture: true, signal});
}
/** @deprecated Only here for `wait-for-checks` */
// eslint-disable-next-line import/prefer-default-export -- Deprecated file
export function onPrMergePanelLoad(callback: EventListener, signal: AbortSignal): void {
createFragmentLoadListener('.discussion-timeline-actions include-fragment[src$="/merging"]', callback, signal);
}
|