import React, { useState, useEffect } from 'react'; import { View, Text, StyleSheet, FlatList, TouchableOpacity, Dimensions, ActivityIndicator, StatusBar, } from 'react-native'; import { useRoute, useNavigation } from '@react-navigation/native'; import { SafeAreaView } from 'react-native-safe-area-context'; import FastImage from '@d11/react-native-fast-image'; import { MaterialIcons } from '@expo/vector-icons'; import { TMDBService } from '../services/tmdbService'; import { useTheme } from '../contexts/ThemeContext'; import { useSettings } from '../hooks/useSettings'; const { width } = Dimensions.get('window'); const BACKDROP_WIDTH = width * 0.9; const BACKDROP_HEIGHT = (BACKDROP_WIDTH * 9) / 16; // 16:9 aspect ratio interface BackdropItem { file_path: string; width: number; height: number; aspect_ratio: number; } interface RouteParams { tmdbId: number; type: 'movie' | 'tv'; title: string; } const BackdropGalleryScreen: React.FC = () => { const route = useRoute(); const navigation = useNavigation(); const { tmdbId, type, title } = route.params as RouteParams; const { currentTheme } = useTheme(); const { settings } = useSettings(); const [backdrops, setBackdrops] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchBackdrops = async () => { try { setLoading(true); const tmdbService = TMDBService.getInstance(); // Get language preference const language = settings.useTmdbLocalizedMetadata ? (settings.tmdbLanguagePreference || 'en') : 'en'; let images; if (type === 'movie') { images = await tmdbService.getMovieImagesFull(tmdbId, language); } else { images = await tmdbService.getTvShowImagesFull(tmdbId, language); } if (__DEV__) { console.log('[BackdropGallery] TMDB response:', { tmdbId, type, hasImages: !!images, backdropsCount: images?.backdrops?.length || 0, images }); } if (images && images.backdrops && images.backdrops.length > 0) { setBackdrops(images.backdrops); } else { setError('No backdrops found'); } } catch (err) { setError('Failed to load backdrops'); console.error('Backdrop fetch error:', err); } finally { setLoading(false); } }; if (tmdbId) { fetchBackdrops(); } }, [tmdbId, type, settings.useTmdbLocalizedMetadata, settings.tmdbLanguagePreference]); const renderBackdrop = ({ item, index }: { item: BackdropItem; index: number }) => { const imageUrl = `https://image.tmdb.org/t/p/w1280${item.file_path}`; return ( {item.width} × {item.height} {item.aspect_ratio.toFixed(2)}:1 ); }; const renderHeader = () => ( navigation.goBack()} > {title} {backdrops.length} Backdrop{backdrops.length !== 1 ? 's' : ''} ); if (loading) { return ( {renderHeader()} Loading backdrops... ); } if (error || backdrops.length === 0) { return ( {renderHeader()} {error || 'No backdrops available'} ); } return ( {renderHeader()} `${item.file_path}-${index}`} renderItem={renderBackdrop} contentContainerStyle={styles.listContainer} showsVerticalScrollIndicator={false} /> ); }; const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#000', }, header: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: 16, paddingVertical: 12, borderBottomWidth: 1, borderBottomColor: 'rgba(255,255,255,0.1)', }, backButton: { padding: 8, marginRight: 12, }, titleContainer: { flex: 1, }, title: { fontSize: 18, fontWeight: '700', marginBottom: 2, }, subtitle: { fontSize: 14, }, listContainer: { padding: 16, }, backdropContainer: { marginBottom: 20, borderRadius: 12, overflow: 'hidden', backgroundColor: 'rgba(255,255,255,0.05)', }, backdropImage: { width: BACKDROP_WIDTH, height: BACKDROP_HEIGHT, alignSelf: 'center', }, backdropInfo: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', padding: 12, backgroundColor: 'rgba(0,0,0,0.7)', }, backdropResolution: { fontSize: 12, opacity: 0.8, }, backdropAspect: { fontSize: 12, opacity: 0.8, }, loadingContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', }, loadingText: { marginTop: 12, fontSize: 16, }, errorContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', padding: 32, }, errorText: { marginTop: 16, fontSize: 16, textAlign: 'center', }, }); export default BackdropGalleryScreen;