CodeIssuesPull RequestsActionsSecurityInsights
✨ AI
More
Settings

Bookings display issue #3737

ClosedXLccantynz wants to mergecursor/bookings-display-issue-3b80mainopened Feb 15, 2026
3 changed files+11151−81
Modifiedfrontend/src/App.js+224−77View fileUnifiedSplit
11import React from "react";
2import { BrowserRouter, Routes, Route, Navigate, useLocation } from "react-router-dom";
2import "./App.css";
3import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom";
34
5import Header from "./components/Header";
6import Hero from "./components/Hero";
7import Services from "./components/Services";
8import Features from "./components/Features";
9import Fleet from "./components/Fleet";
10import About from "./components/About";
11import HowItWorks from "./components/HowItWorks";
12import Testimonials from "./components/Testimonials";
13import Contact from "./components/Contact";
14import Footer from "./components/Footer";
15import LiveBookingsTicker from "./components/LiveBookingsTicker";
16import ExitIntentPopup from "./components/ExitIntentPopup";
17import AIChatbot from "./components/AIChatbot";
18import { Toaster } from "./components/ui/sonner";
19
20// Public pages
21import BookingPage from "./pages/BookingPage";
422import ServiceAreas from "./pages/ServiceAreas";
5import DairyFlatAirportShuttle from "./pages/DairyFlatAirportShuttle";
6import LateNightAirportShuttle from "./pages/LateNightAirportShuttle";
23import StudentAirportTransfers from "./pages/StudentAirportTransfers";
24import FAQ from "./pages/FAQ";
25import FlightTracker from "./pages/FlightTracker";
26import AirportArrivals from "./pages/AirportArrivals";
27
28// Core suburb/service SEO pages
29import OrewaShuttle from "./pages/OrewaShuttle";
30import SilverdaleShuttle from "./pages/SilverdaleShuttle";
31import WhangaparaoaShuttle from "./pages/WhangaparaoaShuttle";
32import RedBeachShuttle from "./pages/RedBeachShuttle";
33import GulfHarbourShuttle from "./pages/GulfHarbourShuttle";
34import StanmoreBayShuttle from "./pages/StanmoreBayShuttle";
35import ArklesBayShuttle from "./pages/ArklesBayShuttle";
36import ArmyBayShuttle from "./pages/ArmyBayShuttle";
37import HatfieldsBeachShuttle from "./pages/HatfieldsBeachShuttle";
38import ManlyShuttle from "./pages/ManlyShuttle";
39import AlbanyShuttle from "./pages/AlbanyShuttle";
40import TakapunaShuttle from "./pages/TakapunaShuttle";
41import BrownsBayShuttle from "./pages/BrownsBayShuttle";
42import MairangiBayShuttle from "./pages/MairangiBayShuttle";
43import DevonportShuttle from "./pages/DevonportShuttle";
44import OrewaToAirport from "./pages/OrewaToAirport";
45import BestAirportShuttle from "./pages/BestAirportShuttle";
46import EarlyMorningShuttle from "./pages/EarlyMorningShuttle";
47import BusinessAirportTransfer from "./pages/BusinessAirportTransfer";
48import HibiscusShuttlesAlternative from "./pages/HibiscusShuttlesAlternative";
49import LocalAirportShuttle from "./pages/LocalAirportShuttle";
50import AirportShuttleOrewa from "./pages/AirportShuttleOrewa";
51
52// Service pages
53import CorporateTransfers from "./pages/CorporateTransfers";
54import CruiseTransfers from "./pages/CruiseTransfers";
55import AucklandAirportTransfers from "./pages/AucklandAirportTransfers";
56
57// School pages
58import OrewaCollegeShuttle from "./pages/OrewaCollegeShuttle";
59import WhangaparaoaCollegeShuttle from "./pages/WhangaparaoaCollegeShuttle";
60import KingswaySchoolShuttle from "./pages/KingswaySchoolShuttle";
61import LongBayCollegeShuttle from "./pages/LongBayCollegeShuttle";
62import RangitotoCollegeShuttle from "./pages/RangitotoCollegeShuttle";
63
64// Matakana pages
65import MatakanaShuttle from "./pages/MatakanaShuttle";
66import MatakanaConcertShuttle from "./pages/MatakanaConcertShuttle";
67import MatakanaEventsShuttle from "./pages/MatakanaEventsShuttle";
68import MatakanaFarmersMarketShuttle from "./pages/MatakanaFarmersMarketShuttle";
69import MatakanaVillageShuttle from "./pages/MatakanaVillageShuttle";
70import MatakanaWineryShuttle from "./pages/MatakanaWineryShuttle";
71
72// New(er) SEO pages
773import WarkworthAirportShuttle from "./pages/WarkworthAirportShuttle";
74import LateNightAirportShuttle from "./pages/LateNightAirportShuttle";
75import SnellsBeachAirportShuttle from "./pages/SnellsBeachAirportShuttle";
76import OmahaAirportShuttle from "./pages/OmahaAirportShuttle";
77import PuhoiAirportShuttle from "./pages/PuhoiAirportShuttle";
78import MillwaterAirportShuttle from "./pages/MillwaterAirportShuttle";
79import LeighAirportShuttle from "./pages/LeighAirportShuttle";
80import EarlyMorningFlightShuttle from "./pages/EarlyMorningFlightShuttle";
81import ExecutiveAirportTransfers from "./pages/ExecutiveAirportTransfers";
82import FamilyAirportShuttle from "./pages/FamilyAirportShuttle";
83import DairyFlatAirportShuttle from "./pages/DairyFlatAirportShuttle";
84import WellsfordAirportShuttle from "./pages/WellsfordAirportShuttle";
885
9import AdminLogin from "./pages/AdminLogin";
86// Payments + tracking + driver
87import PaymentSuccess from "./pages/PaymentSuccess";
88import PaymentCancel from "./pages/PaymentCancel";
89import CustomerTracking from "./pages/CustomerTracking";
90import DriverPortal from "./pages/DriverPortal";
91import DriverTracking from "./pages/DriverTracking";
92import DriverJobResponse from "./pages/DriverJobResponse";
93
94// Admin
1095import AdminShell from "./admin/AdminShell";
1196import Cockpit from "./admin/Cockpit";
97import AdminLogin from "./pages/AdminLogin";
98import AdminDashboard from "./pages/AdminDashboard";
99import ChangePassword from "./pages/ChangePassword";
100import AdminSEO from "./pages/AdminSEO";
101import AdminCreateBooking from "./pages/AdminCreateBooking";
102import AdminEditBooking from "./pages/AdminEditBooking";
103import AdminResetPassword from "./pages/AdminResetPassword";
12104
13import RealAdminBookings from "./pages/AdminDashboard";
105const Home = () => {
106 return (
107 <div className="min-h-screen bg-white">
108 <Header />
109 <Hero />
110 <Services />
111 <Features />
112 <Fleet />
113 <About />
114 <HowItWorks />
115 <Testimonials />
116 <Contact />
117 <Footer />
118 <LiveBookingsTicker />
119 <ExitIntentPopup />
120 <AIChatbot />
121 </div>
122 );
123};
14124
15125/**
16126 * Simple auth check: if an admin token exists in localStorage the user is
17 * considered logged in. The actual token is validated server-side on every
18 * API call, so this is purely a UX guard.
127 * considered logged in. The token is still validated server-side on every API
128 * call; this is purely a UX guard to prevent navigating into protected pages.
19129 */
20130function RequireAuth({ children }) {
21131 const token = localStorage.getItem("admin_token") || localStorage.getItem("HIBI_ADMIN_TOKEN");
22 if (!token) {
23 return <Navigate to="/admin/login" replace />;
24 }
132 if (!token) return <Navigate to="/admin/login" replace />;
25133 return children;
26134}
27135
28function AdminRoutes() {
136function AdminGate({ children }) {
29137 return (
30 <Routes>
31 {/* Login — always accessible */}
32 <Route path="/admin/login" element={<AdminLogin />} />
33
34 {/* Redirect bare /admin to /admin/bookings */}
35 <Route path="/admin" element={<Navigate to="/admin/bookings" replace />} />
36
37 {/* Protected admin pages */}
38 <Route
39 path="/admin/bookings"
40 element={
41 <RequireAuth>
42 <AdminShell>
43 <RealAdminBookings />
44 </AdminShell>
45 </RequireAuth>
46 }
47 />
48
49 <Route
50 path="/admin/dashboard"
51 element={
52 <RequireAuth>
53 <AdminShell>
54 <RealAdminBookings />
55 </AdminShell>
56 </RequireAuth>
57 }
58 />
59
60 <Route
61 path="/admin/cockpit"
62 element={
63 <RequireAuth>
64 <AdminShell>
65 <Cockpit />
66 </AdminShell>
67 </RequireAuth>
68 }
69 />
70
71 {/* Catch-all for unknown /admin/* paths */}
72 <Route path="/admin/*" element={<Navigate to="/admin/login" replace />} />
73 </Routes>
138 <RequireAuth>
139 <AdminShell>{children}</AdminShell>
140 </RequireAuth>
74141 );
75142}
76143
77function PublicRoutes() {
144export default function App() {
78145 return (
79 <Routes>
80 <Route path="/" element={<Navigate to="/service-areas" replace />} />
81 <Route path="/service-areas" element={<ServiceAreas />} />
82 <Route path="/dairy-flat-airport-shuttle" element={<DairyFlatAirportShuttle />} />
83 <Route path="/late-night-airport-shuttle" element={<LateNightAirportShuttle />} />
84 <Route path="/warkworth-airport-shuttle" element={<WarkworthAirportShuttle />} />
85 <Route path="*" element={<Navigate to="/service-areas" replace />} />
86 </Routes>
87 );
88}
146 <div className="App">
147 <BrowserRouter>
148 <Routes>
149 {/* Public site */}
150 <Route path="/" element={<Home />} />
151 <Route path="/book-now" element={<BookingPage />} />
152 <Route path="/booking" element={<BookingPage />} />
89153
90function RouterSwitch() {
91 const loc = useLocation();
92 const path = loc?.pathname || "/";
93 if (path.startsWith("/admin")) return <AdminRoutes />;
94 return <PublicRoutes />;
95}
154 <Route path="/service-areas" element={<ServiceAreas />} />
155 <Route path="/student-airport-transfers" element={<StudentAirportTransfers />} />
156 <Route path="/faq" element={<FAQ />} />
157 <Route path="/flight-tracker" element={<FlightTracker />} />
158 <Route path="/airport-arrivals" element={<AirportArrivals />} />
96159
97export default function App() {
98 return (
99 <BrowserRouter>
100 <RouterSwitch />
101 </BrowserRouter>
160 {/* Suburb pages */}
161 <Route path="/orewa-airport-shuttle" element={<OrewaShuttle />} />
162 <Route path="/silverdale-airport-shuttle" element={<SilverdaleShuttle />} />
163 <Route path="/whangaparaoa-airport-shuttle" element={<WhangaparaoaShuttle />} />
164 <Route path="/red-beach-airport-shuttle" element={<RedBeachShuttle />} />
165 <Route path="/gulf-harbour-airport-shuttle" element={<GulfHarbourShuttle />} />
166 <Route path="/stanmore-bay-airport-shuttle" element={<StanmoreBayShuttle />} />
167 <Route path="/arkles-bay-airport-shuttle" element={<ArklesBayShuttle />} />
168 <Route path="/army-bay-airport-shuttle" element={<ArmyBayShuttle />} />
169 <Route path="/hatfields-beach-airport-shuttle" element={<HatfieldsBeachShuttle />} />
170 <Route path="/manly-airport-shuttle" element={<ManlyShuttle />} />
171 <Route path="/albany-airport-shuttle" element={<AlbanyShuttle />} />
172 <Route path="/takapuna-airport-shuttle" element={<TakapunaShuttle />} />
173 <Route path="/browns-bay-airport-shuttle" element={<BrownsBayShuttle />} />
174 <Route path="/mairangi-bay-airport-shuttle" element={<MairangiBayShuttle />} />
175 <Route path="/devonport-airport-shuttle" element={<DevonportShuttle />} />
176
177 {/* Service pages */}
178 <Route path="/corporate-airport-transfers" element={<CorporateTransfers />} />
179 <Route path="/cruise-ship-transfers" element={<CruiseTransfers />} />
180 <Route path="/auckland-airport-transfers" element={<AucklandAirportTransfers />} />
181
182 {/* Schools */}
183 <Route path="/orewa-college-airport-shuttle" element={<OrewaCollegeShuttle />} />
184 <Route path="/whangaparaoa-college-airport-shuttle" element={<WhangaparaoaCollegeShuttle />} />
185 <Route path="/kingsway-school-airport-shuttle" element={<KingswaySchoolShuttle />} />
186 <Route path="/long-bay-college-airport-shuttle" element={<LongBayCollegeShuttle />} />
187 <Route path="/rangitoto-college-airport-shuttle" element={<RangitotoCollegeShuttle />} />
188
189 {/* Matakana */}
190 <Route path="/matakana-shuttle" element={<MatakanaShuttle />} />
191 <Route path="/matakana-concert-shuttle" element={<MatakanaConcertShuttle />} />
192 <Route path="/matakana-events-shuttle" element={<MatakanaEventsShuttle />} />
193 <Route path="/matakana-farmers-market-shuttle" element={<MatakanaFarmersMarketShuttle />} />
194 <Route path="/matakana-village-shuttle" element={<MatakanaVillageShuttle />} />
195 <Route path="/matakana-winery-shuttle" element={<MatakanaWineryShuttle />} />
196
197 {/* Misc SEO */}
198 <Route path="/best-airport-shuttle-hibiscus-coast" element={<BestAirportShuttle />} />
199 <Route path="/orewa-to-auckland-airport-shuttle" element={<OrewaToAirport />} />
200 <Route path="/early-morning-airport-shuttle" element={<EarlyMorningShuttle />} />
201 <Route path="/business-airport-transfer" element={<BusinessAirportTransfer />} />
202 <Route path="/hibiscus-shuttles-alternative" element={<HibiscusShuttlesAlternative />} />
203 <Route path="/local-airport-shuttle" element={<LocalAirportShuttle />} />
204 <Route path="/airport-shuttle-orewa" element={<AirportShuttleOrewa />} />
205
206 {/* New SEO pages */}
207 <Route path="/warkworth-airport-shuttle" element={<WarkworthAirportShuttle />} />
208 <Route path="/late-night-airport-shuttle" element={<LateNightAirportShuttle />} />
209 <Route path="/snells-beach-airport-shuttle" element={<SnellsBeachAirportShuttle />} />
210 <Route path="/omaha-airport-shuttle" element={<OmahaAirportShuttle />} />
211 <Route path="/puhoi-airport-shuttle" element={<PuhoiAirportShuttle />} />
212 <Route path="/millwater-airport-shuttle" element={<MillwaterAirportShuttle />} />
213 <Route path="/leigh-airport-shuttle" element={<LeighAirportShuttle />} />
214 <Route path="/early-morning-flight-shuttle" element={<EarlyMorningFlightShuttle />} />
215 <Route path="/executive-airport-transfers" element={<ExecutiveAirportTransfers />} />
216 <Route path="/family-airport-shuttle" element={<FamilyAirportShuttle />} />
217 <Route path="/dairy-flat-airport-shuttle" element={<DairyFlatAirportShuttle />} />
218 <Route path="/wellsford-airport-shuttle" element={<WellsfordAirportShuttle />} />
219
220 {/* Payments */}
221 <Route path="/payment/success" element={<PaymentSuccess />} />
222 <Route path="/payment/cancel" element={<PaymentCancel />} />
223
224 {/* Tracking + driver */}
225 <Route path="/track/:trackingRef" element={<CustomerTracking />} />
226 <Route path="/driver/portal" element={<DriverPortal />} />
227 <Route path="/driver/track/:bookingId" element={<DriverTracking />} />
228 <Route path="/driver/job/:bookingId" element={<DriverJobResponse />} />
229
230 {/* Admin */}
231 <Route path="/admin" element={<Navigate to="/admin/dashboard" replace />} />
232 <Route path="/admin/login" element={<AdminLogin />} />
233 <Route path="/admin/reset-password" element={<AdminResetPassword />} />
234
235 <Route path="/admin/dashboard" element={<AdminGate><AdminDashboard /></AdminGate>} />
236 <Route path="/admin/bookings" element={<AdminGate><AdminDashboard /></AdminGate>} />
237 <Route path="/admin/cockpit" element={<AdminGate><Cockpit /></AdminGate>} />
238 <Route path="/admin/change-password" element={<AdminGate><ChangePassword /></AdminGate>} />
239 <Route path="/admin/seo" element={<AdminGate><AdminSEO /></AdminGate>} />
240 <Route path="/admin/create-booking" element={<AdminGate><AdminCreateBooking /></AdminGate>} />
241 <Route path="/admin/edit-booking/:bookingId" element={<AdminGate><AdminEditBooking /></AdminGate>} />
242
243 {/* Fallback: unknown route -> home */}
244 <Route path="*" element={<Navigate to="/" replace />} />
245 </Routes>
246 </BrowserRouter>
247 <Toaster />
248 </div>
102249 );
103250}
Modifiedfrontend/src/config.js+12−4View fileUnifiedSplit
1// Centralized backend URL configuration
2// Falls back to the known Render deployment if REACT_APP_BACKEND_URL is not set.
3export const BACKEND_URL =
4 process.env.REACT_APP_BACKEND_URL || 'https://hibiscus-to-airport-1.onrender.com';
1// Centralized backend URL configuration.
2//
3// IMPORTANT:
4// - Many pages (Admin + Booking) depend on this single value.
5// - If the env var is missing in Vercel, we must default to the production API
6// custom domain, otherwise different parts of the app can talk to different
7// backends/DBs (login vs bookings) and the admin can appear "empty".
8export const BACKEND_URL = (
9 process.env.REACT_APP_BACKEND_URL ||
10 process.env.REACT_APP_API_BASE ||
11 'https://api.hibiscustoairport.co.nz'
12).replace(/\/+$/, '');
Addedfrontend/yarn.lock+10915−0View fileUnifiedSplit
Large file (10,916 lines). Load full file
c comment · e edit title · m merge · a approve · r request changes · ? shortcuts