update reservations
This commit is contained in:
parent
56204f3324
commit
d0669f41a2
@ -8,6 +8,7 @@ const UserDashboard: React.FC = () => {
|
|||||||
const [reservations, setReservations] = useState<Reservation[]>([]);
|
const [reservations, setReservations] = useState<Reservation[]>([]);
|
||||||
const [loading, setLoading] = useState(true);
|
const [loading, setLoading] = useState(true);
|
||||||
const [error, setError] = useState<string | null>(null);
|
const [error, setError] = useState<string | null>(null);
|
||||||
|
const [filter, setFilter] = useState<'all' | 'upcoming' | 'past'>('upcoming');
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const api = new SimpleLibreBookingClient();
|
const api = new SimpleLibreBookingClient();
|
||||||
@ -26,28 +27,48 @@ const UserDashboard: React.FC = () => {
|
|||||||
loadReservations();
|
loadReservations();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
// Group reservations by status
|
// 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;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Stats should always use all reservations (not filtered)
|
||||||
const pendingReservations = reservations.filter(r => r.status === 'pending');
|
const pendingReservations = reservations.filter(r => r.status === 'pending');
|
||||||
const confirmedReservations = reservations.filter(r => r.status === 'confirmed');
|
const confirmedReservations = reservations.filter(r => r.status === 'confirmed');
|
||||||
|
|
||||||
// Group upcoming reservations
|
|
||||||
const upcomingReservations = reservations.filter(r => {
|
const upcomingReservations = reservations.filter(r => {
|
||||||
if (r.status === 'cancelled') return false;
|
if (r.status === 'cancelled') return false;
|
||||||
const endTime = r.endTime instanceof Date ? r.endTime : new Date(r.endTime);
|
const endTime = new Date(r.endDate);
|
||||||
return endTime > new Date();
|
return endTime > new Date();
|
||||||
});
|
});
|
||||||
|
|
||||||
const todayReservations = reservations.filter(r => {
|
// Filtered versions for display
|
||||||
|
const filteredPendingReservations = filteredReservations.filter(r => r.status === 'pending');
|
||||||
|
const filteredConfirmedReservations = filteredReservations.filter(r => r.status === 'confirmed');
|
||||||
|
const filteredTodayReservations = filteredReservations.filter(r => {
|
||||||
if (r.status === 'cancelled') return false;
|
if (r.status === 'cancelled') return false;
|
||||||
const startTime = r.startTime instanceof Date ? r.startTime : new Date(r.startTime);
|
const startTime = new Date(r.startDate);
|
||||||
const endTime = r.endTime instanceof Date ? r.endTime : new Date(r.endTime);
|
const endTime = new Date(r.endDate);
|
||||||
return isToday(startTime) || isToday(endTime);
|
return isToday(startTime) || isToday(endTime);
|
||||||
});
|
});
|
||||||
|
|
||||||
const getReservationLabel = (reservation: Reservation): string => {
|
const getReservationLabel = (reservation: Reservation): string => {
|
||||||
// Handle both string and Date formats for startTime/endTime
|
// Use startDate and endDate from API response
|
||||||
const startDate = reservation.startTime instanceof Date ? reservation.startTime : new Date(reservation.startTime);
|
const startDate = new Date(reservation.startDate);
|
||||||
const endDate = reservation.endTime instanceof Date ? reservation.endTime : new Date(reservation.endTime);
|
const endDate = new Date(reservation.endDate);
|
||||||
|
|
||||||
// Validate dates before formatting
|
// Validate dates before formatting
|
||||||
if (isNaN(startDate.getTime()) || isNaN(endDate.getTime())) {
|
if (isNaN(startDate.getTime()) || isNaN(endDate.getTime())) {
|
||||||
@ -138,14 +159,41 @@ const UserDashboard: React.FC = () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Filter Buttons */}
|
||||||
|
<div style={{ marginBottom: '2rem' }}>
|
||||||
|
<div style={{ display: 'flex', gap: '0.5rem', marginBottom: '1rem' }}>
|
||||||
|
{(['all', 'upcoming', 'past'] as const).map(filterOption => (
|
||||||
|
<button
|
||||||
|
key={filterOption}
|
||||||
|
onClick={() => setFilter(filterOption)}
|
||||||
|
style={{
|
||||||
|
padding: '0.5rem 1rem',
|
||||||
|
backgroundColor: filter === filterOption ? '#3498db' : '#ecf0f1',
|
||||||
|
color: filter === filterOption ? 'white' : '#2c3e50',
|
||||||
|
border: 'none',
|
||||||
|
borderRadius: '4px',
|
||||||
|
cursor: 'pointer',
|
||||||
|
fontWeight: filter === filterOption ? '500' : 'normal',
|
||||||
|
textTransform: 'capitalize'
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{filterOption}
|
||||||
|
</button>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
<div style={{ fontSize: '0.875rem', color: '#666' }}>
|
||||||
|
Showing {filteredReservations.length} {filter === 'all' ? 'reservations' : filter}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{/* Today's Reservations */}
|
{/* Today's Reservations */}
|
||||||
{todayReservations.length > 0 && (
|
{filteredTodayReservations.length > 0 && (
|
||||||
<div style={{ marginBottom: '2rem' }}>
|
<div style={{ marginBottom: '2rem' }}>
|
||||||
<h3 style={{ color: '#2c3e50', marginBottom: '1rem' }}>Today's Reservations</h3>
|
<h3 style={{ color: '#2c3e50', marginBottom: '1rem' }}>Today's Reservations</h3>
|
||||||
<div style={{ display: 'grid', gap: '1rem' }}>
|
<div style={{ display: 'grid', gap: '1rem' }}>
|
||||||
{todayReservations.map(reservation => (
|
{filteredTodayReservations.map(reservation => (
|
||||||
<div
|
<div
|
||||||
key={reservation.id}
|
key={reservation.referenceNumber}
|
||||||
style={{
|
style={{
|
||||||
backgroundColor: 'white',
|
backgroundColor: 'white',
|
||||||
padding: '1.5rem',
|
padding: '1.5rem',
|
||||||
@ -212,7 +260,7 @@ const UserDashboard: React.FC = () => {
|
|||||||
<div>
|
<div>
|
||||||
<h3 style={{ color: '#2c3e50', marginBottom: '1rem' }}>All Reservations</h3>
|
<h3 style={{ color: '#2c3e50', marginBottom: '1rem' }}>All Reservations</h3>
|
||||||
|
|
||||||
{reservations.length === 0 ? (
|
{filteredReservations.length === 0 ? (
|
||||||
<div style={{
|
<div style={{
|
||||||
textAlign: 'center',
|
textAlign: 'center',
|
||||||
padding: '2rem',
|
padding: '2rem',
|
||||||
@ -239,8 +287,8 @@ const UserDashboard: React.FC = () => {
|
|||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div style={{ display: 'grid', gap: '1rem' }}>
|
<div style={{ display: 'grid', gap: '1rem' }}>
|
||||||
{reservations
|
{filteredReservations
|
||||||
.sort((a, b) => new Date(b.startTime).getTime() - new Date(a.startTime).getTime())
|
.sort((a, b) => new Date(b.startDate).getTime() - new Date(a.startDate).getTime())
|
||||||
.map(reservation => (
|
.map(reservation => (
|
||||||
<div
|
<div
|
||||||
key={reservation.referenceNumber}
|
key={reservation.referenceNumber}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user