Loading indicator
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user