@applicaster/zapp-react-native-ui-components
Version:
Applicaster Zapp React Native ui components for the Quick Brick App
72 lines (63 loc) • 1.91 kB
text/typescript
import { Image as RNImage } from "react-native";
import memoizee from "memoizee";
import { quickBrickLogger } from "@applicaster/zapp-react-native-utils/logger";
import { noop } from "@applicaster/zapp-react-native-utils/functionUtils";
import { toFiniteNumberWithDefault } from "@applicaster/zapp-react-native-utils/numberUtils";
type Size = {
width: number;
height: number;
};
const logger = quickBrickLogger
.addSubsystem("zapp-react-native-ui-components")
.addSubsystem("Components")
.addSubsystem("MasterCell")
.addSubsystem("DefaultComponents")
.addSubsystem("Image.android");
const THRESHOLD = 2; // in how many times size should be BIGGER than expected
const isSizeTooBig = (realSize: number, expectedSize: number): boolean =>
toFiniteNumberWithDefault(0, realSize / expectedSize) >= THRESHOLD;
const getImageSize = (uri: string): Promise<Size> => {
return new Promise((resolve, reject) => {
RNImage.getSize(
uri,
(width: number, height: number) => {
const size: Size = { width, height };
resolve(size);
},
reject
);
});
};
const checkTooBigImageSize = (
uri: string,
expectedWidth: number,
expectedHeight: number
): void => {
getImageSize(uri)
.then(({ width, height }) => {
if (isSizeTooBig(width, expectedWidth)) {
logger.warning({
message: "Width of image is much bigger than expected",
data: {
uri,
width,
expectedWidth,
},
});
}
if (isSizeTooBig(height, expectedHeight)) {
logger.warning({
message: "Height of image is much bigger than expected",
data: {
uri,
height,
expectedHeight,
},
});
}
})
.catch(noop);
};
export const runOnceCheckTooBigImageSize = memoizee(checkTooBigImageSize, {
primitive: true,
});