import React, { useEffect, useState } from "react"; import {jwtDecode} from "jwt-decode"; import axios from "axios"; const ReservationHistory = () => { const [reservations, setReservations] = useState([]); const [filteredReservations, setFilteredReservations] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [restaurantFilter, setRestaurantFilter] = useState(""); const [tableFilter, setTableFilter] = useState(""); const [partySizeFilter, setPartySizeFilter] = useState(""); const [statusFilter, setStatusFilter] = useState(""); const [cancellationReasonFilter, setCancellationReasonFilter] = useState(""); const [startDate, setStartDate] = useState(""); const [endDate, setEndDate] = useState(""); useEffect(() => { const fetchReservations = async () => { try { const token = localStorage.getItem("token"); if (!token) { setError("User not authenticated."); setLoading(false); return; } const decodedToken = jwtDecode(token); const userId = decodedToken.iss; const response = await axios.get( `http://localhost:8081/api/past-reservations/${userId}`, { headers: { Authorization: `Bearer ${token}` }, } ); setReservations(response.data); setFilteredReservations(response.data); } catch (err) { setError("Failed to fetch reservations."); } finally { setLoading(false); } }; fetchReservations(); }, []); useEffect(() => { let tempReservations = reservations; if (restaurantFilter) { tempReservations = tempReservations.filter(res => res.restaurant?.name.toLowerCase().includes(restaurantFilter.toLowerCase()) ); } if (tableFilter) { tempReservations = tempReservations.filter(res => res.table?.id?.toString() === tableFilter ); } if (partySizeFilter) { tempReservations = tempReservations.filter(res => res.partySize?.toString() === partySizeFilter ); } if (statusFilter) { tempReservations = tempReservations.filter(res => res.status.toLowerCase().includes(statusFilter.toLowerCase()) ); } if (cancellationReasonFilter) { tempReservations = tempReservations.filter(res => (res.cancellationReason || "None").toLowerCase().includes(cancellationReasonFilter.toLowerCase()) ); } if (startDate && endDate) { const start = new Date(startDate); const end = new Date(endDate); tempReservations = tempReservations.filter(res => { const reservationDate = new Date(res.reservationDateTime); return reservationDate >= start && reservationDate <= end; }); } setFilteredReservations(tempReservations); }, [ restaurantFilter, tableFilter, partySizeFilter, statusFilter, cancellationReasonFilter, startDate, endDate, reservations ]); const resetFilters = () => { setRestaurantFilter(""); setTableFilter(""); setPartySizeFilter(""); setStatusFilter(""); setCancellationReasonFilter(""); setStartDate(""); setEndDate(""); }; if (loading) return
Loading...
; if (error) return
{error}
; return (

Past Reservations

setRestaurantFilter(e.target.value)} />
setTableFilter(e.target.value)} />
setStartDate(e.target.value)} /> setEndDate(e.target.value)} />
setPartySizeFilter(e.target.value)} />
setCancellationReasonFilter(e.target.value)} />
{filteredReservations.length > 0 ? ( filteredReservations.map((res, index) => ( )) ) : ( )}
# Restaurant Table Date & Time Party Size Special Requests Status Cancellation Reason
{index + 1} {res.restaurant?.name || "N/A"} {res.table?.id || "N/A"} {new Date(res.reservationDateTime).toLocaleString()} {res.partySize} {res.specialRequests || "None"} {res.status} {res.cancellationReason || "None"}
No reservations found.
); }; export default ReservationHistory;