import { HeroCarousel, useInterpolateInsideCarousel } from '@strv/react-native-hero-carousel'
import { SafeAreaView, StyleSheet, View, Text, Dimensions } from 'react-native'
import { Image } from 'expo-image'
import { LinearGradient } from 'expo-linear-gradient'
import Animated, { useAnimatedStyle, interpolate, Extrapolation } from 'react-native-reanimated'
import { Pagination } from './components/Pagination'
import { useEffect } from 'react'
import { BlurView } from 'expo-blur'
const { width: SCREEN_WIDTH, height: SCREEN_HEIGHT } = Dimensions.get('window')
const getRandomImageUrl = () => {
return `https://picsum.photos/${SCREEN_WIDTH * 3}/${SCREEN_HEIGHT * 3}?random=${Math.floor(
Math.random() * 1000,
)}`
}
const images = Array.from({ length: 5 }, getRandomImageUrl)
const Slide = ({ image, title, index }: { image: string; title: string; index: number }) => {
const progress = useInterpolateInsideCarousel({
valueBefore: 0,
thisValue: 1,
valueAfter: 0,
offset: 0.2,
})
const rStyle = useAnimatedStyle(() => {
return {
flex: 1,
width: '100%',
height: '100%',
alignItems: 'center',
justifyContent: 'center',
transformOrigin: 'center',
transform: [
{
scale: interpolate(progress.value, [0, 1], [0.8, 1], Extrapolation.CLAMP),
},
{
rotate: `${interpolate(progress.value, [0, 1], [-15, 0], Extrapolation.CLAMP)}deg`,
},
],
opacity: progress.value,
}
})
return (
{title}
)
}
export default function AnimatedExample() {
// Preload all images when component mounts
useEffect(() => {
Image.prefetch(images)
}, [])
return (
{images.map((image, index) => (
))}
)
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: 'black',
},
carouselContainer: {
flex: 0.8,
borderRadius: 16,
overflow: 'hidden',
marginTop: 64,
},
paginationContainer: {
justifyContent: 'center',
alignItems: 'center',
flex: 0.2,
},
blurView: {
bottom: 40,
left: 20,
position: 'absolute',
borderRadius: 16,
padding: 20,
overflow: 'hidden',
},
slide: {
flex: 1,
width: '100%',
height: '100%',
overflow: 'hidden',
},
image: {
width: '100%',
height: '100%',
transformOrigin: 'center',
transform: [{ scale: 1.3 }],
backgroundColor: 'gray',
},
gradient: {
position: 'absolute',
bottom: 0,
left: 0,
right: 0,
height: '50%',
justifyContent: 'flex-end',
padding: 20,
},
title: {
fontSize: 32,
lineHeight: 32,
fontWeight: 'bold',
color: 'white',
},
})