import React, { useState, useEffect } from "react"; import { useParams, useNavigate, useSearchParams } from "react-router-dom"; import { Item } from "../types"; import { useAuth } from "../contexts/AuthContext"; import { itemAPI, rentalAPI } from "../services/api"; import StripePaymentForm from "../components/StripePaymentForm"; const RentItem: React.FC = () => { const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); const { user } = useAuth(); const [searchParams] = useSearchParams(); const [item, setItem] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [formData, setFormData] = useState({ deliveryMethod: "pickup" as "pickup" | "delivery", deliveryAddress: "", }); const [manualSelection, setManualSelection] = useState({ startDate: searchParams.get("startDate") || "", startTime: searchParams.get("startTime") || "09:00", endDate: searchParams.get("endDate") || "", endTime: searchParams.get("endTime") || "17:00", }); const [totalCost, setTotalCost] = useState(0); const formatDate = (dateString: string) => { if (!dateString) return ""; return new Date(dateString).toLocaleDateString(); }; const formatTime = (timeString: string) => { if (!timeString) return ""; const [hour, minute] = timeString.split(":"); const hour12 = parseInt(hour) === 0 ? 12 : parseInt(hour) > 12 ? parseInt(hour) - 12 : parseInt(hour); const period = parseInt(hour) < 12 ? "AM" : "PM"; return `${hour12}:${minute} ${period}`; }; const calculateTotalCost = () => { if (!item || !manualSelection.startDate || !manualSelection.endDate) { setTotalCost(0); return; } const startDateTime = new Date( `${manualSelection.startDate}T${manualSelection.startTime}` ); const endDateTime = new Date( `${manualSelection.endDate}T${manualSelection.endTime}` ); const diffMs = endDateTime.getTime() - startDateTime.getTime(); const diffHours = Math.ceil(diffMs / (1000 * 60 * 60)); const diffDays = Math.ceil(diffMs / (1000 * 60 * 60 * 24)); let cost = 0; if (item.pricePerHour && diffHours <= 24) { cost = diffHours * Number(item.pricePerHour); } else if (item.pricePerDay) { cost = diffDays * Number(item.pricePerDay); } setTotalCost(cost); }; useEffect(() => { fetchItem(); }, [id]); useEffect(() => { calculateTotalCost(); }, [item, manualSelection]); const fetchItem = async () => { try { const response = await itemAPI.getItem(id!); setItem(response.data); // Check if item is available if (!response.data.availability) { setError("This item is not available for rent"); } // Check if user is trying to rent their own item if (response.data.ownerId === user?.id) { setError("You cannot rent your own item"); } } catch (err: any) { setError(err.response?.data?.message || "Failed to fetch item"); } finally { setLoading(false); } }; const handlePaymentSuccess = () => { console.log("Stripe checkout session created successfully"); }; const handleChange = ( e: React.ChangeEvent< HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement > ) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value })); }; if (loading) { return (
Loading...
); } if ( !item || error === "You cannot rent your own item" || error === "This item is not available for rent" ) { return (
{error || "Item not found"}
); } return (

Renting {item.name}

{error && (
{error}
)}
Payment
setError(error)} disabled={ !manualSelection.startDate || !manualSelection.endDate } />
{item.images && item.images[0] && ( {item.name} )}
{item.name}

{item.city && item.state ? `${item.city}, ${item.state}` : item.location}


{/* Pricing */}
{totalCost === 0 ? (
Free to Borrow
) : ( <> {item.pricePerHour && Number(item.pricePerHour) > 0 && (
${Math.floor(Number(item.pricePerHour))}/Hour
)} {item.pricePerDay && Number(item.pricePerDay) > 0 && (
${Math.floor(Number(item.pricePerDay))}/Day
)} )}
{/* Selected Dates */} {manualSelection.startDate && manualSelection.endDate && (
Check-in:{" "} {formatDate(manualSelection.startDate)} at{" "} {formatTime(manualSelection.startTime)}
Check-out:{" "} {formatDate(manualSelection.endDate)} at{" "} {formatTime(manualSelection.endTime)}
)} {/* Total Cost */} {totalCost > 0 && ( <>
Total: ${totalCost}
)}
); }; export default RentItem;