import { BlurView } from 'expo-blur' import React, { FC, memo, useState } from 'react' import { Image, View, useWindowDimensions } from 'react-native' import { runOnJS, useAnimatedReaction, useDerivedValue, useSharedValue, } from 'react-native-reanimated' import { LOADER_COLORS } from '../../core/constants' import { StoryImageProps } from '../../core/dto/componentsDTO' import Loader from '../Loader' import ImageStyles from './Image.styles' import StoryVideo from './video' import * as Device from 'expo-device' const StoryImage: FC = ({ stories, activeStory, defaultImage, isDefaultVideo, paused, videoProps, isActive, onImageLayout, onLoad, }) => { const { width: WIDTH, height: HEIGHT } = useWindowDimensions() const [data, setData] = useState<{ uri: string | undefined isVideo?: boolean duration?: number }>({ uri: defaultImage, isVideo: isDefaultVideo }) const loading = useSharedValue(true) const color = useSharedValue(LOADER_COLORS) const videoDuration = useSharedValue(undefined) const isPaused = useDerivedValue(() => paused.value || !isActive.value) const isTablet = Device.deviceType === Device.DeviceType.TABLET const onImageChange = async () => { if (!activeStory.value) { return } const story = stories.find(item => item.id === activeStory.value) if (!story) { return } if (data.uri === story.sourceUrl) { if (!loading.value) { onLoad(videoDuration.value) } } else { loading.value = true setData({ uri: story.sourceUrl, isVideo: story.mediaType === 'video', duration: story.duration, }) } const nextStory = stories[stories.indexOf(story) + 1] if (nextStory && nextStory.mediaType !== 'video') { Image.prefetch(nextStory.sourceUrl) } } useAnimatedReaction( () => isActive.value, (res, prev) => res !== prev && res && runOnJS(onImageChange)(), [isActive.value] ) useAnimatedReaction( () => activeStory.value, (res, prev) => res !== prev && runOnJS(onImageChange)(), [activeStory.value] ) const onContentLoad = (duration?: number) => { if (data.isVideo) { videoDuration.value = duration } loading.value = false if (isActive.value) { onLoad(duration) } } return ( <> {data.uri && (data.isVideo ? ( ) : ( onImageLayout(Math.min(HEIGHT, e.nativeEvent.layout.height)) } onLoad={() => onContentLoad()} /> {isTablet && ( <> onImageLayout( Math.min(HEIGHT, e.nativeEvent.layout.height) ) } onLoad={() => onContentLoad()} /> )} ))} ) } export default memo(StoryImage)