Loading indicator

This commit is contained in:
Dan Abramov
2023-09-29 17:15:23 +01:00
parent ad3644e668
commit 0f86c5f7b6
@@ -1,19 +1,16 @@
import React, {useCallback, useRef, useEffect, useState} from 'react' import React, {useCallback, useRef, useEffect, useState} from 'react'
import { import {
ActivityIndicator,
View, View,
Dimensions, Dimensions,
StyleSheet, StyleSheet,
NativeScrollEvent,
NativeSyntheticEvent,
NativeMethodsMixin,
} from 'react-native' } from 'react-native'
import {Image} from 'expo-image' import {Image} from 'expo-image'
import Animated, { import Animated, {
runOnJS, runOnJS,
useAnimatedStyle, useAnimatedStyle,
useAnimatedReaction, useAnimatedReaction,
useDerivedValue,
useSharedValue, useSharedValue,
} from 'react-native-reanimated' } from 'react-native-reanimated'
import { import {
@@ -26,7 +23,6 @@ const AnimatedImage = Animated.createAnimatedComponent(Image)
import useImageDimensions from '../../hooks/useImageDimensions' import useImageDimensions from '../../hooks/useImageDimensions'
import {ImageSource} from '../../@types' import {ImageSource} from '../../@types'
import {ImageLoading} from './ImageLoading'
const SCREEN = Dimensions.get('window') const SCREEN = Dimensions.get('window')
@@ -165,6 +161,7 @@ const ImageItem = ({
doubleTapToZoomEnabled = true, doubleTapToZoomEnabled = true,
}: Props) => { }: Props) => {
const [isScaled, setIsScaled] = useState(false) const [isScaled, setIsScaled] = useState(false)
const [isLoaded, setIsLoaded] = useState(false)
const imageDimensions = useImageDimensions(imageSrc) const imageDimensions = useImageDimensions(imageSrc)
const committedTransform = useSharedValue(initialTransform) const committedTransform = useSharedValue(initialTransform)
const pinchOrigin = useSharedValue({ x: 0, y: 0 }) const pinchOrigin = useSharedValue({ x: 0, y: 0 })
@@ -268,6 +265,7 @@ const ImageItem = ({
panTranslation.value = { x: 0, y: 0 }; panTranslation.value = { x: 0, y: 0 };
}); });
const isLoading = !isLoaded || !imageDimensions;
return ( return (
<View <View
style={styles.container}> style={styles.container}>
@@ -278,8 +276,11 @@ const ImageItem = ({
style={[styles.image, animatedStyle]} style={[styles.image, animatedStyle]}
accessibilityLabel={imageSrc.alt} accessibilityLabel={imageSrc.alt}
accessibilityHint="" accessibilityHint=""
/> onLoad={() => setIsLoaded(true)}
>
</AnimatedImage>
</GestureDetector> </GestureDetector>
{isLoading && <ActivityIndicator size="small" color="#FFF" style={styles.loading} />}
</View> </View>
) )
} }
@@ -292,6 +293,13 @@ const styles = StyleSheet.create({
image: { image: {
flex: 1, flex: 1,
}, },
loading: {
position: 'absolute',
left: 0,
right: 0,
top: 0,
bottom: 0,
}
}) })
export default React.memo(ImageItem) export default React.memo(ImageItem)