import type { PropsWithChildren, ReactNode } from 'react'; import React from 'react'; import { ImageProps, ImageStyle, ViewStyle } from 'react-native'; import Animated, { interpolate, useAnimatedRef, useAnimatedScrollHandler, useAnimatedStyle, useSharedValue, } from 'react-native-reanimated'; import ThemedView from './View'; import useTheme from '../hooks/useTheme'; type Props = PropsWithChildren<{ imageUrl: string; imageHeight?: number; headerComponent?: ReactNode; imageStyle?: ImageStyle; imageProps?: ImageProps; childrenStyle?: ViewStyle; }>; export default function ParallaxScrollView({ children, imageUrl, imageHeight = 500, headerComponent, imageStyle, imageProps, childrenStyle, }: Props) { const HEADER_HEIGHT = imageHeight; const { currentTheme } = useTheme(); const scrollRef = useAnimatedRef(); const scrollOffset = useSharedValue(0); // Smoothly track scroll offset using event handler const onScroll = useAnimatedScrollHandler({ onScroll: (event) => { scrollOffset.value = event.contentOffset.y; }, }); const headerAnimatedStyle = useAnimatedStyle(() => ({ transform: [ { translateY: interpolate( scrollOffset.value, [-HEADER_HEIGHT, 0, HEADER_HEIGHT], [-HEADER_HEIGHT / 2, 0, HEADER_HEIGHT * 0.5] ), }, { scale: interpolate( scrollOffset.value, [-HEADER_HEIGHT, 0, HEADER_HEIGHT], [1.8, 1, 1] ), }, ], })); const HeaderComponent = () => { if (headerComponent) return <>{headerComponent}; return ( ); }; return ( {/* Header Section */} {/* Content Section */} {children} ); }