import { Box, Grid, GridItem, Heading, Image, Button, HStack, Text, VStack, Badge } from '@chakra-ui/react'; import React, { useEffect, useState } from 'react'; import { API_URL } from '../../services/api'; import { Link as RouterLink } from 'react-router-dom'; import { Calendar, Image as ImageIcon } from 'lucide-react'; interface Album { id: string; title: string; url: string; date: string; photos_count: number; views_count?: number; photos: Array<{ id: string; page_url: string; image_1500: string; }>; } // Resolve backend-relative URLs against API origin const resolveBackendUrl = (path: string) => { try { if (/^https?:\/\//i.test(path)) return path; if (path.startsWith('/cache') || path.startsWith('/uploads') || path.startsWith('/api/')) { const origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin; const abs = new URL(path, origin); return abs.toString(); } return path; } catch { return path; } }; const PhotosSection: React.FC<{ zoneramaUrl?: string | null }> = ({ zoneramaUrl }) => { const [albums, setAlbums] = useState([]); const [loaded, setLoaded] = useState(false); useEffect(() => { let active = true; (async () => { try { const response = await fetch(`${API_URL}/gallery/albums`); if (response.ok) { const data = await response.json(); if (active) { // Get 5 most recent albums setAlbums((data.albums || []).slice(0, 5)); } } } catch { if (active) setAlbums([]); } finally { if (active) setLoaded(true); } })(); return () => { active = false }; }, []); const showSetupHint = loaded && albums.length === 0 && !zoneramaUrl; return ( Fotogalerie {showSetupHint && ( Žádné fotky nejsou k dispozici. Zadejte prosím odkaz na Zonerama v nastavení (Sociální sítě → Fotogalerie) a my ji budeme automaticky načítat. )} {/* Zonerama Attribution */} {albums.length > 0 && ( 📸 Fotografie z{' '} Zonerama )} {albums.map((album) => { const coverPhoto = album.photos && album.photos.length > 0 ? album.photos[0] : null; return ( {/* Cover Image */} {coverPhoto ? ( {album.title} ) : ( )} {/* Album Info */} {album.title} {album.date && ( {album.date} )} {album.photos_count} foto ); })} ); }; export default PhotosSection;