import { useEffect } from 'react'; import { View, Dimensions } from 'react-native'; import Animated, { useSharedValue, useAnimatedStyle, withRepeat, withTiming, interpolate, } from 'react-native-reanimated'; import { useTheme } from '~/contexts/ThemeContext'; import { useViewStore, ViewMode } from '~/store/viewStore'; const { width } = Dimensions.get('window'); type ImageSkeletonProps = { viewMode?: ViewMode; }; export function ImageSkeleton({ viewMode: propViewMode }: ImageSkeletonProps) { const { theme } = useTheme(); const { galleryViewMode } = useViewStore(); const viewMode = propViewMode || galleryViewMode; const shimmerValue = useSharedValue(0); useEffect(() => { shimmerValue.value = withRepeat( withTiming(1, { duration: 1500 }), -1, false ); }, []); const animatedStyle = useAnimatedStyle(() => { const opacity = interpolate( shimmerValue.value, [0, 0.5, 1], [0.3, 0.5, 0.3] ); return { opacity }; }); // Calculate image size based on view mode (same logic as ImageCard) const getImageSize = () => { const spacing = 4; switch (viewMode) { case 'single': return width - spacing * 2; case 'grid3': return (width - spacing * 4) / 3; case 'grid5': return (width - spacing * 6) / 5; default: return width - spacing * 2; } }; const imageSize = getImageSize(); const isSingleColumn = viewMode === 'single'; return ( {/* Image Skeleton */} {/* Text Skeleton - Only for single column */} {isSingleColumn && ( )} ); } type ImageSkeletonGridProps = { count?: number; viewMode?: ViewMode; }; export function ImageSkeletonGrid({ count = 6, viewMode }: ImageSkeletonGridProps) { return ( {Array.from({ length: count }).map((_, index) => ( ))} ); }