Handle division by zero in the hook

This commit is contained in:
Dan Abramov
2024-11-01 03:00:29 +00:00
parent 79a61adef7
commit c95f8e8659
4 changed files with 17 additions and 17 deletions
+12 -4
View File
@@ -61,11 +61,11 @@ export function useImageDimensions({
}: { }: {
src: string src: string
knownDimensions: Dimensions | null knownDimensions: Dimensions | null
}) { }): [number | undefined, Dimensions | undefined] {
const [dims, setDims] = useState(() => knownDimensions ?? get(src) ?? null) const [dims, setDims] = useState(() => knownDimensions ?? get(src))
const [prevSrc, setPrevSrc] = useState(src) const [prevSrc, setPrevSrc] = useState(src)
if (src !== prevSrc) { if (src !== prevSrc) {
setDims(knownDimensions ?? get(src) ?? null) setDims(knownDimensions ?? get(src))
setPrevSrc(src) setPrevSrc(src)
} }
@@ -81,5 +81,13 @@ export function useImageDimensions({
} }
}, [dims, setDims, src]) }, [dims, setDims, src])
return dims let aspectRatio: number | undefined
if (dims) {
aspectRatio = dims.width / dims.height
if (Number.isNaN(aspectRatio)) {
aspectRatio = undefined
}
}
return [aspectRatio, dims]
} }
@@ -52,7 +52,7 @@ const ImageItem = ({
isScrollViewBeingDragged, isScrollViewBeingDragged,
}: Props) => { }: Props) => {
const [isScaled, setIsScaled] = useState(false) const [isScaled, setIsScaled] = useState(false)
const imageDimensions = useImageDimensions({ const [_aspectRatio, imageDimensions] = useImageDimensions({
src: imageSrc.uri, src: imageSrc.uri,
knownDimensions: imageSrc.dimensions, knownDimensions: imageSrc.dimensions,
}) })
@@ -47,7 +47,7 @@ const ImageItem = ({
const scrollViewRef = useAnimatedRef<Animated.ScrollView>() const scrollViewRef = useAnimatedRef<Animated.ScrollView>()
const translationY = useSharedValue(0) const translationY = useSharedValue(0)
const [scaled, setScaled] = useState(false) const [scaled, setScaled] = useState(false)
const imageDimensions = useImageDimensions({ const [_aspectRatio, imageDimensions] = useImageDimensions({
src: imageSrc.uri, src: imageSrc.uri,
knownDimensions: imageSrc.dimensions, knownDimensions: imageSrc.dimensions,
}) })
@@ -182,7 +182,7 @@ const styles = StyleSheet.create({
}) })
const getZoomRectAfterDoubleTap = ( const getZoomRectAfterDoubleTap = (
imageDimensions: ImageDimensions | null, imageDimensions: ImageDimensions | undefined,
touchX: number, touchX: number,
touchY: number, touchY: number,
): { ): {
+2 -10
View File
@@ -21,12 +21,11 @@ function useImageAspectRatio({
src: string src: string
knownDimensions: Dimensions | null knownDimensions: Dimensions | null
}) { }) {
const dims = useImageDimensions({src, knownDimensions}) const [raw] = useImageDimensions({src, knownDimensions})
let constrained: number | undefined let constrained: number | undefined
let max: number | undefined let max: number | undefined
let isCropped: boolean | undefined let isCropped: boolean | undefined
if (dims !== undefined) { if (raw !== undefined) {
const raw = calc(dims)
const ratio = 1 / 2 // max of 1:2 ratio in feeds const ratio = 1 / 2 // max of 1:2 ratio in feeds
constrained = Math.max(raw, ratio) constrained = Math.max(raw, ratio)
max = Math.max(raw, 0.25) // max of 1:4 in thread max = Math.max(raw, 0.25) // max of 1:4 in thread
@@ -227,10 +226,3 @@ export function AutoSizedImage({
) )
} }
} }
function calc(dim: Dimensions) {
if (dim.width === 0 || dim.height === 0) {
return 1
}
return dim.width / dim.height
}