const DAYS=[['Mon',12],['Tue',13],['Wed',14],['Thu',15],['Fri',16],['Sat',17],['Sun',18]].map(([d,n],i)=>({d,n,we:i>4})); const ALL_SLOTS=(()=>{const a=[];for(let h=7;h<=19;h++){for(const m of[0,30]){if(h===7&&m===0)continue;if(h===19&&m===30){a.push('19:30');break}a.push(String(h).padStart(2,'0')+':'+(m?'30':'00'))}}return a})(); function slotsFor(clin,day){if(clin==='zuzanna'&&day<2)return[];const seed=(clin.length*7+day*13)%5;return ALL_SLOTS.filter((_,i)=>(i+seed)%3===0||(i+seed)%7===0)} const SESSION_TYPES={first:{t:'Introduction',min:()=>PD.PRICING.introMinutes,mult:0},continue:{t:'Session',min:()=>PD.PRICING.sessionMinutes,mult:1},debrief:{t:'Energy Load Index debrief',min:()=>25,mult:0.5},cofounder:{t:'Co-founder session',min:()=>PD.PRICING.coFounderMinutes,mult:PD.PRICING.coFounderMultiplier}}; const sessionLabel=k=>{const x=SESSION_TYPES[k]||SESSION_TYPES.continue;return x.t+', '+x.min()+' minutes'}; const sessionPrice=(k,c)=>{const x=SESSION_TYPES[k]||SESSION_TYPES.continue;return x.mult?PD.priceLabel(c,x.mult):'Free'}; function Booking({q}){const[s,set]=useStore();const returning=!!(s.booking||q.clin); const[step,setStep]=useState(+q.step||(q.type?3:1));const[type,setType]=useState(q.type||'first');const[clin,setClin]=useState(q.clin||(+q.step>=3?'steven':null)); const[day,setDay]=useState(q.soon?0:0);const[slot,setSlot]=useState(q.soon?'16:30':(+q.step>=3&&(!q.clin||q.clin==='steven')?'11:00':null));const[lang,setLang]=useState('English');const[phone,setPhone]=useState('+351 ');const[modal,setModal]=useState(+q.step===4);const[co2,setCo2]=useState('');const[done,setDone]=useState(false); useEffect(()=>{if(q.step)setStep(+q.step)},[q.step]); const c=clin?PD.clin(clin):null; const slots0=c?(q.soon&&day===0?['16:30','17:00',...slotsFor(clin,day).filter(x=>x>'17:00')]:slotsFor(clin,day)):[];const slots=type==='cofounder'?slots0.filter((t,i)=>i%2===0&&t<='18:00'):slots0;const coOk=type!=='cofounder'||/\S+@\S+\.\S+/.test(co2); const steps=['Choose session','Clinician','Time','Confirm']; const Crumb=()=>; const phoneOk=/^\+\d{1,3}\s?\d[\d\s]{7,}$/.test(phone.trim()); const confirm=()=>{const dd=DAYS[day];set({booking:{clin,type,date:`${dd.d} ${dd.n} Oct 2026`,time:slot,lang,co2:type==='cofounder'?co2:undefined}});setModal(false);setDone(true)}; if(done){const b=store.s.booking;return
A confirmation is in your inbox. You will find this session under My sessions.
{SESSION_TYPES[type].t} with {c.name}
{c.bio?c.bio.split('.')[0]+'.':c.works} Read {c.id==='zuzanna'?'her':c.rep?'the':'his'} full profile.
{b.date} at {b.time} (Europe/Lisbon), {SESSION_TYPES[type].min()} minutes
{type==='cofounder'&&b.co2&&Invitation sent to {b.co2}
}Language: {b.lang}
{type==='first'?'Cost to you: €0. The introduction is free.':'Your share: shown before you confirm.'}
If it does not fit, the next introduction is on us.
Need to move it? Reschedule or cancel free until 24 hours before.
Take the Energy Load Index before your first paid session.
We measure it again after your sixth. You see the change. Your investor never does.
Not sure? Start with the first one.
Your three matches from the intake.
{cc.city}
{m.r1}
{m.r2}
Browse the whole network instead
>} {step===3&&c&&<>Times shown are your clinician's actual availability.
Need another language? Tell us and we will look.
A mobile number lets us send a reminder two hours before. It is used for nothing else, and it never reaches your fund.
They receive their own invitation.
{type==='first'?'The introduction is free.':'Price: '+sessionPrice(type,c)+'. Your share is shown before you confirm.'} If it does not fit, the next introduction is on us.