tooot/src/screens/Shared/ImagesViewer.tsx

118 lines
3.3 KiB
TypeScript
Raw Normal View History

import { HeaderLeft, HeaderRight } from '@components/Header'
import { StyleConstants } from '@utils/styles/constants'
2020-12-25 18:20:09 +01:00
import { findIndex } from 'lodash'
import React, { useCallback, useState } from 'react'
2021-01-13 01:03:46 +01:00
import {
Image,
Platform,
Share,
StyleSheet,
Text
} from 'react-native'
2020-12-25 18:20:09 +01:00
import ImageViewer from 'react-native-image-zoom-viewer'
import { IImageInfo } from 'react-native-image-zoom-viewer/built/image-viewer.type'
import { useSafeAreaInsets } from 'react-native-safe-area-context'
import { createNativeStackNavigator } from 'react-native-screens/native-stack'
2021-01-07 22:18:14 +01:00
import { SharedImagesViewerProp } from './sharedScreens'
2020-12-25 18:20:09 +01:00
const Stack = createNativeStackNavigator()
const TheImage = ({
style,
source,
imageUrls
2020-12-25 18:20:09 +01:00
}: {
style: any
source: { uri: string }
imageUrls: (IImageInfo & {
preview_url: Mastodon.AttachmentImage['preview_url']
remote_url: Mastodon.AttachmentImage['remote_url']
imageIndex: number
})[]
}) => {
const [imageVisible, setImageVisible] = useState(false)
Image.getSize(source.uri, () => setImageVisible(true))
return (
<Image
style={style}
source={{
uri: imageVisible
? source.uri
: imageUrls[findIndex(imageUrls, ['url', source.uri])].preview_url
2020-12-25 18:20:09 +01:00
}}
/>
)
}
2021-01-07 22:18:14 +01:00
const ScreenSharedImagesViewer: React.FC<SharedImagesViewerProp> = ({
2020-12-25 18:20:09 +01:00
route: {
params: { imageUrls, imageIndex }
},
navigation
}) => {
const safeAreaInsets = useSafeAreaInsets()
const initialIndex = findIndex(imageUrls, ['imageIndex', imageIndex])
const [currentIndex, setCurrentIndex] = useState(initialIndex)
const component = useCallback(
() => (
<ImageViewer
index={initialIndex}
imageUrls={imageUrls}
pageAnimateTime={250}
2020-12-25 18:20:09 +01:00
enableSwipeDown={true}
useNativeDriver={true}
swipeDownThreshold={100}
2020-12-25 18:20:09 +01:00
renderIndicator={() => <></>}
saveToLocalByLongPress={false}
onSwipeDown={() => navigation.goBack()}
style={{ flex: 1, marginBottom: 44 + safeAreaInsets.bottom }}
2020-12-25 18:20:09 +01:00
onChange={index => index !== undefined && setCurrentIndex(index)}
renderImage={props => <TheImage {...props} imageUrls={imageUrls} />}
2020-12-25 18:20:09 +01:00
/>
),
[]
)
2021-01-13 01:03:46 +01:00
const onPress = useCallback(() => {
switch (Platform.OS) {
case 'ios':
return Share.share({ url: imageUrls[currentIndex].url })
case 'android':
return Share.share({ message: imageUrls[currentIndex].url })
}
}, [currentIndex])
2020-12-25 18:20:09 +01:00
return (
2021-01-13 01:03:46 +01:00
<Stack.Navigator screenOptions={{ headerHideShadow: true, headerTopInsetEnabled: false }}>
2020-12-25 18:20:09 +01:00
<Stack.Screen
name='Screen-Shared-ImagesViewer-Root'
component={component}
options={{
contentStyle: { backgroundColor: 'black' },
headerStyle: { backgroundColor: 'black' },
headerLeft: () => (
<HeaderLeft content='X' onPress={() => navigation.goBack()} />
2020-12-25 18:20:09 +01:00
),
headerCenter: () => (
<Text style={styles.headerCenter}>
{currentIndex + 1} / {imageUrls.length}
</Text>
),
2021-01-13 01:03:46 +01:00
headerRight: () => <HeaderRight content='Share' onPress={onPress} />
2020-12-25 18:20:09 +01:00
}}
/>
</Stack.Navigator>
)
}
const styles = StyleSheet.create({
headerCenter: {
color: 'white',
...StyleConstants.FontStyle.M
2020-12-25 18:20:09 +01:00
}
})
export default React.memo(ScreenSharedImagesViewer, () => true)