-
Notifications
You must be signed in to change notification settings - Fork 126
/
LayoutEvents.ts
42 lines (37 loc) · 1.04 KB
/
LayoutEvents.ts
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 EventEmitter from 'eventemitter3';
import { unstable_batchedUpdates } from 'react-dom';
let emitterCache: EventEmitter;
function getEmitter() {
if (!emitterCache) {
emitterCache = new EventEmitter();
}
return emitterCache;
}
function listenBrowserEvents() {
window.addEventListener('scroll', emit, { capture: true });
window.addEventListener('resize', emit, { capture: true });
}
function unlistenBrowserEvents() {
window.removeEventListener('scroll', emit, { capture: true });
window.removeEventListener('resize', emit, { capture: true });
}
export function addListener(callback: () => void) {
const emitter = getEmitter();
if (emitter.listeners('layout').length === 0) {
listenBrowserEvents();
}
emitter.addListener('layout', callback);
return {
remove() {
emitter.removeListener('layout', callback);
if (emitter.listeners('layout').length === 0) {
unlistenBrowserEvents();
}
},
};
}
export function emit() {
unstable_batchedUpdates(() => {
getEmitter().emit('layout');
});
}