Only set dimensions if the window attributes change

Differential Revision: D19386339

fbshipit-source-id: b7f14c540ceec40cae0c4eb9fc93f2020a6ee16f
This commit is contained in:
Christoph Nakazawa
2020-01-13 23:26:14 -08:00
committed by Facebook Github Bot
parent 8219db9a4a
commit 35c6bb9ac0
+12 -5
View File
@@ -15,19 +15,26 @@ import {type DisplayMetrics} from './NativeDeviceInfo';
import {useEffect, useState} from 'react';
export default function useWindowDimensions(): DisplayMetrics {
const [dims, setDims] = useState(() => Dimensions.get('window'));
const [dimensions, setDimensions] = useState(() => Dimensions.get('window'));
useEffect(() => {
function handleChange({window}) {
setDims(window);
if (
dimensions.width !== window.width ||
dimensions.height !== window.height ||
dimensions.scale !== window.scale ||
dimensions.fontScale !== window.fontScale
) {
setDimensions(window);
}
}
Dimensions.addEventListener('change', handleChange);
// We might have missed an update between calling `get` in render and
// `addEventListener` in this handler, so we set it here. If there was
// no change, React will filter out this update as a no-op.
setDims(Dimensions.get('window'));
handleChange({window: Dimensions.get('window')});
return () => {
Dimensions.removeEventListener('change', handleChange);
};
}, []);
return dims;
}, [dimensions]);
return dimensions;
}