import React, { useEffect, useState } from "react"; import { jwtDecode } from "jwt-decode"; import axios from "axios"; import 'bootstrap/dist/css/bootstrap.min.css'; import 'bootstrap/dist/js/bootstrap.bundle.min'; const ReservationHistory = () => { const [reservations, setReservations] = useState([]); const [filteredReservations, setFilteredReservations] = useState([]); const [selectedReservation, setSelectedReservation] = useState(null); 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
# | Restaurant | Table | Check In Date | Reserved on | Party Size | Special Requests | Status | Cancellation Reason |
---|---|---|---|---|---|---|---|---|
{index + 1} | {res.restaurant?.name || "N/A"} | {res.table?.id || "N/A"} | {formatDateTime(res.checkInDate)} | {new Date(res.reservationDateTime).toLocaleString()} | {res.partySize} | {res.specialRequests || "None"} | {res.status} | {res.cancellationReason || "None"} |
No reservations found. |
Name: {selectedReservation.restaurant?.name}
Address: {selectedReservation.restaurant?.address}
Phone: {selectedReservation.restaurant?.phone}
Rating: {selectedReservation.restaurant?.rating} ⭐
Cuisine: {selectedReservation.restaurant?.cuisineType}
Hours: {selectedReservation.restaurant?.operatingHours}
{selectedReservation.restaurant?.website && (Website: {selectedReservation.restaurant.website}
)}Location: {selectedReservation.table?.location}
Capacity: {selectedReservation.table?.capacity}
Smoking Area: {selectedReservation.table?.smokingArea ? "Yes" : "No"}
Description: {selectedReservation.table?.description}
Reservation Duration: {selectedReservation.table?.reservationDurationHours} hours
Check-In Date: {formatDateTime(selectedReservation.checkInDate)}
Reserved on: {new Date(selectedReservation.reservationDateTime).toLocaleString()}
Party Size: {selectedReservation.partySize}
Special Requests: {selectedReservation.specialRequests || "None"}
Status: {selectedReservation.status}
Cancellation Reason: {selectedReservation.cancellationReason || "None"}