import { useEffect, useState } from "react"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { MobileFAB } from "@/components/mobile/MobileFAB"; import { MobileCard } from "@/components/mobile/MobileCard"; import { Plus, RefreshCw, ExternalLink, Edit } from "lucide-react"; import CalendarService, { CalendarEvent } from "@/services/CalendarService"; import { showError, showSuccess } from "@/utils/toast"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; const EVENTS_PER_PAGE = 10; export default function CalendarPage() { const [events, setEvents] = useState([]); const [page, setPage] = useState(0); const [addEventModal, setAddEventModal] = useState(false); const [editEventModal, setEditEventModal] = useState<{ open: boolean; event?: CalendarEvent }>({ open: false }); const [loading, setLoading] = useState(false); const loadEvents = async () => { try { const data = await CalendarService.getEvents(100); const sorted = data.sort((a, b) => new Date(a.start_time).getTime() - new Date(b.start_time).getTime()); setEvents(sorted); } catch (error) { showError("Erreur lors du chargement des événements"); } }; useEffect(() => { loadEvents(); }, []); const handleSync = async () => { setLoading(true); try { const result = await CalendarService.sync(); showSuccess(`${result.syncedCount} événements synchronisés`); await loadEvents(); } catch (error) { showError("Erreur lors de la synchronisation"); } finally { setLoading(false); } }; const totalPages = Math.ceil(events.length / EVENTS_PER_PAGE); const paginatedEvents = events.slice(page * EVENTS_PER_PAGE, (page + 1) * EVENTS_PER_PAGE); return (
{/* Header Actions */}
{/* Events List */}
{events.length > 0 ? ( paginatedEvents.map(event => { const startDate = new Date(event.start_time); const endDate = new Date(event.end_time); const isToday = startDate.toDateString() === new Date().toDateString(); const isSoon = startDate.getTime() - new Date().getTime() < 30 * 60 * 1000 && startDate > new Date(); const isAllDay = event.all_day || (startDate.getHours() === 0 && startDate.getMinutes() === 0) || (startDate.getHours() === 1 && startDate.getMinutes() === 0 && endDate.getHours() === 1); return (
event.html_link && window.open(event.html_link, '_blank')} >

{event.title}

{isToday ? "Aujourd'hui" : startDate.toLocaleDateString('fr-FR', { day: '2-digit', month: '2-digit', timeZone: 'Europe/Paris' })} {isAllDay ? ' - Toute la journée' : ` à ${startDate.toLocaleTimeString('fr-FR', { hour: '2-digit', minute: '2-digit', timeZone: 'Europe/Paris' })}`}

{event.location && (

📍 {event.location}

)} {isSoon && ( Dans moins de 30 min )}
); }) ) : (

Aucun rendez-vous à venir

)}
{/* Pagination */} {totalPages > 1 && (
{page + 1} / {totalPages}
)} {/* FAB */} setAddEventModal(true)} label="Ajouter un événement" /> {/* Add Event Modal - Placeholder for now */} Nouvel événement Cette fonctionnalité sera disponible prochainement {/* Edit Event Modal - Placeholder for now */} setEditEventModal({ open })}> Modifier l'événement Cette fonctionnalité sera disponible prochainement
); }