import { useState, useEffect } from 'react'; import { Calendar, DollarSign, Star, Clock } from 'lucide-react'; import { StatCard } from '../components/ui/StatCard'; import { UpcomingStays } from '../components/rentals/UpcomingStays'; import { api } from '../api/client'; import { formatCurrency } from '../utils/format'; import type { Booking } from '../types/rental'; export function TenantDashboardPage() { const [bookings, setBookings] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { async function fetchData() { try { const res = await api.get('/bookings?role=tenant'); setBookings(res); } catch { // silently fail } finally { setLoading(false); } } fetchData(); }, []); if (loading) { return
Loading dashboard...
; } const totalBookings = bookings.length; const upcomingCount = bookings.filter(b => b.status === 'CONFIRMED' || b.status === 'ACTIVE').length; const totalSpent = bookings .filter(b => ['COMPLETED', 'CONFIRMED', 'ACTIVE'].includes(b.status)) .reduce((sum, b) => sum + b.totalAmount, 0); const completedWithReview = bookings.filter(b => b.status === 'COMPLETED' && b.review); const avgRating = completedWithReview.length > 0 ? completedWithReview.reduce((sum, b) => sum + (b.review?.rating || 0), 0) / completedWithReview.length : 0; return (

Dashboard

{/* Recent Completed */} {bookings.filter(b => b.status === 'COMPLETED').length > 0 && (

Recent Completed Stays

{bookings .filter(b => b.status === 'COMPLETED') .slice(0, 5) .map((booking) => (
{booking.rentalListing.images[0] ? ( ) : (
)}

{booking.rentalListing.title}

{new Date(booking.startDate).toLocaleDateString()} - {new Date(booking.endDate).toLocaleDateString()}

{formatCurrency(booking.totalAmount)} {booking.review && ( {booking.review.rating} ★ )}
))}
)}
); }