Skip to content

Commit d86e1ae

Browse files
committed
feat(*): remove event listeners when nothing is connected
1 parent 9d753fc commit d86e1ae

File tree

1 file changed

+30
-2
lines changed

1 file changed

+30
-2
lines changed

lib/ViewportProvider.tsx

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,23 @@ const ViewportContext = React.createContext({
2525

2626
export const Consumer = ViewportContext.Consumer;
2727

28-
export default class ViewportProvider extends React.PureComponent {
28+
export default class ViewportProvider extends React.PureComponent<
29+
{},
30+
{ hasListeners: boolean }
31+
> {
2932
private listeners: IListener[] = [];
33+
private updateListenersTick: NodeJS.Timer;
34+
35+
constructor(props: {}) {
36+
super(props);
37+
this.state = {
38+
hasListeners: false,
39+
};
40+
}
41+
42+
componentWillUnmount() {
43+
clearTimeout(this.updateListenersTick);
44+
}
3045

3146
updateListeners = (
3247
publicState: IViewport,
@@ -57,12 +72,23 @@ export default class ViewportProvider extends React.PureComponent {
5772
options: IViewportChangeOptions,
5873
) => {
5974
this.listeners.push({ handler, ...options });
75+
this.updateListenersLazy();
6076
};
6177

6278
removeViewportChangeListener = (h: TViewportChangeHandler) => {
6379
this.listeners = this.listeners.filter(({ handler }) => handler !== h);
80+
this.updateListenersLazy();
6481
};
6582

83+
updateListenersLazy() {
84+
clearTimeout(this.updateListenersTick);
85+
this.updateListenersTick = setTimeout(() => {
86+
this.setState({
87+
hasListeners: this.listeners.length !== 0,
88+
});
89+
}, 0);
90+
}
91+
6692
renderChildren = (props: { hasRootProviderAsParent: boolean }) => {
6793
if (!props.hasRootProviderAsParent) {
6894
const value = {
@@ -73,7 +99,9 @@ export default class ViewportProvider extends React.PureComponent {
7399
};
74100
return (
75101
<React.Fragment>
76-
<ViewportCollector onUpdate={this.updateListeners} />
102+
{this.state.hasListeners && (
103+
<ViewportCollector onUpdate={this.updateListeners} />
104+
)}
77105
<ViewportContext.Provider value={value}>
78106
{this.props.children}
79107
</ViewportContext.Provider>

0 commit comments

Comments
 (0)