The booking list at /bookings shows your full charging history — pending, active, completed, and cancelled reservations. Until today, if you wanted to book the same charger again after a completed session, you had to navigate back to the map, find that same station, and go through the full booking flow from scratch. The same applied to cancelled bookings: the vehicle details, the provider, the rate — all lost the moment you cancelled.
That friction is gone. Every completed and cancelled booking card now includes a "Book Again" button — a compact cyan button with a refresh icon that takes you straight back to the booking wizard with the same vehicle and rate pre-filled.
For completed bookings, the button sits alongside the existing "Session complete" label in a flex row. For cancelled bookings, it replaces the empty action area (the cancel reason banner, if present, remains visible). One click, and you're two steps away from another session with the same provider.
Under the hood, the button is an anchor tag pointing to `/app?vehicle_id=X&rate=Y`. The map page detects these URL parameters on load and automatically opens the BookingWizard modal with the vehicle and rate from the previous booking. No extra state management, no session storage — just a clean URL-based handoff between pages.
The backend now also returns richer booking data: `vehicle_id`, `rate`, `start_time`, `end_time`, and `provider_name` are all included in the `GET /api/bookings/mine` response. The query JOINs the bookings, vehicles, and users tables to provide this context, using `COALESCE(u.name, 'Provider')` so the provider name always has a fallback.
This is a small UX improvement with outsized impact for repeat customers. Whether you're a daily commuter charging at your usual spot or rebooking after a cancellation, the fastest path to your next session is now a single click away.