import React, { useState, useEffect } from 'react'; import { useParams, useNavigate, Link } from 'react-router-dom'; import { useAuth } from '../contexts/AuthContext'; import { itemRequestAPI } from '../services/api'; import { ItemRequest, ItemRequestResponse } from '../types'; import RequestResponseModal from '../components/RequestResponseModal'; import AuthButton from '../components/AuthButton'; const ItemRequestDetail: React.FC = () => { const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); const { user } = useAuth(); const [request, setRequest] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [showResponseModal, setShowResponseModal] = useState(false); useEffect(() => { if (id) { fetchRequest(); } }, [id]); const fetchRequest = async () => { try { setLoading(true); const response = await itemRequestAPI.getItemRequest(id!); setRequest(response.data); } catch (err: any) { setError(err.response?.data?.error || 'Failed to fetch request details'); } finally { setLoading(false); } }; const handleResponseSubmitted = () => { fetchRequest(); }; const getStatusColor = (status: string) => { switch (status) { case 'open': return 'success'; case 'fulfilled': return 'primary'; case 'closed': return 'secondary'; default: return 'secondary'; } }; const getResponseStatusColor = (status: string) => { switch (status) { case 'pending': return 'warning'; case 'accepted': return 'success'; case 'declined': return 'danger'; case 'expired': return 'secondary'; default: return 'secondary'; } }; const formatDate = (dateString?: string) => { if (!dateString) return 'Not specified'; const date = new Date(dateString); return date.toLocaleDateString(); }; const getLocationString = () => { if (!request) return ''; const parts = []; if (request.city) parts.push(request.city); if (request.state) parts.push(request.state); return parts.join(', ') || 'Location not specified'; }; if (loading) { return (
Loading...
); } if (error || !request) { return (
{error || 'Request not found'}
); } const isOwner = user?.id === request.requesterId; const canRespond = user && !isOwner && request.status === 'open'; return (

{request.title}

Requested by {request.requester?.firstName || 'Unknown'} {request.requester?.lastName || ''}

{request.status.charAt(0).toUpperCase() + request.status.slice(1)}
Description

{request.description}

Location

{getLocationString()}

Timeline

{request.isFlexibleDates ? ( 'Flexible dates' ) : ( `${formatDate(request.preferredStartDate)} - ${formatDate(request.preferredEndDate)}` )}

{(request.maxPricePerDay || request.maxPricePerHour) && (
Budget
{request.maxPricePerDay &&
Up to ${request.maxPricePerDay} per day
} {request.maxPricePerHour &&
Up to ${request.maxPricePerHour} per hour
}
)}
Created on {new Date(request.createdAt).toLocaleDateString()} • {request.responseCount || 0} response{request.responseCount !== 1 ? 's' : ''}
{canRespond && (
)} {isOwner && (
Back to My Requests
)}
{request.responses && request.responses.length > 0 && (
Responses ({request.responses.length})
{request.responses.map((response: ItemRequestResponse) => (
{response.responder?.firstName || 'Unknown'} {response.responder?.lastName || ''}
{new Date(response.createdAt).toLocaleDateString()} at {new Date(response.createdAt).toLocaleTimeString()}
{response.status.charAt(0).toUpperCase() + response.status.slice(1)}

{response.message}

{(response.offerPricePerDay || response.offerPricePerHour) && (
Offered Price:
{response.offerPricePerDay &&
${response.offerPricePerDay} per day
} {response.offerPricePerHour &&
${response.offerPricePerHour} per hour
}
)} {(response.availableStartDate || response.availableEndDate) && (
Availability:
{formatDate(response.availableStartDate)} - {formatDate(response.availableEndDate)}
)} {response.contactInfo && (
Contact: {response.contactInfo}
)} {response.existingItem && (
Related Item: {response.existingItem.name}
)}
))}
)}
Request Summary
Status: {request.status.charAt(0).toUpperCase() + request.status.slice(1)}
Requested by:
{request.requester?.firstName || 'Unknown'} {request.requester?.lastName || ''}
{(request.maxPricePerDay || request.maxPricePerHour) && (
Budget Range:
{request.maxPricePerDay &&
≤ ${request.maxPricePerDay}/day
} {request.maxPricePerHour &&
≤ ${request.maxPricePerHour}/hour
}
)}
Timeline:
{request.isFlexibleDates ? ( 'Flexible dates' ) : (
From: {formatDate(request.preferredStartDate)}
To: {formatDate(request.preferredEndDate)}
)}
Location:
{getLocationString()}
Responses:
{request.responseCount || 0} received

{canRespond ? ( ) : user && !isOwner ? (
This request is {request.status}
) : !user ? (
Log in to Respond
) : null}
setShowResponseModal(false)} request={request} onResponseSubmitted={handleResponseSubmitted} />
); }; export default ItemRequestDetail;