mirror of
https://github.com/sawyerf/Castafiore.git
synced 2026-03-24 12:57:47 +08:00
43 lines
1.3 KiB
JavaScript
43 lines
1.3 KiB
JavaScript
import React from 'react'
|
|
import { View, Image } from 'react-native'
|
|
import Icon from 'react-native-vector-icons/FontAwesome'
|
|
|
|
import size from '~/styles/size'
|
|
import { useTheme } from '~/contexts/theme'
|
|
|
|
const ImageMemo = React.memo(Image, (prevProps, nextProps) => {
|
|
return prevProps.source?.uri === nextProps.source?.uri
|
|
})
|
|
|
|
const ImageError = ({ source, style = {}, children = null, iconError = null, blurRadius = undefined }) => {
|
|
const [isImage, setIsImage] = React.useState(false)
|
|
const [lastSource, setLastSource] = React.useState({ uri: null })
|
|
const theme = useTheme()
|
|
|
|
React.useEffect(() => {
|
|
if (lastSource.uri === source?.uri) return
|
|
if (!source?.uri) {
|
|
setIsImage(false)
|
|
setLastSource(source)
|
|
} else {
|
|
setLastSource(source)
|
|
setIsImage(true)
|
|
}
|
|
}, [source, source?.uri])
|
|
|
|
if (isImage) return <ImageMemo source={lastSource} onError={() => setIsImage(false)} style={style} blurRadius={blurRadius} />
|
|
if (children) return children
|
|
if (iconError) return (
|
|
<View style={[{ justifyContent: 'center', alignItems: 'center' }, style]}>
|
|
<Icon name={iconError} size={size.icon.large} color={theme.primaryText} />
|
|
</View>
|
|
)
|
|
return (
|
|
<Image
|
|
source={require('~/../assets/foreground-icon.png')}
|
|
style={style}
|
|
/>
|
|
)
|
|
}
|
|
|
|
export default ImageError |