PageSourceSearch

https://taximansfield.co.uk/assets/PortalDashboard-CJ8krohW.js

js taximansfield.co.uk collected 2026-10-09 23:43:07 UTC 22,750 bytes, 2 lines download raw bytes

1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/PortalDashboardHeader-DbDQ3S7E.js","assets/vendor-react-CV6oP_vj.js","assets/index-BBakkP5p.js","assets/index-CiATEfYc.css","assets/PortalDashboardStats-D8CgGN3X.js","assets/building-2-BbVUU6Eh.js","assets/phone-cXJhzx4j.js","assets/PortalDashboardRecentBookings-BhWwYR13.js","assets/PortalDashboardQuickActions-DsD-gJ7H.js","assets/form-BQgTFbgK.js","assets/index.esm-B02a9nYO.js","assets/select-D8KuqxlD.js","assets/index-BdQq_4o_.js","assets/index-DmhWewrX.js","assets/index-BiVcq5-x.js","assets/Combination-Dldzaojn.js","assets/index-B5D36ucC.js","assets/index-oqE25gSe.js","assets/check-check-DDEpdOk7.js","assets/receipt-DNBZ9Rj5.js","assets/formFields-8E648jOJ.js","assets/time-picker-UVPhS_xR.js","assets/vendor-dates-Cxf7QC8V.js","assets/chevron-left-Bh0wBodU.js","assets/PortalDashboardSidebar-7EHD-bKN.js","assets/key-round-evNA1am1.js","assets/PortalDashboardActivityFeed-Cv2qEipa.js","assets/user-plus-DzGiNkCU.js"])))=>i.map(i=>d[i]);
2import{aH as se,u as re,aT as oe,bc as ae,z as $,bd as ne,ac as J,a0 as ie,ax as ce,c as le,_ as N}from"./index-BBakkP5p.js";import{r as n,j as e}from"./vendor-react-CV6oP_vj.js";import{L as de}from"./LoadingSpinner-BgB5K0Kh.js";import{t as U}from"./zod-C8zy4HuJ.js";import{b as O}from"./index.esm-B02a9nYO.js";import{r as M}from"./postcodeSanity-BK_dSGhe.js";import{o as I,s as d,e as pe,l as ue}from"./types-CGO4AJdh.js";import{u as _}from"./useMutation-DlMurulE.js";import{o as K}from"./groupBookingModel-CXOmdHcI.js";import{R as me}from"./rotate-ccw-Bjw0PaeR.js";import"./bookingPayloadUtils--Q52KCfu.js";import"./ukCalendarDate-mFgYYPbq.js";import"./paymentMethod-CXzr11Tb.js";import"./vendor-dates-Cxf7QC8V.js";const E=t=>({Authorization:`Bearer ${t}`}),L=t=>({"Content-Type":"application/json",...E(t)});async function he(t){const r=await fetch("/api/portal/bookings",{headers:E(t)});if(!r.ok)throw new Error("Failed to fetch bookings");return r.json()}async function fe(t){const r=await fetch("/api/portal/users",{headers:E(t)});if(!r.ok)throw new Error("Failed to fetch team");return r.json()}async function xe(t,r){const o=await fetch("/api/portal/bookings",{method:"POST",headers:L(t),body:JSON.stringify(je(r))});if(!o.ok){const c=await o.json();throw new Error(c.error||"Failed to create booking")}return o.json()}async function be(t,r){const o=await fetch("/api/portal/users",{method:"POST",headers:L(t),body:JSON.stringify(r)});if(!o.ok){const c=await o.json();throw new Error(c.error||"Failed to add team member")}return o.json()}async function we(t,r){const o=await fetch(`/api/portal/users/${r}`,{method:"DELETE",headers:E(t)});if(!o.ok){const c=await o.json();throw new Error(c.error||"Failed to remove team member")}return o.json()}async function ye(t,r){const o=await fetch("/api/portal/change-password",{method:"POST",headers:L(t),body:JSON.stringify({currentPassword:r.currentPassword,newPassword:r.newPassword})});if(!o.ok){const c=await o.json();throw new Error(c.error||"Failed to change password")}return o.json()}async function ge(t,r){const o=await fetch("/api/portal/quote",{method:"POST",headers:L(t),body:JSON.stringify({pickup:r.pickupAddress,dropoff:r.dropoffAddress,vehicleType:r.vehicleType,passengers:parseInt(r.passengers)})});if(!o.ok){const c=await o.json();throw new Error(c.error||"Failed to get quote")}return o.json()}function je(t){const{data:r,pickupCoords:o,dropoffCoords:c,pickupDateTime:g,poNumber:h,quoteResult:a,user:m}=t;return{pickupLocation:r.pickupAddress,pickupAddress:r.pickupAddress,pickupPostcode:M(o?.postcode,r.pickupAddress),pickupLatitude:o?.lat||0,pickupLongitude:o?.lng||0,pickupCity:o?.city||"",dropoffLocation:r.dropoffAddress,dropoffAddress:r.dropoffAddress,dropoffPostcode:M(c?.postcode,r.dropoffAddress),dropoffLatitude:c?.lat||0,dropoffLongitude:c?.lng||0,dropoffCity:c?.city||"",pickupDateTime:g,passengers:parseInt(r.passengers),luggage:0,vehicleType:r.vehicleType,customerName:r.passengerName,customerEmail:r.passengerEmail||m?.email||"",customerPhone:r.passengerPhone,estimatedFare:a?.fare||0,estimatedDistance:a?.distance||0,estimatedDuration:a?.duration||0,specialRequirements:r.specialRequirements||"",costCentre:r.costCentre||"",purchaseOrderRef:h.trim(),bookingType:"standard",tripType:"one_way",paymentMethod:"account"}}const ke=I({passengerName:d().min(2,"Passenger name is required"),passengerPhone:d().min(10,"Phone number is required"),passengerEmail:d().email("Valid email required").optional().or(ue("")),pickupAddress:d().min(3,"Pickup address is required"),dropoffAddress:d().min(3,"Dropoff address is required"),pickupDate:d().min(1,"Date is required"),pickupTime:d().min(1,"Time is required"),passengers:d().default("1"),vehicleType:d().default("saloon"),costCentre:d().optional(),specialRequirements:d().optional()}),Ne=I({name:d().min(2,"Name is required"),email:d().email("Valid email required"),password:d().min(6,"Password must be at least 6 characters"),role:pe(["booker","admin"]).default("booker"),department:d().optional()}),Pe=I({currentPassword:d().min(1,"Current password is required"),newPassword:d().min(8,"New password must be at least 8 characters"),confirmPassword:d().min(1,"Please confirm your new password")}).refine(t=>t.newPassword===t.confirmPassword,{message:"Passwords do not match",path:["confirmPassword"]}),H="er_portal_last_passenger",ve=()=>{try{const t=localStorage.getItem(H);return t?JSON.parse(t):null}catch{return null}},Se=t=>{try{localStorage.setItem(H,JSON.stringify(t))}catch{}},De=()=>{const t=localStorage.getItem("portal_user"),r=localStorage.getItem("portal_account");return{user:t?JSON.parse(t):null,account:r?JSON.parse(r):null}},Te=()=>{localStorage.removeItem("portal_token"),localStorage.removeItem("portal_user"),localStorage.removeItem("portal_account")};function Ae(t){const r=_({mutationFn:async a=>{const m={name:a.passengerName,phone:a.passengerPhone,email:a.passengerEmail||""};return Se(m),t.setLastPassenger(m),xe(t.token,{data:a,pickupCoords:t.pickupCoords,dropoffCoords:t.dropoffCoords,pickupDateTime:`${a.pickupDate}T${a.pickupTime}:00`,poNumber:t.poNumber,quoteResult:t.quoteResult,user:t.user})},onSuccess:()=>{t.toast({title:"Booking Confirmed",description:"Your ride has been confirmed and dispatched to our fleet."}),t.form.reset(),t.setShowLastPassengerBanner(!0),t.setPickupCoords(null),t.setDropoffCoords(null),t.setQuoteResult(null),t.setPriceAccepted(!1),t.setPoNumber(""),t.queryClient.invali
2dateQueries({queryKey:["/api/portal/bookings"]}),t.setActiveTab("history")},onError:a=>{t.toast({title:"Booking Failed",description:a.message||"Please try again or call us.",variant:"destructive"})}}),o=_({mutationFn:a=>be(t.token,a),onSuccess:()=>{t.toast({title:"Team Member Added",description:"They can now log in and book rides."}),t.addUserForm.reset(),t.setShowAddUser(!1),t.queryClient.invalidateQueries({queryKey:["/api/portal/users"]})},onError:a=>{t.toast({title:"Failed to Add",description:a.message,variant:"destructive"})}}),c=_({mutationFn:a=>we(t.token,a),onSuccess:()=>{t.toast({title:"Team Member Removed"}),t.queryClient.invalidateQueries({queryKey:["/api/portal/users"]})},onError:a=>{t.toast({title:"Failed to Remove",description:a.message,variant:"destructive"})}}),g=_({mutationFn:a=>ye(t.token,a),onSuccess:()=>{t.toast({title:"Password Changed",description:"Your password has been updated successfully."}),t.changePasswordForm.reset()},onError:a=>{t.toast({title:"Failed",description:a.message,variant:"destructive"})}});return{bookingMutation:r,addUserMutation:o,removeUserMutation:c,changePasswordMutation:g,getQuote:async()=>{const a=t.form.getValues();if(!(!a.pickupAddress||!a.dropoffAddress)){t.setGettingQuote(!0),t.setPriceAccepted(!1),t.setPoNumber("");try{t.setQuoteResult(await ge(t.token,a))}catch(m){const l=m instanceof Error?m.message:"Unable to get fare estimate.";t.toast({title:"Quote Failed",description:l,variant:"destructive"})}finally{t.setGettingQuote(!1)}}}}}function _e(){const{toast:t}=se(),[r,o]=re(),c=oe(),h=ae(r,"/portal/dashboard",["book","history","team","account","password"],"book"),a=h.tab,m=A=>o(ne("/portal/dashboard",A,window.location.search)),[l,R]=n.useState(null),[q,S]=n.useState(null),f=localStorage.getItem("portal_token"),[F,P]=n.useState(null),[D,v]=n.useState(null),[s,i]=n.useState(null),[x,b]=n.useState(!1),[w,p]=n.useState(!1),[j,u]=n.useState(""),[T,B]=n.useState(!1),[Y,W]=n.useState(ve),[X,Q]=n.useState(!0);n.useEffect(()=>{if(!f){o("/portal/login");return}const A=De();R(A.user),S(A.account)},[f,o]),n.useEffect(()=>{h.isCanonical||window.history.replaceState({},"",`${h.canonicalPath}${window.location.search}`)},[h.canonicalPath,h.isCanonical]);const Z=$({queryKey:["/api/portal/bookings"],queryFn:()=>he(f),enabled:!!f}),ee=$({queryKey:["/api/portal/users"],queryFn:()=>fe(f),enabled:!!f}),V=O({resolver:U(ke),defaultValues:{passengerName:"",passengerPhone:"",passengerEmail:"",pickupAddress:"",dropoffAddress:"",pickupDate:"",pickupTime:"",passengers:"1",vehicleType:"saloon",costCentre:l?.costCentre||"",specialRequirements:""}}),G=O({resolver:U(Ne),defaultValues:{name:"",email:"",password:"",role:"booker",department:""}}),z=O({resolver:U(Pe),defaultValues:{currentPassword:"",newPassword:"",confirmPassword:""}}),te=Ae({token:f,user:l,form:V,addUserForm:G,changePasswordForm:z,pickupCoords:F,dropoffCoords:D,poNumber:j,quoteResult:s,toast:t,queryClient:c,setActiveTab:m,setDropoffCoords:v,setGettingQuote:b,setLastPassenger:W,setPickupCoords:P,setPoNumber:u,setPriceAccepted:p,setQuoteResult:i,setShowAddUser:B,setShowLastPassengerBanner:Q});return{activeTab:a,setActiveTab:m,user:l,account:q,token:f,bookingsQuery:Z,teamQuery:ee,form:V,addUserForm:G,changePasswordForm:z,...te,setPickupCoords:P,setDropoffCoords:v,quoteResult:s,setQuoteResult:i,gettingQuote:x,priceAccepted:w,setPriceAccepted:p,poNumber:j,setPoNumber:u,showAddUser:T,setShowAddUser:B,lastPassenger:Y,showLastPassengerBanner:X,setShowLastPassengerBanner:Q,handleLogout:()=>{Te(),o("/portal/login")},minDate:new Date().toISOString().split("T")[0],isAdmin:l?.role==="admin",toast:t}}async function Ce(t){const r=await fetch("/api/portal/journeys",{headers:{Authorization:`Bearer ${t}`}}),o=await r.json().catch(()=>({}));if(!r.ok)throw new Error(o.error||"Your group bookings could not be loaded.");return o}function C(t){return(t.legs?.map(o=>o.itinerary?.pickupDateTime).filter(Boolean)||t.plan?.legs.map(o=>o.pickupDateTime)||[]).map(o=>new Date(o).getTime()).filter(Number.isFinite).sort((o,c)=>o-c)}function y(t){if(t)try{const r=new URL(t,window.location.origin),o=/(^|\.)followtaxi\.com$|(^|\.)modifybooking\.com$/i.test(r.hostname);return r.origin===window.location.origin||r.protocol==="https:"&&o?r.href:void 0}catch{return}}
2function Ee({token:t,supportPhone:r}){const[o,c]=n.useState("upcoming"),[g,h]=n.useState(""),[a,m]=n.useState(""),l=$({queryKey:["portal","journeys",t],queryFn:()=>Ce(t),enabled:!!t,retry:1}),R=n.useMemo(()=>(l.data?.groups||[]).filter(s=>C(s).some(i=>i>=Date.now())),[l.data]),q=n.useMemo(()=>(l.data?.groups||[]).filter(s=>!C(s).some(i=>i>=Date.now())),[l.data]),S=o==="upcoming"?R:o==="past"?q:l.data?.groups||[],f=o==="upcoming"||o==="past"?(l.data?.journeys||[]).filter(s=>{const i=new Date(s.pickupDateTime).getTime();return Number.isFinite(i)&&(o==="upcoming"?i>=Date.now():i<Date.now())}):[],F=s=>{if(!s.plan){h("This booking cannot be reopened for rebooking. Contact support and we will help.");return}sessionStorage.setItem("enroute:group-rebook-draft",JSON.stringify(s.plan)),window.location.assign("/book-multiple-taxis?rebook=1")},P=(s,i=!1)=>{const x=C(s),b=x.find(w=>w>=Date.now())||x[x.length-1];K({reference:s.reference,itinerary:s.legs?.map(w=>`${w.itinerary?.pickup?.address||""} to ${w.itinerary?.dropoff?.address||""}`).join(" | ")||"",date:b?new Date(b).toISOString():"",totalPence:s.totalPence||0,...i?{request:"invoice"}:{}})},D=async s=>{m(s),h("");try{const i=await fetch(`/api/public/booking-groups/${encodeURIComponent(s)}/receipt`,{headers:{Authorization:`Bearer ${t}`}});if(!i.ok)throw new Error("Receipt is not available yet.");const x=URL.createObjectURL(await i.blob()),b=document.createElement("a");b.href=x,b.download=`${s}-receipt.html`,b.click(),window.setTimeout(()=>URL.revokeObjectURL(x),6e4)}catch(i){h(i instanceof Error?i.message:"Unable to open receipt.")}finally{m("")}};if(l.isLoading)return e.jsxs("div",{"aria-label":"Loading group journeys",className:"my-6 space-y-3 rounded-xl border border-white/10 bg-[#111] p-6",children:[e.jsx("div",{className:"h-5 w-1/3 animate-pulse rounded bg-white/10"}),e.jsx("div",{className:"h-20 animate-pulse rounded bg-white/5"}),e.jsx("div",{className:"h-20 animate-pulse rounded bg-white/5"})]});if(l.isError)return e.jsxs("section",{className:"my-6 rounded-xl border border-white/10 bg-[#111] p-5",children:[e.jsx("h2",{className:"font-bold",children:"Group journeys"}),e.jsx("p",{role:"alert",className:"mt-2 text-sm text-red-300",children:l.error.message}),e.jsx("button",{onClick:()=>{l.refetch()},className:"mt-3 rounded bg-primary px-4 py-2 text-sm font-semibold text-black",children:"Retry"})]});const v=(l.data?.groups||[]).filter(s=>["paid","paid_pending_review","pending_fulfilment","paid_pending_dispatch","paid_dispatching","confirmed"].includes(s.paymentStatus));return e.jsxs("section",{className:"my-6 rounded-xl border border-white/10 bg-[#101010] p-4 sm:p-6",children:[e.jsxs("header",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-xs font-bold uppercase tracking-[.16em] text-primary",children:"Your account"}),e.jsx("h2",{className:"mt-1 text-xl font-bold",children:"Group journeys"}),e.jsx("p",{className:"mt-1 text-sm text-white/55",children:"One booking reference for your whole itinerary."})]}),e.jsx("a",{href:`tel:${r.replace(/\s/g,"")}`,className:"text-sm text-primary underline",children:"Group booking support"})]}),e.jsx("div",{role:"tablist","aria-label":"Group booking views",className:"mt-5 flex flex-wrap gap-2",children:[["upcoming","Upcoming"],["past","Past"],["groups","All groups"],["documents","Documents"]].map(([s,i])=>e.jsx("button",{role:"tab","aria-selected":o===s,onClick:()=>c(s),className:`rounded-full px-3 py-2 text-xs font-semibold ${o===s?"bg-primary text-black":"border border-white/15 text-white/70"}`,children:i},s))}),g&&e.jsx("p",{role:"alert",className:"mt-3 text-sm text-amber-200",children:g}),o==="documents"?e.jsxs("div",{className:"mt-4 space-y-2",children:[v.map(s=>e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3 rounded-lg border border-white/10 p-3",children:[e.jsxs("span",{className:"text-sm",children:[s.reference," · receipt"]}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsxs("button",{disabled:a===s.reference,onClick:()=>D(s.reference),className:"inline-flex min-h-10 items-center gap-2 rounded border border-white/20 px-3 text-xs",children:[e.jsx(J,{size:15}),a===s.reference?"Downloading…":"Download receipt"]}),e.jsx("button",{onClick:()=>P(s,!0),className:"inline-flex min-h-10 items-center rounded border border-white/20 px-3 text-xs",children:"Request invoice"})]})]},s.reference)),!v.length&&e.jsx("p",{className:"mt-4 rounded-lg border border-dashed border-white/15 p-5 text-sm text-white/55",children:"Receipts and group documents will appear here once available."}),e.jsx("p",{className:"pt-3 text-xs leading-5 text-white/55",children:"A receipt is not a VAT invoice. Eligible VAT/business invoices are delivered on request by our existing accounting service; no invoice is generated here."})]}):e.jsxs("div",{className:"mt-4 space-y-3",children:[S.map(s=>{const i=C(s),x=i.find(p=>p>=Date.now())||i[i.length-1]||0,b=new Intl.NumberFormat("en-GB",{style:"currency",currency:"GBP"}).format((s.totalPence||0)/100),w=s.legs?.[0]?.itinerary||s.plan?.legs[0];return e.jsxs("article",{className:"rounded-lg border border-white/10 bg-black/30 p-4",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("p",{className:"font-bold",children:s.reference}),e.jsxs("p",{className:"mt-1 text-xs text-white/55",children:[x?new Date(x).toLocaleStr
2ing("en-GB",{dateStyle:"medium",timeStyle:"short"}):"Date to be confirmed"," · ",s.plan?.legs.length||s.legs?.length||0," journeys"]}),e.jsx("p",{className:"mt-1 text-xs text-amber-200",children:s.paymentStatus.replaceAll("_"," ")})]}),e.jsx("p",{className:"font-bold text-primary",children:b})]}),w&&e.jsxs("p",{className:"mt-3 text-sm text-white/70",children:[w.pickup?.address," ",e.jsx("span",{className:"text-white/40",children:"to"})," ",w.dropoff?.address]}),s.paymentStatus!=="confirmed"&&e.jsxs("p",{className:"mt-2 rounded bg-amber-300/10 px-3 py-2 text-xs leading-5 text-amber-100",children:["Payment and fleet status: ",s.paymentStatus.replaceAll("_"," "),". Paid does not mean vehicles are confirmed."]}),e.jsxs("div",{className:"mt-3 flex flex-wrap gap-2",children:[e.jsxs("button",{onClick:()=>F(s),className:"inline-flex min-h-10 items-center gap-2 rounded bg-primary px-3 text-xs font-bold text-black",children:[e.jsx(me,{size:14}),"Rebook group"]}),e.jsxs("button",{onClick:()=>D(s.reference),className:"inline-flex min-h-10 items-center gap-2 rounded border border-white/20 px-3 text-xs",children:[e.jsx(J,{size:14}),"Receipt"]}),e.jsx("button",{onClick:()=>P(s),className:"inline-flex min-h-10 items-center gap-2 rounded border border-white/20 px-3 text-xs",children:"Get help with this group"})]}),!!s.legs?.length&&e.jsxs("details",{className:"mt-4 rounded-lg border border-white/15",children:[e.jsxs("summary",{className:"cursor-pointer px-3 py-3 text-sm font-semibold text-primary",children:["View ",s.legs.length," journeys and vehicle status"]}),e.jsx("div",{className:"space-y-3 border-t border-white/10 p-3",children:s.legs.map((p,j)=>e.jsxs("section",{className:"rounded border border-white/10 p-3","aria-label":`Journey ${j+1}`,children:[e.jsxs("h3",{className:"text-sm font-bold",children:["Journey ",j+1," · ",p.reference]}),e.jsxs("p",{className:"mt-1 text-xs text-white/60",children:[p.itinerary?.pickupDateTime?new Date(p.itinerary.pickupDateTime).toLocaleString("en-GB"):"Date to be confirmed"," · ",p.passengers," passengers · ",p.fleet?.vehicleCount||p.vehicles?.length||0," vehicles"]}),e.jsxs("p",{className:"mt-2 text-sm text-white/75",children:[p.itinerary?.pickup?.address," → ",p.itinerary?.dropoff?.address]}),e.jsx("ul",{className:"mt-3 space-y-2",children:p.vehicles?.map((u,T)=>e.jsxs("li",{className:"rounded border border-white/10 p-2 text-xs",children:[e.jsxs("p",{children:["Vehicle ",u.position||T+1," · ",u.type," · ",u.passengers," passengers"]}),e.jsxs("p",{className:"mt-1 text-amber-200",children:[String(u.status||"Awaiting dispatch").replaceAll("_"," "),u.icabbiRef?` · job ${u.icabbiRef}`:""]}),e.jsxs("div",{className:"mt-2 flex flex-wrap gap-2",children:[y(u.followUrl)&&e.jsxs("a",{className:"inline-flex min-h-10 items-center gap-1 rounded border border-white/20 px-3",href:y(u.followUrl),children:[e.jsx(ie,{size:13}),"Follow taxi"]}),y(u.modifyUrl)&&e.jsxs("a",{className:"inline-flex min-h-10 items-center gap-1 rounded border border-white/20 px-3",href:y(u.modifyUrl),children:[e.jsx(ce,{size:13}),"View or modify"]})]})]},u.bookingId||T))})]},p.reference||j))})]})]},s.reference)}),S.length===0&&e.jsxs("div",{className:"rounded-lg border border-dashed border-white/15 p-6 text-center",children:[e.jsxs("p",{className:"font-semibold",children:["No ",o==="groups"?"":o," group bookings yet"]}),e.jsx("p",{className:"mt-2 text-sm text-white/55",children:"Plan several journeys in one booking whenever you need to move a group."}),e.jsx("a",{href:"/book-multiple-taxis",className:"mt-4 inline-flex min-h-10 items-center rounded bg-primary px-4 text-sm font-bold text-black",children:"Plan a group booking"})]})]}),f.length>0&&e.jsxs("section",{className:"mt-6 space-y-3","aria-label":`${o} individual taxi journeys`,children:[e.jsx("h3",{className:"text-base font-bold",children:"Individual taxi journeys"}),f.map(s=>e.jsxs("article",{className:"rounded-lg border border-white/15 bg-white/[.03] p-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[e.jsxs("strong",{className:"text-sm",children:[new Date(s.pickupDateTime).toLocaleStr
2ing("en-GB")," · ",s.reference]}),e.jsx("span",{className:"text-xs text-white/60",children:s.status?.replaceAll("_"," ")})]}),e.jsxs("p",{className:"mt-2 text-sm text-white/75",children:[s.pickupAddress," → ",s.dropoffAddress]}),e.jsxs("div",{className:"mt-3 flex gap-2 text-xs",children:[y(s.followUrl)&&e.jsx("a",{href:y(s.followUrl),className:"rounded border border-white/20 px-3 py-2",children:"Follow taxi"}),y(s.modifyUrl)&&e.jsx("a",{href:y(s.modifyUrl),className:"rounded border border-white/20 px-3 py-2",children:"View or modify"}),e.jsx("button",{onClick:()=>K({reference:s.reference,itinerary:`${s.pickupAddress} to ${s.dropoffAddress}`,date:s.pickupDateTime,totalPence:s.totalPence||0}),className:"rounded border border-white/20 px-3 py-2",children:"Get help"})]})]},s.id))]}),e.jsxs("div",{className:"mt-5 border-t border-white/10 pt-4 text-xs text-white/45",children:["Need help with your group? Call ",e.jsx("a",{href:`tel:${r.replace(/\s/g,"")}`,className:"text-primary underline",children:r}),"."]})]})}const Le=n.lazy(()=>N(()=>import("./PortalDashboardHeader-DbDQ3S7E.js"),__vite__mapDeps([0,1,2,3]))),Re=n.lazy(()=>N(()=>import("./PortalDashboardStats-D8CgGN3X.js"),__vite__mapDeps([4,1,2,3,5,6]))),qe=n.lazy(()=>N(()=>import("./PortalDashboardRecentBookings-BhWwYR13.js"),__vite__mapDeps([7,1,2,3,5]))),Fe=n.lazy(()=>N(()=>import("./PortalDashboardQuickActions-DsD-gJ7H.js"),__vite__mapDeps([8,1,2,3,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]))),Ue=n.lazy(()=>N(()=>import("./PortalDashboardSidebar-7EHD-bKN.js"),__vite__mapDeps([24,1,2,3,25]))),Oe=n.lazy(()=>N(()=>import("./PortalDashboardActivityFeed-Cv2qEipa.js"),__vite__mapDeps([26,1,2,3,9,10,20,11,12,13,14,15,16,17,25,27]))),k=({children:t})=>e.jsx(n.Suspense,{fallback:e.jsx(de,{}),children:t});function et(){const t=le(),r=_e();return!r.token||!r.user||!r.account?null:e.jsxs("div",{className:"min-h-screen bg-background",children:[e.jsx(k,{children:e.jsx(Le,{data:r})}),e.jsxs("div",{className:"max-w-6xl mx-auto px-4 py-6",children:[e.jsx(Ee,{token:r.token,supportPhone:t.phone||"020 8520 1177"}),e.jsx(k,{children:e.jsx(Ue,{data:r})}),e.jsx(k,{children:e.jsx(Fe,{data:r})}),e.jsx(k,{children:e.jsx(qe,{data:r})}),e.jsx(k,{children:e.jsx(Oe,{data:r,supportPhone:t.phone||"020 8520 1177"})}),e.jsx(k,{children:e.jsx(Re,{data:r})})]})]})}export{et as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.