'use client'; import { useState, useEffect } from 'react'; import Link from 'next/link'; import { useLanguage } from '@/context/LanguageContext'; import { photosApi, eventsApi, PhotoGallery, Event, GalleryVisibility } from '@/lib/api'; import Card from '@/components/ui/Card'; import Button from '@/components/ui/Button'; import { Skeleton, ImageGridSkeleton } from '@/components/ui/Skeleton'; import VisibilityBadge from './VisibilityBadge'; import { CameraIcon, PlusIcon, XMarkIcon, } from '@heroicons/react/24/outline'; import toast from 'react-hot-toast'; export default function AdminPhotosPage() { const { locale } = useLanguage(); const [galleries, setGalleries] = useState([]); const [events, setEvents] = useState([]); const [loading, setLoading] = useState(true); const [showCreate, setShowCreate] = useState(false); const [creating, setCreating] = useState(false); const [form, setForm] = useState({ title: '', titleEs: '', eventId: '', visibility: 'private' as GalleryVisibility, }); useEffect(() => { Promise.all([photosApi.getGalleries(), eventsApi.getAll()]) .then(([g, e]) => { setGalleries(g.galleries); setEvents(e.events); }) .catch(() => toast.error(locale === 'es' ? 'Error al cargar galerías' : 'Failed to load galleries')) .finally(() => setLoading(false)); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const handleCreate = async (e: React.FormEvent) => { e.preventDefault(); if (!form.title.trim()) return; setCreating(true); try { const { gallery } = await photosApi.createGallery({ title: form.title.trim(), titleEs: form.titleEs.trim() || undefined, eventId: form.eventId || undefined, visibility: form.visibility, }); setGalleries((prev) => [gallery, ...prev]); setShowCreate(false); setForm({ title: '', titleEs: '', eventId: '', visibility: 'private' }); toast.success(locale === 'es' ? 'Galería creada' : 'Gallery created'); } catch (err) { toast.error(err instanceof Error ? err.message : 'Failed to create gallery'); } finally { setCreating(false); } }; if (loading) { return (
); } return (

{locale === 'es' ? 'Fotos de Eventos' : 'Event Photos'}

{galleries.length === 0 ? (

{locale === 'es' ? 'Sin galerías todavía' : 'No galleries yet'}

{locale === 'es' ? 'Crea una galería para compartir las fotos de un evento' : 'Create a gallery to share photos from a past event'}

) : (
{galleries.map((g) => (
{g.coverUrl ? ( // eslint-disable-next-line @next/next/no-img-element ) : ( )}

{locale === 'es' && g.titleEs ? g.titleEs : g.title}

{g.photoCount} {locale === 'es' ? 'fotos' : 'photos'} {g.event && <> · {locale === 'es' && g.event.titleEs ? g.event.titleEs : g.event.title}}

))}
)} {showCreate && (

{locale === 'es' ? 'Nueva Galería' : 'New Gallery'}

setForm({ ...form, title: e.target.value })} className="w-full px-4 py-2 rounded-btn border border-secondary-light-gray" placeholder="June Language Exchange" />
setForm({ ...form, titleEs: e.target.value })} className="w-full px-4 py-2 rounded-btn border border-secondary-light-gray" placeholder="Intercambio de Junio" />
)}
); }