import { useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { api } from '../api'; import { useAuth } from '../context/AuthContext'; import { StarRating } from '../components/StarRating'; import { Ride, CompanionCircle, CompanionActivity } from '../types/ride'; import { Calendar, Car, CheckCircle2, ChevronDown, ChevronUp, Clock, Filter, MapPin, Navigation, Users, XCircle } from 'lucide-react'; type TabType = 'all' | 'rides' | 'activities'; export default function HistoryPage() { const { user } = useAuth(); const [activeTab, setActiveTab] = useState('all'); const [statusFilter, setStatusFilter] = useState('all'); const [expandedId, setExpandedId] = useState(null); // Fetch rides const { data: ridesResponse, isLoading: isRidesLoading } = useQuery({ queryKey: ['my-rides-history'], queryFn: async () => { const res = await api.get('/api/rides/my'); return res.data; }, }); // Fetch companion circles to retrieve activities const { data: circlesResponse, isLoading: isCirclesLoading } = useQuery({ queryKey: ['my-circles-history'], queryFn: async () => { const res = await api.get('/api/companion/circles/my'); return res.data; }, }); const rawRides: Ride[] = Array.isArray(ridesResponse?.rides) ? ridesResponse.rides : []; const circles: CompanionCircle[] = Array.isArray(circlesResponse?.circles) ? circlesResponse.circles : []; // Process activities from circles const activities: (CompanionActivity & { circle_name?: string })[] = []; circles.forEach((circle) => { if (Array.isArray((circle as any).activities)) { (circle as any).activities.forEach((act: CompanionActivity) => { activities.push({ ...act, circle_name: circle.name, }); }); } }); // Filter rides const filteredRides = rawRides.filter((ride) => { if (statusFilter !== 'all' && ride.status !== statusFilter) return false; return true; }); // Filter activities const filteredActivities = activities.filter((act) => { if (statusFilter !== 'all' && act.status !== statusFilter) return false; return true; }); const isLoading = isRidesLoading || isCirclesLoading; const toggleExpand = (id: string) => { setExpandedId((prev) => (prev === id ? null : id)); }; const getStatusBadge = (status: string) => { switch (status) { case 'completed': return ( Completed ); case 'picked_up': return ( In Transit ); case 'accepted': return ( Accepted ); case 'requested': return ( Requested ); case 'cancelled': return ( Cancelled ); default: return ( {status} ); } }; const formatDate = (dateStr?: string) => { if (!dateStr) return 'N/A'; try { return new Date(dateStr).toLocaleString(undefined, { month: 'short', day: 'numeric', year: 'numeric', hour: '2-digit', minute: '2-digit', }); } catch { return dateStr; } }; return (

Activity and Trip History

Review past ride bookings, status progressions, driver assignments, and companion circle activities.

{isLoading ? (
{[1, 2, 3].map((i) => (
))}
) : (
{/* Rides List */} {(activeTab === 'all' || activeTab === 'rides') && (
{activeTab === 'all' && filteredRides.length > 0 && (

Rides ({filteredRides.length})

)} {filteredRides.length === 0 && activeTab === 'rides' && (

No ride history found

When you request or complete trips, they will be listed here.

)} {filteredRides.map((ride) => { const isExpanded = expandedId === ride.id; return (
toggleExpand(ride.id)} className="p-4 flex items-start justify-between gap-4 cursor-pointer hover:bg-slate-50/50 transition-colors" >
{formatDate(ride.created_at)} {getStatusBadge(ride.status)}
{ride.pickup_location} to {ride.destination_location}
{ride.rating && ride.rating > 0 && (
({ride.rating}/5)
)}
{isExpanded && (

Passenger Detail

{ride.passenger_name || ride.passenger_email || 'Passenger'}

{ride.passenger_phone && (

Phone: {ride.passenger_phone}

)}

Driver Detail

{ride.driver_email ? ( <>

{ride.driver_name || ride.driver_email}

{ride.driver_phone && (

Phone: {ride.driver_phone}

)} ) : (

Driver not assigned yet

)}
Ride ID: {ride.id} Updated: {formatDate(ride.updated_at)}
)}
); })}
)} {/* Circle Activities List */} {(activeTab === 'all' || activeTab === 'activities') && (
{activeTab === 'all' && filteredActivities.length > 0 && (

Circle Events ({filteredActivities.length})

)} {filteredActivities.length === 0 && activeTab === 'activities' && (

No circle events recorded

Join or create a companion circle to plan group transit activities.

)} {filteredActivities.map((act) => (

{act.title}

{act.circle_name && (

{act.circle_name}

)}
{getStatusBadge(act.status)}
{act.description && (

{act.description}

)}
{act.location_label} {formatDate(act.starts_at)} {act.max_attendees && ( Max {act.max_attendees} )}
))}
)} {activeTab === 'all' && filteredRides.length === 0 && filteredActivities.length === 0 && (

No activity found

There are no rides or companion circle activities matching your filter criteria.

)}
)}
); }