import React from 'react'; import { useLocation, useNavigate, useParams } from 'react-router-dom'; import { Dialog, DialogContent } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Heart } from 'lucide-react'; import { likePhoto } from '../services/photosApi'; type Photo = { id: number; file_path?: string; thumbnail_path?: string; likes_count?: number; created_at?: string; task_id?: number }; type Task = { id: number; title: string }; export default function PhotoLightbox() { const navigate = useNavigate(); const location = useLocation(); const { photoId } = useParams(); const [photo, setPhoto] = React.useState(null); const [task, setTask] = React.useState(null); const [taskLoading, setTaskLoading] = React.useState(false); const [likes, setLikes] = React.useState(null); const [liked, setLiked] = React.useState(false); // Extract event slug from URL path const getEventSlug = () => { const path = window.location.pathname; const match = path.match(/^\/e\/([^\/]+)\/photo\/[^\/]+$/); return match ? match[1] : null; }; const slug = getEventSlug(); // Load photo if not passed via state React.useEffect(() => { const statePhoto = (location.state as any)?.photo; if (statePhoto) { setPhoto(statePhoto); setLikes(statePhoto.likes_count ?? 0); return; } if (!photoId) return; (async () => { try { const res = await fetch(`/api/v1/photos/${photoId}`); if (res.ok) { const photoData = await res.json(); setPhoto(photoData); setLikes(photoData.likes_count ?? 0); } } catch (error) { console.error('Failed to load photo:', error); } })(); }, [photoId, location.state]); // Load task info if photo has task_id and slug is available React.useEffect(() => { if (!photo?.task_id || !slug) { setTask(null); setTaskLoading(false); return; } const taskId = photo.task_id; (async () => { setTaskLoading(true); try { const res = await fetch(`/api/v1/events/${slug}/tasks`); if (res.ok) { const tasks = await res.json(); const foundTask = tasks.find((t: any) => t.id === taskId); if (foundTask) { setTask({ id: foundTask.id, title: foundTask.title || `Aufgabe ${taskId}` }); } else { setTask({ id: taskId, title: `Unbekannte Aufgabe ${taskId}` }); } } else { setTask({ id: taskId, title: `Unbekannte Aufgabe ${taskId}` }); } } catch (error) { console.error('Failed to load task:', error); setTask({ id: taskId, title: `Unbekannte Aufgabe ${taskId}` }); } finally { setTaskLoading(false); } })(); }, [photo?.task_id, slug]); async function onLike() { if (liked || !photo) return; setLiked(true); try { const count = await likePhoto(photo.id); setLikes(count); } catch (error) { console.error('Like failed:', error); setLiked(false); } } function onOpenChange(open: boolean) { if (!open) navigate(-1); } if (!photo && !photoId) { return null; } return ( {/* Header with controls */}
{/* Task Info Overlay */} {task && (
Task: {task.title}
{taskLoading && (
Lade Aufgabe...
)}
)} {/* Photo Display */}
{photo ? ( Foto { console.error('Image load error:', e); (e.target as HTMLImageElement).style.display = 'none'; }} /> ) : (
Lade Foto...
)}
{/* Loading state for task */} {taskLoading && !task && (
Lade Aufgabe...
)}
); }