import React, { useState, useEffect } from 'react'; import { Link } from 'react-router-dom'; import { Reservation } from '../types'; import { SimpleLibreBookingClient } from '../services/librebooking-api'; import { format, isToday, isTomorrow } from 'date-fns'; const UserDashboard: React.FC = () => { const [reservations, setReservations] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [filter, setFilter] = useState<'all' | 'upcoming' | 'past'>('upcoming'); useEffect(() => { const api = new SimpleLibreBookingClient(); const loadReservations = async () => { try { const reservationsData = await api.getReservations(); setReservations(reservationsData); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to load reservations'); } finally { setLoading(false); } }; loadReservations(); }, []); // Filter reservations based on selected filter const filteredReservations = filter === 'all' ? reservations : filter === 'upcoming' ? reservations.filter(r => { if (r.status === 'cancelled') return false; // Use endDate field from API response const endTime = new Date(r.endDate); const now = new Date(); return endTime > now; }) : reservations.filter(r => { if (r.status === 'cancelled') return false; // Use endDate field from API response const endTime = new Date(r.endDate); const now = new Date(); return endTime <= now; }); // Debug: Check what status field exists // Debug: Check the first reservation structure if (reservations.length > 0) { const firstReservation = reservations[0]; console.log('=== RESERVATION DEBUG ==='); console.log('Sample reservation:', firstReservation); console.log('Available fields:', Object.keys(firstReservation)); console.log('Resource ID field:', firstReservation.resourceId); console.log('Resource ID type:', typeof firstReservation.resourceId); console.log('========================'); } // Stats should always use all reservations (not filtered) const upcomingReservations = reservations.filter(r => { const endTime = new Date(r.endDate); return endTime > new Date(); }); // Filtered versions for display const filteredTodayReservations = filteredReservations.filter(r => { const startTime = new Date(r.startDate); const endTime = new Date(r.endDate); return isToday(startTime) || isToday(endTime); }); const getReservationLabel = (reservation: Reservation): string => { // Use startDate and endDate from API response const startDate = new Date(reservation.startDate); const endDate = new Date(reservation.endDate); // Validate dates before formatting if (isNaN(startDate.getTime()) || isNaN(endDate.getTime())) { return 'Invalid date'; } if (isToday(startDate)) { return `Today, ${format(startDate, 'h:mm a')} - ${format(endDate, 'h:mm a')}`; } else if (isTomorrow(startDate)) { return `Tomorrow, ${format(startDate, 'h:mm a')} - ${format(endDate, 'h:mm a')}`; } else { return format(startDate, 'MMM d, h:mm a') + ' - ' + format(endDate, 'h:mm a'); } }; const getStatusColor = (status: string): string => { switch (status) { case 'confirmed': return '#27ae60'; case 'pending': return '#f39c12'; case 'cancelled': return '#e74c3c'; default: return '#95a5a6'; } }; if (loading) { return (

My Reservations

Loading your reservations...
); } if (error) { return (

My Reservations

Error: {error}
); } return (

My Reservations

New Booking
{/* Quick Stats */}
{upcomingReservations.length}
Upcoming Bookings
{reservations.filter(r => r.requiresApproval).length}
Pending Confirmation
{/* Filter Buttons */}
{(['all', 'upcoming', 'past'] as const).map(filterOption => ( ))}
Showing {filteredReservations.length} {filter === 'all' ? 'reservations' : filter}
{/* Today's Reservations */} {filteredTodayReservations.length > 0 && (

Today's Reservations

{filteredTodayReservations.map(reservation => (

{reservation.title}

{reservation.resourceName}
{reservation.status}
{getReservationLabel(reservation)}
{reservation.description && (
{reservation.description}
)}
View Calendar
))}
)} {/* All Reservations */}

All Reservations

{filteredReservations.length === 0 ? (

You don't have any reservations yet.

Browse Resources
) : (
{filteredReservations .sort((a, b) => new Date(b.startDate).getTime() - new Date(a.startDate).getTime()) .map(reservation => (

{reservation.title}

{reservation.resourceName}
{reservation.status}
{getReservationLabel(reservation)}
{reservation.description && (
{reservation.description}
)}
Booked on {reservation.startDate ? format(new Date(reservation.startDate), 'MMM d, yyyy') : 'Unknown date'}
View All Calendars
))}
)}
); }; export default UserDashboard;