import React, { useState, useEffect } from 'react'; import { useParams } from 'react-router-dom'; import axios from 'axios'; import { useNavigate } from 'react-router-dom'; import { useLocation } from 'react-router-dom'; import { jwtDecode } from "jwt-decode"; import {request} from "../axios_helper"; import restaurants from "./Restaurants"; const ReservationConfirmation = () => { const navigate = useNavigate(); const location = useLocation(); const preOrderedItems = location.state?.preOrderedItems || []; const [restaurant, setRestaurant] = useState({}); const [user, setUser] = useState({}); const [table, setTable] = useState({}); const [reservationDateTime, setReservationDateTime] = useState(''); const [partySize, setPartySize] = useState(''); const [specialRequests, setSpecialRequests] = useState(''); const { tableNumber, timeSlot, restaurantId } = useParams(); const adjustedTimeSlot = new Date(new Date(timeSlot).getTime() + 60 * 60 * 1000).toISOString(); useEffect(() => { const fetchDetails = async () => { try { const tableResponse = await axios.get(`http://localhost:8081/api/tables/${tableNumber}`); setTable(tableResponse.data); const restaurantResponse = await axios.get(`http://localhost:8081/api/restaurants/${restaurantId}`); setRestaurant(restaurantResponse.data); const token = localStorage.getItem("token"); if (!token) { console.error("No token found"); return; } const decodedToken = jwtDecode(token); const userId = decodedToken.iss; const userResponse = await axios.get(`http://localhost:8081/api/user/${userId}`); setUser(userResponse.data); } catch (error) { console.error('Error fetching table or restaurant details:', error); } }; fetchDetails(); }, [tableNumber, restaurantId]); const handleSubmit = async (e) => { e.preventDefault(); const payload = { reservationID: 0, userEmail: user.email, rating: parseFloat(restaurant.rating) || null, tableNumber: parseInt(table.id, 10), restaurant: restaurant, reservationDateTime: adjustedTimeSlot, partySize: parseInt(partySize, 10), status: 'Reserved', specialRequests: specialRequests.trim(), paymentStatus: 'Pending', preOrderedItems: preOrderedItems.map(item => `${item.itemName}:${item.quantity}:${item.price}`) }; try { const response = await axios.post('http://localhost:8081/api/reservations', payload); console.log('Reservation created successfully:', response.data); navigate("/reservations") } catch (error) { if (error.response) { alert('The selected time slot is no longer available. Please choose another time.'); } else { alert('Network error. Please check your internet connection.'); } } }; const calculateCheckOutTime = (checkInTime) => { const checkIn = new Date(checkInTime); checkIn.setHours(checkIn.getHours() + 2); return checkIn.toISOString(); }; const initialRemainingTime = localStorage.getItem('remainingTime') || 300; const [remainingTime, setRemainingTime] = useState(parseInt(initialRemainingTime, 10)); useEffect(() => { const timer = setInterval(() => { setRemainingTime((prevTime) => { const newTime = prevTime - 1; localStorage.setItem('remainingTime', newTime.toString()); return newTime; }); }, 1000); return () => clearInterval(timer); }, []); useEffect(() => { if (remainingTime <= 0) { localStorage.removeItem('remainingTime'); alert("Time has expired. Please try reserving again."); navigate('/restaurants'); // Redirect or take necessary action } }, [remainingTime, navigate]); const formatTime = (timeInSeconds) => { const minutes = Math.floor(timeInSeconds / 60); const seconds = timeInSeconds % 60; return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`; }; const formatTimeSlot = (timeSlot) => { const utcDate = new Date(timeSlot); const localDate = new Date(utcDate.toLocaleString("en-US", { timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone })); const formattedDate = localDate.toLocaleDateString(); const formattedTime = localDate.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); return `${formattedDate} - ${formattedTime}`; }; const grandTotal = preOrderedItems.reduce((acc, item) => acc + item.price * item.quantity, 0).toFixed(2); const itemQuantityString = preOrderedItems .map(item => `${item.itemName}:${item.quantity}`) .join(','); return (

Reservation Confirmation

Remaining Time: {formatTime(remainingTime)}

Reservation Details

Restaurant: {restaurant.name || 'Loading...'}
Cuisine type: {restaurant.cuisineType || 'Loading...'}
Selected Time Slot: {formatTimeSlot(timeSlot)}
Party size:{' '} setPartySize(e.target.value)} /> Table size: {table.capacity}
Special Requests:{' '} setSpecialRequests(e.target.value)} />

Check-in Time: Grace period of 15 minutes +/- the slot. For more information, call the restaurant.

{preOrderedItems.length > 0 ? (
{preOrderedItems.map((item) => (

Item: {item.itemName}

Price: ${item.price.toFixed(2)}

Quantity: {item.quantity}

Total: ${(item.price * item.quantity).toFixed(2)}

))}

Grand Total: ${grandTotal}

) : (

No pre-ordered items.

)}
); }; export default ReservationConfirmation;