Skip to content

Commit 1deba6f

Browse files
committed
fix(ViewportProvider): allow to update cache for fallback once per
second It is actually possibe that the fallback needs to be accessed more than once per session, e.g. when the listener count gets down to 0 and increases afterwards again. In this case the state should be recreated, but not for every component that requests it. The assumtion is, that this mostly happens on mount and the collector should soon take over, therefore we define a limit of maximum one request per second, to be up to date but don't implement a performance issue. Fixes #10
1 parent 0235692 commit 1deba6f

File tree

2 files changed

+10
-7
lines changed

2 files changed

+10
-7
lines changed

lib/ViewportProvider.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import ViewportCollector, {
1010
getClientDimensions,
1111
getClientScroll,
1212
} from './ViewportCollector';
13-
import { createPerformanceMarker } from './utils';
13+
import { createPerformanceMarker, now } from './utils';
1414

1515
interface IProps {
1616
experimentalSchedulerEnabled?: boolean;
@@ -23,26 +23,28 @@ interface IListener extends IViewportChangeOptions {
2323
skippedIterations: number;
2424
}
2525

26-
const getCurrentDefaultViewport = (() => {
26+
const createFallbackViewportRequester = () => {
2727
let defaultValue: IViewport;
28+
let lastAccess = 0;
2829
return (): IViewport => {
29-
if (!defaultValue) {
30+
if (!defaultValue || now() - lastAccess > 1000) {
3031
defaultValue = {
3132
scroll: getClientScroll(),
3233
dimensions: getClientDimensions(),
3334
};
35+
lastAccess = now();
3436
}
3537
return defaultValue;
3638
};
37-
})();
39+
};
3840

3941
export const ViewportContext = React.createContext({
4042
removeViewportChangeListener: (handler: TViewportChangeHandler) => {},
4143
addViewportChangeListener: (
4244
handler: TViewportChangeHandler,
4345
options: IViewportChangeOptions,
4446
) => {},
45-
getCurrentViewport: getCurrentDefaultViewport,
47+
getCurrentViewport: createFallbackViewportRequester(),
4648
hasRootProviderAsParent: false,
4749
version: '__VERSION__',
4850
});
@@ -197,12 +199,13 @@ export default class ViewportProvider extends React.PureComponent<
197199
}
198200

199201
private collector = React.createRef<ViewportCollector>();
202+
private getCurrentDefaultViewport = createFallbackViewportRequester();
200203
private contextValue = {
201204
addViewportChangeListener: this.addViewportChangeListener,
202205
removeViewportChangeListener: this.removeViewportChangeListener,
203206
getCurrentViewport: () => {
204207
if (!this.collector.current) {
205-
return getCurrentDefaultViewport();
208+
return this.getCurrentDefaultViewport();
206209
}
207210
return this.collector.current.getPropsFromState();
208211
},

lib/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ export const cancelAnimationFrame = ((): ((handle: number) => void) => {
187187
return clearTimeout;
188188
})();
189189

190-
const now =
190+
export const now =
191191
typeof performance !== 'undefined' && performance.now
192192
? performance.now.bind(performance)
193193
: Date.now;

0 commit comments

Comments
 (0)