PageSourceSearch

https://zippygo.ai/assets/Account-_R56INxN.js

js zippygo.ai collected 2026-10-05 14:03:26 UTC 28,448 bytes, 1 lines download raw bytes

1import{j as e,r as x,d as be,L as ue}from"./vendor-react-CwobwNtT.js";import{I as se,A as ye,C as me,ar as ve,c as j,bl as je,bk as _e,bU as Ne,as as X,bV as we,bW as Ce,bt as ke,ak as Y,bX as Se,a7 as Te,f as De,by as Ee,x as le,v as $e,w as oe,af as Me}from"./index-u3Hw4B3k.js";import{u as Le,t as ze,c as Ae}from"./useSavedTravelers-BcSYxpvN.js";import{b as ce,D as Pe,C as Ie,d as Oe,c as Re,i as Ue,a as Be,T as Fe}from"./CountryCombobox-CPs7KZ48.js";import{C as Ye}from"./ChevronDownIcon-DhHEtMva.js";import{C as Ze}from"./AirlineLogo-DlFp5BA1.js";import{B as $,a as We}from"./Button-BqC13g37.js";import{S as Ge}from"./Sheet-Br-pNGQ0.js";import{T as He,C as Ve}from"./TripTicket-Bu8yIqZI.js";import{d as Ke}from"./dates-BA6WW-Mf.js";import"./vendor-sentry-Du8NRRv8.js";import"./vendor-motion-Crkh7Uo1.js";import"./countries-BKPCnlGe.js";import"./useDialogA11y-rkgeHSiq.js";import"./PeopleIcon-DhsKrkpa.js";function Xe({strokeWidth:t=2.2,...s}){return e.jsxs(se,{strokeIcon:!0,strokeWidth:t,...s,children:[e.jsx("path",{d:"M3 12a9 9 0 0 1 15.3-6.4L21 8"}),e.jsx("path",{d:"M21 3v5h-5"}),e.jsx("path",{d:"M21 12a9 9 0 0 1-15.3 6.4L3 16"}),e.jsx("path",{d:"M3 21v-5h5"})]})}function qe({id:t,value:s,options:n,onChange:i,buttonClassName:m,className:d,placeholder:o="Select",invalid:c,describedBy:g,label:_}){const[k,N]=x.useState(!1),[S,T]=x.useState(null),M=n.find(b=>b.value===s);return e.jsxs("div",{className:d,children:[e.jsxs("button",{ref:T,type:"button",id:t,onClick:()=>N(b=>!b),"aria-haspopup":"listbox","aria-expanded":k,"aria-invalid":c||void 0,"aria-describedby":g,className:`${m} flex items-center justify-between text-left ${M?"":"text-ui-label-tertiary"}`,children:[e.jsx("span",{children:M?.label??o}),e.jsx(Ye,{open:k,className:"h-[18px] w-[18px] shrink-0 text-ui-label-tertiary"})]}),e.jsx(ye,{anchor:S,open:k,onDismiss:()=>N(!1),align:"start",width:"anchor",minWidth:180,children:e.jsx("ul",{role:"listbox","aria-label":_,className:"overflow-hidden rounded-ui-md border border-ui-line bg-ui-elevated p-1.5",children:n.map(b=>{const C=b.value===s;return e.jsx("li",{role:"option","aria-selected":C,className:"mb-1 last:mb-0",children:e.jsxs("button",{type:"button",onMouseDown:z=>{z.preventDefault(),i(b.value),N(!1)},className:`flex min-h-[44px] w-full items-center justify-between gap-2 rounded-ui-sm px-3 text-left text-ui-callout ${C?"bg-ui-accent-tint text-ui-accent-text":"text-ui-label-primary hover:bg-ui-sunken"}`,children:[b.label,C&&e.jsx(Ze,{size:16})]})},b.value)})})})]})}const W=new Date().toISOString().slice(0,10),q=/^[\p{L}][\p{L}\s'-]{0,49}$/u,Je=/^[^\s@]+@[^\s@]+\.[^\s@]+$/,Qe=/^[A-Za-z0-9]{5,12}$/,pe=12;function et(t){return t.replace(/[^A-Za-z0-9]/g,"").toUpperCase().slice(0,pe)}function he(t){const s=t.trim();if(s&&!Qe.test(s))return"Passport number must be 5–12 letters or digits, no spaces."}function tt(t){const s=t.trim();if(!s)return{dial:"",local:""};const n=Re.find(i=>s.startsWith(i));return n?{dial:n,local:s.slice(n.length)}:{dial:"",local:s}}function at(t,s){const n=s.replace(/\D/g,"");return n?t+n.replace(/^0/,""):""}function st(){return Oe()||"+1"}const J={title:"",given_name:"",middle_name:"",family_name:"",gender:"",date_of_birth:"",nationality:"",issue_country:"",passport_number:"",passport_expiry:"",email:"",phone:""};function nt(t,s,n){const i={};t.given_name.trim()?q.test(t.given_name.trim())||(i.given_name="Use letters, spaces, hyphens or apostrophes only."):i.given_name="Enter a first name.",t.middle_name.trim()&&!q.test(t.middle_name.trim())&&(i.middle_name="Use letters, spaces, hyphens or apostrophes only."),t.family_name.trim()?q.test(t.family_name.trim())||(i.family_name="Use letters, spaces, hyphens or apostrophes only."):i.family_name="Enter a last name.",n&&!t.gender&&(i.gender="Choose a gender."),n&&!t.date_of_birth&&(i.date_of_birth="Enter a date of birth.");const m=t.email.trim();m&&(m.length>254||!Je.test(m))&&(i.email="Enter a valid email address, e.g. [email protected]."),s.replace(/\D/g,"")&&!Ue(t.phone)&&(i.phone="Enter a valid mobile number for the selected country code.");const d=t.passport_number.trim();if(d){const o=he(d);o&&(i.passport_number=o),t.passport_expiry||(i.passport_expiry="Enter the passport expiry date."),t.issue_country||(i.issue_country="Choose the country that issued the passport.")}else t.passport_expiry&&(i.passport_number="Enter the passport number, or clear the expiry date.");return t.passport_expiry&&t.passport_expiry<=W&&(i.passport_expiry="This passport has expired — enter a valid one."),i}function it(t){return{title:t.title??"",given_name:t.given_name??"",middle_name:t.middle_name??"",family_name:t.family_name??"",gender:t.gender??"",date_of_birth:t.date_of_birth??"",nationality:t.nationality??"",issue_country:t.issue_country??"",passport_number:t.passport_number??"",passport_expiry:t.passport_expiry??"",email:t.email??"",phone:t.phone??""}}function rt(t){const[s,n,i]=t.split("-").map(Number);if(!s||!n||!i)return!1;const m=new Date;let d=m.getUTCFullYear()-s;return(m.getUTCMonth()+1<n||m.getUTCMonth()+1===n&&m.getUTCDate()<i)&&(d-=1),d<2}function lt(t,s,n){return t==="M"?rt(n)?"MSTR":"MR":t==="F"?s==="MRS"||s==="MISS"?s:"MS":s}const Z="mt-1.5 h-12 w-full rounded-ui-md border bg-ui-surface px-3.5 text-[16px] font-medium text-ui-label-primary placeholder:font-normal placeholder:text-ui-label-tertiary focus:border-ui-accent focus:outline-none focus:ring-[3px] focus:ring-ui-accent/20",Q="block text-ui-subhead text-ui-label-secondary",de={labelClassName:"!text-[14px] !font-semibold !leading-5 text-ui-label-secondary",fieldPaddingClassName:"h-12 px-3.5 !text-[16
1px] !rounded-ui-md",fieldTextClassName:"text-ui-label-primary font-medium",fieldStyle:{borderColor:"rgb(133 143 157 / 0.6)"}};function ee({title:t,hint:s,first:n,children:i}){return e.jsxs("div",{role:"group","aria-label":t,className:j("min-w-0",n?"pt-3":"mt-6 border-t border-ui-line pt-5"),children:[e.jsxs("h3",{className:"mb-3",children:[e.jsx("span",{className:"text-ui-headline text-ui-label-primary",children:t}),s&&e.jsx("span",{className:"ml-2 text-ui-footnote font-medium text-ui-label-tertiary",children:s})]}),i]})}function te({id:t,message:s}){return s?e.jsx("p",{id:t,role:"alert",className:"mt-1.5 text-ui-footnote text-ui-danger",children:s}):null}function ot({traveler:t,onClose:s,onSaved:n,onDeleted:i}){const{refreshSession:m}=me(),d=t===null,o=t?.profile_id??"new",[c,g]=x.useState(d?J:null),[_,k]=x.useState(d?J:null),[N,S]=x.useState(!d),[T,M]=x.useState(!1),[b,C]=x.useState(!1),[z,U]=x.useState(!1),[A,r]=x.useState(null),[v,w]=x.useState(null),[D,L]=x.useState({}),[B,u]=x.useState(st),[O,ne]=x.useState("");x.useEffect(()=>{if(!t)return;let a=!0;return S(!0),ve(t.profile_id).then(h=>{if(!a)return;const l=it(h.traveler);g(l),k(l);const{dial:y,local:p}=tt(l.phone);y&&u(y),ne(p)}).catch(()=>{a&&r("Couldn’t load this traveler’s details. Close and try again.")}).finally(()=>{a&&S(!1)}),()=>{a=!1}},[t]);const P=a=>h=>{g(l=>{if(!l)return l;const y={...l,[a]:h};return(a==="gender"||a==="date_of_birth")&&(y.title=lt(y.gender,l.title,y.date_of_birth)),y}),L(l=>l[a]?{...l,[a]:void 0}:l),w(null)},ie=(a,h)=>{u(a),ne(h),P("phone")(at(a,h))},H=async a=>{try{return await a()}catch(h){if(!(h instanceof X&&(h.code==="UNAUTHORIZED"||h.status===401))||!await m())throw h;return a()}},re=(a,h)=>{if(a instanceof X&&a.code==="VALIDATION_FAILED"){const l=a.payload?.error?.field;l?L({[l]:a.message}):w(a.message)}else a instanceof X&&(a.code==="UNAUTHORIZED"||a.status===401)?w("Your session expired. Sign in again to save changes."):w(h)},xe=async()=>{if(!c||!_)return;w(null);const a=nt(c,O,d),h=["passport_number","passport_expiry","issue_country"],l=p=>c[p]!==_[p],y=d?a:Object.fromEntries(Object.entries(a).filter(([p])=>h.includes(p)?h.some(l):l(p)));if(L(y),Object.values(y).some(Boolean)){const p=Object.keys(J).find(I=>y[I]);p&&document.getElementById(`${p}-${o}`)?.focus();return}M(!0);try{if(d){const E=Object.fromEntries(Object.entries(c).filter(([,fe])=>fe!=="")),K=await H(()=>je(E));n(K.traveler),s();return}const p={};for(const E of Object.keys(c))c[E]!==_[E]&&(p[E]=c[E]);if(Object.keys(p).length===0){s();return}const I=await H(()=>_e(t.profile_id,p));n(I.traveler),s()}catch(p){re(p,d?"Couldn’t add this traveler. Try again.":"Couldn’t save those changes. Try again.")}finally{M(!1)}},ge=async()=>{if(t){U(!0),w(null);try{await H(()=>Ne(t.profile_id)),i?.(t.profile_id),s()}catch(a){re(a,"Couldn’t delete this traveler. Try again."),C(!1)}finally{U(!1)}}},f=a=>D[a],F=a=>f(a)?"border-ui-danger":"border-ui-line-strong/60";if(N)return e.jsxs("div",{className:"flex items-center gap-2 py-6 text-ui-subhead text-ui-label-secondary",children:[e.jsx("span",{className:"zg-spinner h-4 w-4 text-ui-accent","aria-hidden":"true"})," Loading details…"]});if(A||!c)return e.jsxs("div",{className:"py-4",children:[e.jsx("p",{className:"text-ui-subhead text-ui-danger",children:A}),e.jsx($,{variant:"neutral",className:"mt-3",onClick:s,children:"Close"})]});const R=(a,h,l={})=>e.jsxs("div",{children:[e.jsx("label",{htmlFor:`${a}-${o}`,className:Q,children:h}),e.jsx("input",{id:`${a}-${o}`,type:l.type??"text",autoComplete:l.autoComplete,inputMode:l.inputMode,value:c[a],placeholder:l.placeholder,maxLength:l.maxLength,autoCapitalize:l.upper?"characters":void 0,spellCheck:l.check?!1:void 0,onChange:y=>{const p=l.upper?y.target.value.toUpperCase():y.target.value,I=l.clean?l.clean(p):p,E=!!f(a);P(a)(I),E&&l.check&&L(K=>({...K,[a]:l.check?.(I)}))},onBlur:l.check?y=>L(p=>({...p,[a]:l.check?.(y.target.value)})):void 0,"aria-invalid":f(a)?!0:void 0,"aria-describedby":f(a)?`${a}-${o}-error`:void 0,className:j(Z,F(a))}),e.jsx(te,{id:`${a}-${o}-error`,message:f(a)})]}),V=(a,h)=>e.jsxs("div",{children:[e.jsx("label",{htmlFor:`${a}-${o}`,className:Q,children:h}),a==="gender"?e.jsx(qe,{id:`${a}-${o}`,label:"Gender",value:c.gender,options:[{value:"M",label:"Male"},{value:"F",label:"Female"}],onChange:P("gender"),invalid:!!f(a),describedBy:f(a)?`${a}-${o}-error`:void 0,className:"mt-1.5",buttonClassName:j(Z,F(a),"!mt-0")}):e.jsx(Ie,{id:`${a}-${o}`,value:c[a],onChange:P(a),invalid:!!f(a),describedBy:f(a)?`${a}-${o}-error`:void 0,className:"mt-1.5",inputClassName:j(Z,F(a),"!mt-0")}),e.jsx(te,{id:`${a}-${o}-error`,message:f(a)})]});return e.jsxs("div",{children:[e.jsxs(ee,{title:"Personal details",first:!0,children:[e.jsxs("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-3",children:[R("given_name","First name",{autoComplete:"given-name"}),R("middle_name","Middle name",{autoComplete:"additional-name",placeholder:"Optional"}),R("family_name","Last name",{autoComplete:"family-name"})]}),e.jsxs("div",{className:"mt-4 grid grid-cols-1 gap-4 sm:grid-cols-2",children:[V("gender","Gender"),e.jsx(ce,{id:`date_of_birth-${o}`,label:"Date of birth",value:c.date_of_birth,onChange:P("date_of_birth"),error:f("date_of_birth"),defaultYear:2e3,max:W,...de})]})]}),e.jsx(ee,{title:"Contact",hint:"Optional",children:e.jsxs("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2",children:[R("email","Email",{type:"email",inputMode:"email",autoComplete:"email",placeholder:"[email protected]"}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("label",{htmlFor:`phone-${o}`,className:Q,children:"Mobile number"}),e.jsxs("div",{className:"mt-1.5 flex gap-2",children:[e.jsx(Pe,{id:`phone-code-${o}`,value:B,onChange:a=>ie(a,O),error:f("phone"),inputClassName:j("h-12 w-full rounded-ui-md border bg-ui-surface text-[16px] focus:outline-none focus:ring-[3px] focus:ring-ui-accent/20",f("phone")?"!border-ui-danger":"!border-ui-line-strong/60")}),e.jsx("input",{id:`phone-${o}`,type:"tel",inputMode:"tel",autoComplete:"tel-national",maxLength:10,value:O,placeholder:"Number without country code",onChange:a=>ie(B,a.target.value.replace(/\D/g,"").slice(0,10)),"aria-invalid":f("phone")?!0:void 0,"aria-describedby":f("phone")?`phone-${o}-error`:void 0,className:j(Z,"!mt-0 min-w-0 flex-1",F("phone"))})]}),e.jsx(te,{id:`phone-${o}-error`,message:f("phone")})]})]})}),e.jsx(ee,{title:"Passport",hint:"Optional — needed for international trips",children:e.jsxs("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2",children:[R("passport_number","Passport number",{placeholder:"e.g. Z1234567",upper:!0,autoComplete:"off",maxLength:pe,clean:et,check:
1he}),e.jsx(ce,{id:`passport_expiry-${o}`,label:"Expiry date",value:c.passport_expiry,onChange:P("passport_expiry"),error:f("passport_expiry"),defaultYear:Number(W.slice(0,4))+1,min:W,...de}),V("issue_country","Issuing country"),V("nationality","Nationality")]})}),v&&e.jsx("p",{role:"alert",className:"mt-5 rounded-ui-sm bg-ui-danger-tint px-3 py-2 text-ui-footnote font-semibold text-ui-danger",children:v}),e.jsx("div",{className:"sticky -bottom-2 -mx-5 -mb-2 mt-6 border-t border-ui-line bg-ui-elevated px-5 pb-[max(12px,env(safe-area-inset-bottom))] pt-3 sm:-mx-6 sm:rounded-b-ui-xl sm:px-6 sm:pb-5",children:b?e.jsxs("div",{className:"rounded-ui-md bg-ui-danger-tint p-4",children:[e.jsxs("p",{className:"text-ui-subhead font-bold text-ui-label-primary",children:["Delete ",[t?.given_name,t?.family_name].filter(Boolean).join(" ")||"this traveler","?"]}),e.jsx("p",{className:"mt-0.5 text-ui-footnote text-ui-label-secondary",children:"Their saved details, including any passport number, are removed from your account. Past bookings are not affected."}),e.jsxs("div",{className:"mt-3 flex flex-wrap gap-2",children:[e.jsx($,{variant:"destructive",loading:z,loadingLabel:"Deleting…",onClick:()=>{ge()},children:"Delete traveler"}),e.jsx($,{variant:"neutral",disabled:z,onClick:()=>C(!1),children:"Keep"})]})]}):e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[!d&&e.jsx($,{variant:"destructive-plain",disabled:T,onClick:()=>C(!0),children:"Delete"}),e.jsxs("div",{className:"ml-auto flex items-center gap-2",children:[e.jsx($,{variant:"neutral",disabled:T,onClick:s,children:"Cancel"}),e.jsx($,{variant:"primary",loading:T,loadingLabel:"Saving…",onClick:()=>{xe()},children:d?"Add traveler":"Save changes"})]})]})})]})}const ct="rounded-ui-lg bg-ui-surface shadow-ui-1 ring-1 ring-inset ring-ui-line";function dt(){const[t,s]=x.useState(null),[n,i]=x.useState(!1),[m,d]=x.useState("");x.useEffect(()=>{const c=new AbortController;return we(c.signal).then(g=>s(g.email_enabled!==!1)).catch(()=>{c.signal.aborted||d("Couldn’t load your email preference just now.")}),()=>c.abort()},[]);const o=async()=>{if(t===null||n)return;const c=!t;s(c),i(!0),d("");try{const g=await Ce(c);s(g.email_enabled!==!1)}catch{s(!c),d("Couldn’t save that change. Please try again.")}finally{i(!1)}};return e.jsxs("section",{"aria-labelledby":"zga-email",className:`${ct} px-5 py-4`,children:[e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("h2",{id:"zga-email",className:"text-ui-title3 text-ui-label-primary",children:"Email updates"}),e.jsx("p",{id:"zga-email-desc",className:"text-ui-footnote text-ui-label-secondary",children:"Reminders about trips you searched, and personal offers. Booking confirmations always arrive."})]}),e.jsx("button",{type:"button",role:"switch","aria-checked":t===!0,"aria-labelledby":"zga-email","aria-describedby":"zga-email-desc",disabled:t===null||n,onClick:()=>{o()},className:`zg-focus-ring relative inline-flex h-[31px] w-[51px] shrink-0 items-center rounded-full transition-colors disabled:opacity-60 ${t?"bg-ui-accent":"bg-ui-sunken ring-1 ring-inset ring-ui-line"}`,children:e.jsx("span",{"aria-hidden":"true",className:`inline-block h-[27px] w-[27px] rounded-full bg-white shadow-ui-1 transition-transform ${t?"translate-x-[22px]":"translate-x-[2px]"}`})})]}),m&&e.jsx("p",{role:"alert",className:"mt-2 text-ui-footnote text-ui-danger",children:m})]})}const ut={adult:"Adult",child:"Child",infant:"Infant"},G="rounded-ui-lg bg-ui-surface shadow-ui-1 ring-1 ring-inset ring-ui-line";function mt(t){if(!t||!/^\d{4}-\d{2}/.test(t))return null;const[s,n]=t.split("-").map(Number);return new Date(Date.UTC(s,n-1,1)).toLocaleDateString(void 0,{month:"short",year:"numeric",timeZone:"UTC"})}function pt(){return e.jsx(Ve,{size:16,strokeWidth:2.4,className:"shrink-0 text-ui-label-tertiary transition-transform duration-[var(--zg-dur-1)] group-hover:translate-x-0.5"})}function ht(){return e.jsxs(se,{strokeIcon:!0,size:22,strokeWidth:1.9,children:[e.jsx("path",{d:"M3 9a2 2 0 0 0 0 6v3a1 1 0 0 0 1 1h16a1 1 0 0 0 1-1v-3a2 2 0 0 0 0-6V6a1 1 0 0 0-1-1H4a1 1 0 0 0-1 1Z"}),e.jsx("path",{d:"M14 5v2M14 11v2M14 17v2"})]})}function xt({traveler:t,onOpen:s}
1){const n=[t.given_name,t.middle_name,t.family_name].filter(Boolean).join(" ")||ze(t),i=Be(t.date_of_birth),m=t.nationality??t.issue_country,d=mt(t.passport_expiry),o=!!t.passport_expiry&&t.passport_expiry<new Date(Date.now()+183*864e5).toISOString().slice(0,10);return e.jsx("li",{children:e.jsxs("button",{type:"button",onClick:s,"aria-label":`Edit ${n}`,className:"zg-focus-ring group flex w-full items-center gap-4 px-5 py-3.5 text-left transition-colors hover:bg-ui-sunken/60",children:[e.jsx(Fe,{traveler:t,size:44}),e.jsxs("span",{className:"min-w-0 flex-1",children:[e.jsxs("span",{className:"flex min-w-0 items-center gap-2",children:[e.jsx("span",{className:"truncate text-ui-headline text-ui-label-primary",children:n}),t.is_default&&e.jsx("span",{className:"shrink-0 rounded-full bg-ui-accent-tint px-2 py-0.5 text-ui-caption text-ui-accent-text",children:"You"})]}),e.jsxs("span",{className:"flex flex-wrap items-center gap-x-1.5 text-ui-footnote text-ui-label-secondary",children:[[t.passenger_type?ut[t.passenger_type]:null,i].filter(Boolean).join(" · "),m&&e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx("span",{"aria-hidden":"true",children:"·"}),/^[A-Za-z]{2}$/.test(m)&&e.jsx("span",{"aria-hidden":"true",className:`fi fi-${m.toLowerCase()} rounded-[2px]`}),m]})]})]}),t.has_passport&&e.jsxs("span",{className:"hidden shrink-0 text-right text-ui-footnote sm:block",children:[e.jsxs("span",{className:"block font-mono text-ui-label-secondary",children:["••",t.passport_last4]}),d&&e.jsxs("span",{className:j("block text-ui-caption",o?"text-ui-danger":"text-ui-label-tertiary"),children:[o?"Expires ":"Exp ",d]})]}),e.jsx(pt,{})]})})}function gt(t){if(!t||!/^\d{4}-\d{2}/.test(t))return null;const[s,n]=t.split("-").map(Number);return new Date(Date.UTC(s,n-1,1)).toLocaleDateString(void 0,{month:"short",year:"numeric",timeZone:"UTC"})}function ft({name:t,email:s,picture:n,since:i,trips:m}){return e.jsxs("div",{className:"zg-member-card relative isolate overflow-hidden rounded-[22px] p-5 text-white sm:p-6",children:[e.jsxs("div",{className:"flex items-center gap-3.5",children:[n?e.jsx("img",{src:n,alt:"",referrerPolicy:"no-referrer",className:"h-14 w-14 shrink-0 rounded-full object-cover ring-2 ring-white/70"}):e.jsx("span",{"aria-hidden":"true",className:"flex h-14 w-14 shrink-0 items-center justify-center rounded-full bg-white/15 text-[24px] font-bold ring-2 ring-white/50",children:t.charAt(0).toUpperCase()}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("p",{className:"truncate text-[22px] font-extrabold leading-7 tracking-[-0.01em]",children:t}),s&&e.jsx("p",{className:"truncate text-[13.5px] font-medium text-white/80",children:s})]})]}),e.jsxs("div",{className:"mt-6 flex items-end justify-between gap-4 border-t border-white/20 pt-4",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-[11px] font-bold uppercase tracking-[0.14em] text-white/70",children:"Travelling since"}),e.jsx("p",{className:"zg-num text-[16px] font-extrabold",children:i??"—"})]}),e.jsxs("div",{className:"text-right",children:[e.jsx("p",{className:"text-[11px] font-bold uppercase tracking-[0.14em] text-white/70",children:"Trips"}),e.jsx("p",{className:"zg-num text-[16px] font-extrabold",children:m??"—"})]})]})]})}function ae({to:t,onClick:s,icon:n,title:i,detail:m}){const d=e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"flex h-10 w-10 items-center justify-center rounded-full bg-ui-canvas text-ui-accent-text ring-1 ring-inset ring-ui-line transition-colors group-hover:bg-ui-accent group-hover:text-white group-hover:ring-ui-accent",children:n}),e.jsx("span",{className:"mt-3 block text-ui-headline text-ui-label-primary",children:i}),e.jsx("span",{className:"mt-0.5 block truncate text-ui-footnote text-ui-label-secondary",children:m})]}),o=j(G,"zg-focus-ring group block p-4 text-left transition-[box-shadow,transform] duration-[var(--zg-dur-2)] hover:-translate-y-0.5 hover:shadow-ui-2");return t?e.jsx(ue,{to:t,className:o,children:d}):e.jsx("button",{type:"button",onClick:s,className:j(o,"w-full"),children:d})}function bt(){return e.jsxs(se,{strokeIcon:!0,size:20,strokeWidth:1.9,children:[e.jsx("circle",{cx:"9",cy:"8",r:"3.6"}),e.jsx("path",{d:"M2.5 20c0-3.6 2.9-6.5 6.5-6.5s6.5 2.9 6.5 6.5M19 8v6M16 11h6"})]})}function zt(){const{user:t,signOut:s,refreshSession:n}=me(),i=be(),m=ke(t?.uid,{refreshSession:n}),[d,o]=x.useState(0),c=Le(t?.uid,d,n),[g,_]=x.useState(null),k=()=>{Ae(),o(u=>u+1)},N=m.status==="success",S=N?m.bookings:[],T=new Date().toISOString().slice(0,10),M=u=>/cancel/i.test(`${u.booking_status??""} ${u.ticket_status??""}`),b=S.filter(u=>!M(u)),C=b.filter(u=>(Y(u.departing_at)??"")>=T).sort((u,O)=>(u.departing_at??"").localeCompare(O.departing_at??"")),z=new Set(b.filter(u=>(Y(u.departing_at)??"9999")<T).map(u=>
1u.destination).filter(Boolean)).size,U=S.map(u=>u.created_at??"").filter(Boolean).sort()[0],A=c.status==="success"?c.travelers.length:null,r=C[0],v=Se(),w=v?Te({...v.form,returnDate:v.roundTrip?v.form.returnDate:""}):null,D=w&&!w.errors&&w.params?`/flights?${w.params.toString()}`:null,L=t?.name??"Traveler",B=[{label:"Upcoming",value:N?C.length:null},{label:"Cities visited",value:N?z:null},{label:"Travelers",value:A}];return e.jsxs("div",{className:"mx-auto w-full max-w-[1120px] px-[clamp(16px,4vw,40px)] pb-16 pt-2",children:[e.jsxs("div",{className:"grid grid-cols-1 gap-6 lg:grid-cols-[340px_minmax(0,1fr)] lg:items-start",children:[e.jsxs("aside",{className:"flex flex-col gap-4 lg:sticky lg:top-[calc(var(--zg-nav-h,72px)+16px)]",children:[e.jsx(ft,{name:L,email:t?.email,picture:t?.picture,since:gt(U),trips:N?b.length:null}),e.jsx("div",{className:j(G,"grid grid-cols-3 divide-x divide-ui-line"),children:B.map(u=>e.jsxs("div",{className:"px-2 py-3.5 text-center",children:[e.jsx("p",{className:"zg-num text-ui-title2 text-ui-label-primary",children:u.value??e.jsx("span",{className:"inline-block h-6 w-7 animate-pulse rounded bg-ui-sunken align-middle","aria-hidden":"true"})}),e.jsx("p",{className:"text-ui-caption text-ui-label-secondary",children:u.label})]},u.label))}),e.jsx("button",{type:"button",onClick:()=>{s()},className:"zg-focus-ring hidden self-start rounded-full border border-ui-danger px-4 py-2 text-ui-subhead font-bold text-ui-danger transition-colors hover:bg-ui-danger-tint lg:inline-flex",children:"Sign out"})]}),e.jsxs("div",{className:"flex min-w-0 flex-col gap-6",children:[e.jsxs("section",{"aria-labelledby":"zga-next",children:[e.jsxs("div",{className:"mb-3 flex items-end justify-between gap-3 px-1",children:[e.jsx("h2",{id:"zga-next",className:"text-ui-title3 text-ui-label-primary",children:r?"Your next trip":"Plan your next trip"}),S.length>0&&e.jsx(ue,{to:"/trips",className:"zg-focus-ring rounded-full px-2 py-1 text-ui-subhead font-bold text-ui-accent-text hover:underline",children:"All trips ›"})]}),m.status==="loading"?e.jsx("div",{className:j(G,"h-[196px] animate-pulse"),"aria-busy":"true"}):r?e.jsx(He,{airlineCode:r.airline?.iata_code,airlineName:r.airline?.name,flightNumbers:r.flight_numbers.join(" + ")||null,from:{code:r.origin,city:r.origin_city,time:r.departing_at?oe(r.departing_at):null},to:{code:r.destination,city:r.destination_city,time:r.arriving_at?oe(r.arriving_at):null},dateLabel:Y(r.departing_at)?le(Y(r.departing_at)):null,dayShift:r.departing_at&&r.arriving_at?Math.max(0,$e(r.departing_at,r.arriving_at)):0,isRoundTrip:r.trip_type==="round_trip",returnDate:r.return_departing_at?le(r.return_departing_at.split("T")[0]):null,travelers:r.passenger_names[0]??null,travelerCount:r.passenger_count,cabin:Ee(r.cabin_class),departsIn:Ke(r.departing_at),status:{label:"Upcoming",tone:"info"},bookingRef:r.booking_reference,amount:r.customer_amount&&r.currency?{label:"Total paid",value:De(r.customer_amount,r.currency)}:null,onOpen:()=>i(`/trips/${encodeURIComponent(r.booking_reference)}`)}):e.jsxs("div",{className:"zg-next-empty relative isolate overflow-hidden rounded-ui-lg p-6 ring-1 ring-inset ring-ui-line sm:p-7",children:[e.jsx("p",{className:"max-w-[420px] text-ui-headline text-ui-label-primary",children:"No trips coming up"}),e.jsx("p",{className:"mt-1 max-w-[420px] text-ui-subhead text-ui-label-secondary",children:D&&v?`Pick up where you left off — ${v.form.from} → ${v.form.to}.`:"Search a route and your saved travelers fill the booking in one tap."}),e.jsx(We,{to:D??"/flights",variant:"primary",className:"mt-4",children:D?"Continue search":"Search flights"})]})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 sm:grid-cols-3",children:[e.jsx(ae,{to:"/trips",icon:e.jsx(ht,{}),title:"My Trips",detail:N?`${b.length} ${b.length===1?"booking":"bookings"}`:"E-tickets and changes"}),e.jsx(ae,{to:D??"/flights",icon:e.jsx(Me,{size:22,strokeWidth:1.9}),title:D?"Search again":"Search flights",detail:D&&v?`${v.form.from} → ${v.form.to}`:"Find your next flight"}),e.jsx(ae,{onClick:()=>_({mode:"add"}),icon:e.jsx(bt,{}),title:"Add traveler",detail:"Save their passport once"})]}),e.jsxs("section",{"aria-labelledby":"zga-travelers",className:j(G,"overflow-hidden"),children:[e.jsxs("div",{className:"flex items-center justify-between gap-3 border-b border-ui-line px-5 py-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("h2",{id:"zga-travelers",className:"text-ui-title3 text-ui-label-primary",children:["Saved travelers",A?e.jsx("span",{className:"ml-1.5 text-ui-label-tertiary",children:A}):null]}),e.jsx("p",{className:"text-ui-footnote text-ui-label-secondary",children:"Tap someone to edit their details."})]}),e.jsx($,{variant:"secondary",size:"sm",className:"shrink-0 whitespace-nowrap",onClick:()=>_({mode:"add"}),leading:e.jsx("span",{"aria-hidden":"true",className:"text-[16px] leading-none",children:"+"}),children:"Add"})]}),c.status==="loading"&&e.jsx("ul",{className:"divide-y divide-ui-line","aria-busy":"true",children:[0,1,2].map(u=>e.jsxs("li",{className:"flex items-center gap-4 px-5 py-4",children:[e.jsx("span",{className:"h-11 w-11 animate-pulse rounded-full bg-ui-sunken"}),e.jsx("span",{className:"h-4 w-40 animate-pulse rounded bg-ui-sunken"})]},u))}),c.status==="error"&&e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3 p-5",children:[e.jsx("p",{className:"text-ui-subhead text-ui-label-secondary",children:"Couldn’t load your saved travelers just now."}),e.jsx($,{variant:"neutral",size:"sm",onClick:k,leading:e.jsx(Xe,{size:14}),children:"Reload"})]}),c.status==="success"&&c.travelers.length===0&&e.jsxs("div",{className:"p-8 text-center",children:[e.jsx("p",{className:"text-ui-headline text-ui-label-primary",children:"No saved travelers yet"}),e.jsx("p",{className:"mx-auto mt-1 max-w-[420px] text-ui-subhead text-ui-label-secondary",children:"Add the people you travel with, or they’ll appear here after you book for them."})]}),c.status==="success"&&c.travelers.length>
10&&e.jsx("ul",{className:"max-h-[min(520px,60vh)] divide-y divide-ui-line overflow-y-auto overscroll-contain","aria-label":"Saved travelers",children:c.travelers.map(u=>e.jsx(xt,{traveler:u,onOpen:()=>_({mode:"edit",traveler:u})},u.profile_id))})]}),e.jsx(dt,{}),e.jsx("button",{type:"button",onClick:()=>{s()},className:"zg-focus-ring block min-h-[52px] w-full rounded-ui-lg bg-ui-surface text-center text-ui-headline text-ui-danger shadow-ui-1 ring-1 ring-inset ring-ui-danger lg:hidden",children:"Sign out"})]})]}),e.jsx(Ge,{open:g!==null,onClose:()=>_(null),title:g?.mode==="edit"?"Edit traveler":"Add a traveler",description:g?.mode==="edit"?"Changes apply to future bookings. Tickets already issued are not changed.":"Name exactly as it appears on the passport or ID.",maxWidth:680,children:g&&e.jsx(ot,{traveler:g.mode==="edit"?g.traveler:null,onClose:()=>_(null),onSaved:k,onDeleted:k},g.mode==="edit"?g.traveler.profile_id:"new")})]})}export{ft as MemberCard,xt as TravelerRow,zt 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.