import React, { useState, useEffect } from 'react'; import { Link, useNavigate } from 'react-router-dom'; import type { Presentation } from '../../types/presentation.ts'; import { getAllPresentations, deletePresentation } from '../../utils/presentationStorage.ts'; import { loggers } from '../../utils/logger.ts'; import './PresentationsList.css'; export const PresentationsList: React.FC = () => { const navigate = useNavigate(); const [presentations, setPresentations] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [deleting, setDeleting] = useState(null); useEffect(() => { loadPresentations(); }, []); const loadPresentations = async () => { try { setLoading(true); setError(null); const allPresentations = await getAllPresentations(); setPresentations(allPresentations); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to load presentations'); } finally { setLoading(false); } }; const handleDeletePresentation = async (id: string, name: string) => { if (!confirm(`Are you sure you want to delete "${name}"? This action cannot be undone.`)) { return; } try { setDeleting(id); await deletePresentation(id); setPresentations(prev => prev.filter(p => p.metadata.id !== id)); } catch (err) { loggers.presentation.error('Failed to delete presentation', err instanceof Error ? err : new Error(String(err))); alert('Failed to delete presentation. Please try again.'); } finally { setDeleting(null); } }; const handleEditPresentation = (id: string, slideCount: number) => { const slideNumber = slideCount > 0 ? 1 : 1; // Always go to slide 1, or empty state navigate(`/presentations/${id}/edit/slides/${slideNumber}`); }; const handleViewPresentation = (id: string, slideCount: number) => { const slideNumber = slideCount > 0 ? 1 : 1; // Always go to slide 1, or empty state navigate(`/presentations/${id}/view/slides/${slideNumber}`); }; const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }); }; if (loading) { return (
Loading presentations...
); } if (error) { return (

Error Loading Presentations

{error}

); } return (

My Presentations

Manage and organize your presentation library

Create New Presentation
{presentations.length === 0 ? (

No presentations yet

Create your first presentation to get started

Create Your First Presentation
) : (
{presentations.map((presentation) => (

{presentation.metadata.name}

{presentation.metadata.description && (

{presentation.metadata.description}

)}
Theme {presentation.metadata.theme}
Slides {presentation.slides.length} slide{presentation.slides.length !== 1 ? 's' : ''}
Created {formatDate(presentation.metadata.createdAt)}
{presentation.metadata.updatedAt !== presentation.metadata.createdAt && (
Updated {formatDate(presentation.metadata.updatedAt)}
)}
{presentation.slides.length > 0 && ( )}
))}
)} {presentations.length > 0 && (

{presentations.length} presentation{presentations.length !== 1 ? 's' : ''} • {' '} {presentations.reduce((total, p) => total + p.slides.length, 0)} total slides

Create New
)}
); };