your-ai-workflow-firebase-os 2.0.8 → 2.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{Assets-Dd_96avv.js → Assets-COH4Ji57.js} +5 -5
- package/dist/{Assets-CBBNIHrw.cjs → Assets-D7fDckSi.cjs} +1 -1
- package/dist/{Attachments-C6QrTcNt.cjs → Attachments-BMuQ0CD4.cjs} +1 -1
- package/dist/{Attachments-YyjQmhBx.js → Attachments-Co1UkdWB.js} +2 -2
- package/dist/{Billing-B6f49cGH.cjs → Billing-DkuJdls5.cjs} +1 -1
- package/dist/{Billing-BZafAizg.js → Billing-kk4ZMd3z.js} +4 -4
- package/dist/{BookingCalendar-DYsA71vl.cjs → BookingCalendar-BcvJiyaq.cjs} +1 -1
- package/dist/{BookingCalendar-_xoRa2tL.js → BookingCalendar-Bej__mIs.js} +1 -1
- package/dist/{Button-DSldWACF.js → Button-BGN6q7lY.js} +1 -1
- package/dist/{Button-PyTaaoyu.cjs → Button-Ccy4wFZ1.cjs} +1 -1
- package/dist/{ConfirmModal-CQ73WYUg.cjs → ConfirmModal-BUNtss4a.cjs} +1 -1
- package/dist/{ConfirmModal-C1dM-bzk.js → ConfirmModal-BW9e6Y7d.js} +3 -3
- package/dist/{ContactPopup-D5Hh0bfE.cjs → ContactPopup-D8aSSlmS.cjs} +1 -1
- package/dist/{ContactPopup-CL4AMwK9.js → ContactPopup-Fs7wzrOX.js} +7 -7
- package/dist/{CopyLink-BnYpVy6H.cjs → CopyLink-C5lKLyOU.cjs} +1 -1
- package/dist/{CopyLink-rLr_5eNM.js → CopyLink-CNjDLzOl.js} +2 -2
- package/dist/{DashboardNav-B0G943ux.js → DashboardNav-CEd8gGPm.js} +3 -3
- package/dist/{DashboardNav-DOl9gJuu.cjs → DashboardNav-GgEUpyTa.cjs} +1 -1
- package/dist/{EmailAdmin-CWHMMybh.cjs → EmailAdmin-d_gWd48U.cjs} +1 -1
- package/dist/{EmailAdmin-humrSTzI.js → EmailAdmin-pbQ-f9Ge.js} +9 -9
- package/dist/{EventCard-CrPswwyG.js → EventCard-BSGLYD64.js} +2 -2
- package/dist/{EventCard-6eCfvOA-.cjs → EventCard-DAsGsicK.cjs} +1 -1
- package/dist/{FileViewerPopup-DQmhXMSg.cjs → FileViewerPopup-CkLUYCNo.cjs} +1 -1
- package/dist/{FileViewerPopup-Dnl3td2o.js → FileViewerPopup-gqhRT22v.js} +2 -2
- package/dist/{FormNote-BWGLs9lx.js → FormNote-DJ9HBokL.js} +1 -1
- package/dist/{FormNote-CX2rSBDB.cjs → FormNote-DP0GK9ya.cjs} +1 -1
- package/dist/{FormsAdmin-Tg20B0iA.cjs → FormsAdmin-5KTTp6zo.cjs} +1 -1
- package/dist/{FormsAdmin-CHwmKnYU.js → FormsAdmin-BNI63vEk.js} +9 -9
- package/dist/{Inbox-Cgq4MALU.js → Inbox-D9Y5K8Se.js} +9 -9
- package/dist/{Inbox-BPwIiThg.cjs → Inbox-DjslBakx.cjs} +1 -1
- package/dist/{Loader-DP_dL5qC.js → Loader-CVoz1Zf0.js} +1 -1
- package/dist/{Loader-p3eNQDUU.cjs → Loader-QHqQsXLr.cjs} +1 -1
- package/dist/{ManagePlanButton-BRW7Sevd.cjs → ManagePlanButton-Buwfs2bU.cjs} +1 -1
- package/dist/{ManagePlanButton-CNLCxK-o.js → ManagePlanButton-CE4uyh_7.js} +2 -2
- package/dist/{MyBookings-C_pqsSEk.js → MyBookings-B4DndHV6.js} +7 -7
- package/dist/{MyBookings-BC5sn_fE.cjs → MyBookings-CkEioQIj.cjs} +1 -1
- package/dist/{PageTitle-DFGW71q8.js → PageTitle-DCoUQWw6.js} +2 -2
- package/dist/{PageTitle-BWmE74WQ.cjs → PageTitle-DQkvCB11.cjs} +1 -1
- package/dist/PagesAdmin-D0qgoZtW.js +3 -0
- package/dist/{PagesAdmin-jjnDLYmF.js → PagesAdmin-DzLJWKBJ.js} +21 -21
- package/dist/PagesAdmin-KUxCI1Mr.cjs +1 -0
- package/dist/{PagesAdmin-BZZ3by92.cjs → PagesAdmin-YdYgmuEB.cjs} +1 -1
- package/dist/{PaymentsAdmin-CI0zXraR.cjs → PaymentsAdmin-B5l-f0mp.cjs} +1 -1
- package/dist/{PaymentsAdmin-DeBMmFFo.js → PaymentsAdmin-C3cEOeIs.js} +15 -15
- package/dist/{Popup-DmPEk98h.js → Popup-Bi63lzoS.js} +1 -1
- package/dist/{Popup-nq7YNM4N.cjs → Popup-COnHpbrY.cjs} +1 -1
- package/dist/{ProviderMark-DJ5mYjYn.cjs → ProviderMark--adeeajP.cjs} +1 -1
- package/dist/{ProviderMark-CAeOnBsB.js → ProviderMark-BvEMlZAm.js} +1 -1
- package/dist/{PublishApp-mMMwf_in.js → PublishApp-B9Fo6xN0.js} +7 -7
- package/dist/{PublishApp-DI96gX9b.cjs → PublishApp-Bc82Ijkq.cjs} +1 -1
- package/dist/{Said-DAD7Ctp_.js → Said-BvSRaEfZ.js} +1 -1
- package/dist/{Said-DlJOjNMN.cjs → Said-W3KFi5uX.cjs} +1 -1
- package/dist/{ScheduleAdmin-dWj_N_tf.cjs → ScheduleAdmin-Dh_hW6p4.cjs} +1 -1
- package/dist/{ScheduleAdmin-C4W8Ls0D.js → ScheduleAdmin-bk3GgxKP.js} +14 -14
- package/dist/{SchedulePicker-CwKId9JF.cjs → SchedulePicker-CN0755Ek.cjs} +1 -1
- package/dist/{SchedulePicker-BOSJEcfL.js → SchedulePicker-DO4PewPJ.js} +2 -2
- package/dist/{Setup-DcZzh6Xd.cjs → Setup-R4r6_tbV.cjs} +1 -1
- package/dist/{Setup-NOvtplUS.js → Setup-_G-s5y5Q.js} +3 -3
- package/dist/{SetupPayments-DrXK0LQa.js → SetupPayments-CkolcOtv.js} +5 -5
- package/dist/{SetupPayments-CZ0KqXdR.cjs → SetupPayments-CuFk9REC.cjs} +1 -1
- package/dist/{SignInAdmin-CwIUAJrv.cjs → SignInAdmin-B1yLLaQu.cjs} +1 -1
- package/dist/{SignInAdmin-Cb65ChHL.js → SignInAdmin-BLEn0rId.js} +9 -9
- package/dist/{SupportBar-528kXe-Z.js → SupportBar-DI_XbEsG.js} +4 -4
- package/dist/{SupportBar-CNVXSYwT.cjs → SupportBar-DLWruzQb.cjs} +1 -1
- package/dist/{SystemTabContent-EegzTuLd.cjs → SystemTabContent-BWhRHoXx.cjs} +1 -1
- package/dist/{SystemTabContent-C4azXKMs.js → SystemTabContent-CMyT7mDN.js} +2 -2
- package/dist/{TemplateDrive-XDRPkxIj.cjs → TemplateDrive-BJN-ReA_.cjs} +1 -1
- package/dist/{TemplateDrive-CfPXKMKX.js → TemplateDrive-DNBwL0oy.js} +10 -10
- package/dist/{ThemeAdmin-XLbC9fX7.js → ThemeAdmin-Cnqefrz6.js} +6 -6
- package/dist/ThemeAdmin-CoE_c5-P.cjs +1 -0
- package/dist/ThemeAdmin-DI7QaZ-0.js +2 -0
- package/dist/{ThemeAdmin-BrEozdpZ.cjs → ThemeAdmin-DkgmjW3g.cjs} +1 -1
- package/dist/TimeZoneField-Ckn1pKAL.cjs +11 -0
- package/dist/{TimeZoneField-Dv389mAe.js → TimeZoneField-oIMwb5_X.js} +119 -107
- package/dist/{TransactionsAdmin-X-NjI4NB.js → TransactionsAdmin-Brs-CEcG.js} +11 -11
- package/dist/{TransactionsAdmin-DgsG629u.cjs → TransactionsAdmin-C5wQRR1g.cjs} +1 -1
- package/dist/{Trouble-qjWYeKzC.js → Trouble-CtFq7tjk.js} +1 -1
- package/dist/{Trouble-DokPNHQZ.cjs → Trouble-KQZyf6aY.cjs} +1 -1
- package/dist/{Users-BEjl_Vjc.cjs → Users-B16L9cKI.cjs} +1 -1
- package/dist/{Users-BUGb7-Kz.js → Users-CbI4K_Le.js} +15 -15
- package/dist/{VideoPlayer-BVOkrJBR.cjs → VideoPlayer-CggwpVXH.cjs} +1 -1
- package/dist/{VideoPlayer-DB0oz6lM.js → VideoPlayer-QI1Jc3bS.js} +1 -1
- package/dist/appIcons-C90OKlV5.cjs +130 -0
- package/dist/{appIcons-CUXAX_gJ.js → appIcons-CCArfCDe.js} +761 -735
- package/dist/{arrivalRoads-BZk39p8Z.js → arrivalRoads-CGXm9Ntm.js} +0 -0
- package/dist/{arrivalRoads-CD7pt03E.cjs → arrivalRoads-Cc6AZM-d.cjs} +0 -0
- package/dist/{bookingPages-BxqkyZ-M.js → bookingPages-BFSY3Riv.js} +1 -1
- package/dist/{bookingPages-2fn9xPiA.cjs → bookingPages-Dx1ViiwW.cjs} +1 -1
- package/dist/{contentFallback-C6xLwXTs.js → contentFallback-BGGpI1Ts.js} +2 -2
- package/dist/{contentFallback-DLm_iHo9.cjs → contentFallback-DVCrIUvK.cjs} +1 -1
- package/dist/{email-DxxovRtf.js → email-PBHbXXgR.js} +1 -1
- package/dist/{email-DD48BP42.cjs → email-Sya6gl4F.cjs} +1 -1
- package/dist/lib/basket.d.ts +29 -9
- package/dist/lib/recordPrice.d.ts +1 -1
- package/dist/{notices-Cwon5Q0Y.cjs → notices-CKm9-Pqt.cjs} +1 -1
- package/dist/{notices-C4yqYzBw.js → notices-CysS7BLF.js} +1 -1
- package/dist/{ownerMail-CGmDk7aP.cjs → ownerMail-BS9SjJ2u.cjs} +1 -1
- package/dist/{ownerMail-Chzy5Ehy.js → ownerMail-DepG5-Qw.js} +2 -2
- package/dist/{pageFiles-BClshvXs.cjs → pageFiles-Cn0YQ4Ur.cjs} +1 -1
- package/dist/{pageFiles-D-GYqRgZ.js → pageFiles-ZFPSCDZz.js} +1 -1
- package/dist/{paidInFull-KuStok9_.cjs → paidInFull-CZywIs-V.cjs} +1 -1
- package/dist/{paidInFull-D14Eh0QV.js → paidInFull-mBOh9iwN.js} +1 -1
- package/dist/{paidSessions-Cr_93LGa.js → paidSessions-B8e5RHi4.js} +7 -7
- package/dist/{paidSessions-QXv7SHeb.cjs → paidSessions-D-zHC4oG.cjs} +1 -1
- package/dist/{people-D8nPPMlM.cjs → people-BwWVVLfy.cjs} +1 -1
- package/dist/{people-sk2DcHPi.js → people-Wk2opW4G.js} +1 -1
- package/dist/{publishSteps-DB1Hxr6H.js → publishSteps-Cf5pSB_H.js} +1 -1
- package/dist/{publishSteps-CaZRpC3C.cjs → publishSteps-DvWlF0p_.cjs} +1 -1
- package/dist/{recordLock-Dnz61J-_.js → recordLock-CMOiezNC.js} +1 -1
- package/dist/{recordLock-CLUp3QNh.cjs → recordLock-CiulizO1.cjs} +1 -1
- package/dist/{recordsKey-R5BjLoGQ.cjs → recordsKey-C4E2vOti.cjs} +1 -1
- package/dist/{recordsKey-DHJJWWOo.js → recordsKey-Cd216nq1.js} +2 -2
- package/dist/{registrationFields-COv8jW4n.cjs → registrationFields-DHHTptcl.cjs} +1 -1
- package/dist/{registrationFields-CeTZSerx.js → registrationFields-DdHoMPAQ.js} +1 -1
- package/dist/renderer.cjs.js +1 -1
- package/dist/renderer.es.js +1 -1
- package/dist/{roles-5juCr5sY.cjs → roles-BBDIJzox.cjs} +1 -1
- package/dist/{roles-hzcMnn_M.js → roles-DiwP6-WQ.js} +3 -3
- package/dist/{scheduleData-BpkfnBjP.cjs → scheduleData-BXjNXVHY.cjs} +1 -1
- package/dist/{scheduleData-BLCUm84s.js → scheduleData-DR6A-Q7Z.js} +1 -1
- package/dist/server.cjs.js +1 -1
- package/dist/server.es.js +1 -1
- package/dist/{serviceStatus-5sk8MPjW.js → serviceStatus-C9izcuQz.js} +2 -2
- package/dist/{serviceStatus-1pGLLilF.cjs → serviceStatus-Cde96_OO.cjs} +1 -1
- package/dist/{serviceSwitches-BWnZBooS.js → serviceSwitches-CZHwvVfP.js} +1 -1
- package/dist/{serviceSwitches-Do_pkFCu.cjs → serviceSwitches-mhJbQBrV.cjs} +1 -1
- package/dist/vite.cjs.js +1 -1
- package/dist/vite.es.js +1 -1
- package/dist/your-ai-workflow-firebase-os.cjs.js +8 -8
- package/dist/your-ai-workflow-firebase-os.css +1 -1
- package/dist/your-ai-workflow-firebase-os.es.js +358 -316
- package/package.json +1 -1
- package/src/index.css +41 -6
- package/dist/PagesAdmin-B-XopEi9.js +0 -3
- package/dist/PagesAdmin-nL5ZltFn.cjs +0 -1
- package/dist/ThemeAdmin-CwCiTp2I.js +0 -2
- package/dist/ThemeAdmin-Db5edTYj.cjs +0 -1
- package/dist/TimeZoneField-zR8N2Fj0.cjs +0 -11
- package/dist/appIcons-BNovDw6_.cjs +0 -130
|
@@ -1 +1 @@
|
|
|
1
|
-
require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-zR8N2Fj0.cjs`),t=require(`./schedule-BAea6q8_.cjs`),n=require(`./chevron-down-lyDK1rfL.cjs`),r=require(`./bookingHold-DhS-tuuC.cjs`);let i=require(`react`),a=require(`firebase/firestore`);var o={name:`calendar-check`,size:24,node:[[`path`,{d:`M8 2v3`,key:`1ioesn`}],[`path`,{d:`M16 2v3`,key:`otl347`}],[`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`2`,key:`h1oib`}],[`path`,{d:`M3 9h18`,key:`1pudct`}],[`path`,{d:`m9 15 2 2 4-4`,key:`1grp1n`}]]};o.node;var s=n.n(o),c=e=>e?.kind===`link`?`link`:`schedule`,l=e=>e?.kind!==`schedule`&&e?.kind!==`link`,u=()=>`l_${Date.now().toString(36)}${Math.random().toString(36).slice(2,6)}`,d=()=>`s_${Date.now().toString(36)}${Math.random().toString(36).slice(2,6)}`,f=(e,n)=>({id:e,scheduleId:n.id,memberId:n.memberId,memberName:n.memberName,name:``,description:``,slotMinutes:30,horizonDays:30,noticeHours:12,questions:t.$(),paymentId:``,notifyOwner:!0,confirmBooker:!0,enabled:!0}),p=(e,t,n)=>{let r=typeof e==`number`?e:Number(e);return!Number.isFinite(r)||r<0||n&&!n.includes(r)?t:r},m=(e,n)=>({id:e,scheduleId:String(n?.scheduleId||``),memberId:String(n?.memberId||``),memberName:String(n?.memberName||``),name:String(n?.name||``),description:String(n?.description||``),slotMinutes:p(n?.slotMinutes,30,t.b.map(e=>Number(e.value))),horizonDays:p(n?.horizonDays,30),noticeHours:p(n?.noticeHours,12),questions:t.Nt(n?.questions),paymentId:String(n?.paymentId||``),notifyOwner:n?.notifyOwner!==!1,confirmBooker:n?.confirmBooker!==!1,enabled:n?.enabled===!0,createdAt:typeof n?.createdAt==`number`?n.createdAt:void 0,updatedAt:typeof n?.updatedAt==`number`?n.updatedAt:void 0});function h(e,t){return t?{...t,id:e.id,scheduleId:t.id,memberId:t.memberId,memberName:e.memberName||t.memberName,name:e.name,description:e.description,slotMinutes:e.slotMinutes,horizonDays:e.horizonDays,noticeHours:e.noticeHours,questions:e.questions,paymentId:e.paymentId,notifyOwner:e.notifyOwner,confirmBooker:e.confirmBooker,enabled:e.enabled,createdAt:e.createdAt,updatedAt:e.updatedAt,joined:!0}:null}function g(e){let t=new Map(e.schedules.map(e=>[e.id,e])),n=new Set(e.legacyIds),r=e.schedules.filter(e=>n.has(e.id));for(let n of e.links){let e=h(n,t.get(n.scheduleId));e&&r.push(e)}return r.sort((e,t)=>(e.createdAt||0)-(t.createdAt||0)||e.id.localeCompare(t.id))}var _=e=>e.name.trim()||t.O(e),v=(e,n)=>n?`${_(e)} — ${t.Yt(e.slotMinutes)} · ${t.ut(n)}`:`${_(e)} — the hours it was booked in are gone`,ee=(e,n)=>{let r=n?h(e,n):null;return r&&t.P(r)?{state:`saved`,label:`Bookable`}:{state:`off`,label:e.enabled?`In progress`:`Turned off`}};function y(e,n){if(!n)return`The hours this link was booked in are gone — pick another set.`;let r=h(e,n);return r?t.Rt({...r,enabled:!0}):`The hours this link was booked in are gone — pick another set.`}function b(e,n=`Working hours`){let r=[],i=[],a=new Map;for(let o of e){let e=[o.memberId,o.timeZone,JSON.stringify(o.days),JSON.stringify(o.blocked)].join(`|`),s=a.get(e);s||(s={...t.M(d(),o.memberId,o.memberName,o.timeZone),name:n,days:o.days,blocked:o.blocked,enabled:!0,createdAt:o.createdAt},a.set(e,s),r.push(s)),i.push({...f(o.id,s),memberName:o.memberName,name:o.name,description:o.description,slotMinutes:o.slotMinutes,horizonDays:o.horizonDays,noticeHours:o.noticeHours,questions:o.questions,paymentId:o.paymentId,notifyOwner:o.notifyOwner,confirmBooker:o.confirmBooker,enabled:o.enabled,createdAt:o.createdAt})}return{schedules:r,links:i}}var x=e=>{let{id:t,...n}=e;return{...n,kind:`link`}},S=e=>({kind:`schedule`,memberId:e.memberId,memberName:e.memberName,name:e.name,timeZone:e.timeZone,days:e.days,blocked:e.blocked,enabled:!0,createdAt:e.createdAt||Date.now()}),C=e=>e.entryId?`${e.entryId}__${e.start}`:e.id;function w(e){let t=e.filter(e=>!e.cancelled),n=t.length?t:e;return{copyIds:e.map(e=>e.id),pending:n.some(e=>e.pending),partySize:n.length,partyAccepted:n.filter(e=>!e.pending).length}}function T(e){let t=new Map;for(let n of e){if(n.own)continue;let e=C(n),r=t.get(e);r?r.push(n):t.set(e,[n])}let n=new Map;for(let e of t.values()){let t=w(e);for(let r of e)n.set(r.id,t)}return n}var E=5*6e4;function D(e,n,r){let i=new Set(n.map(e=>e.id));return e.filter(e=>i.has(t.qt(e.memberId,e.start))?!1:(e.createdAt||0)<r-E)}var O=`Not paid — the time was let go`;function k(e,t,n,r){return e.cancelled||!e.holdUntil||!e.paymentSession||!t||t.paid||t.status!==`expired`||e.holdUntil>r&&n.has(e.id)?e:{...e,cancelled:!0,cancelledAt:e.holdUntil,cancelReason:O,cancelledSide:`booker`}}var te=(e,n=``)=>({id:t.qt(e.memberId,e.start),memberId:e.memberId,memberName:n,scheduleId:``,scheduleName:``,own:!1,title:``,color:``,paymentId:``,paymentSession:``,cancelled:!1,cancelledAt:0,cancelReason:``,cancelledBy:``,cancelledSide:``,cancelledByUid:``,pending:!1,acceptedAt:0,heldOnly:!0,copyIds:[],partySize:0,partyAccepted:0,start:e.start,end:e.end,timeZone:``,name:``,email:``,answers:{},formId:``,entryId:``,uid:``,createdAt:e.createdAt||0}),ne={schedules:[],links:[],legacyIds:[]};function A(){let[e,t]=(0,i.useState)({loading:!1,docs:ne});return(0,i.useEffect)(()=>{},[]),e}function re(){let{loading:e,docs:t}=A();return{loading:e,schedules:(0,i.useMemo)(()=>g(t),[t])}}function ie(){let{loading:e,docs:t}=A();return{loading:e,schedules:t.schedules}}function ae(){let{loading:e,docs:n}=A();return{loading:e,schedules:(0,i.useMemo)(()=>{let e=g(n),r=new Set(e.map(e=>e.id));return[...e,...n.schedules.filter(e=>!r.has(e.id)&&t.P(e))]},[n])}}function oe(e){let[t,n]=(0,i.useState)({id:``,schedule:null});return(0,i.useEffect)(()=>{if(!e)return;let t=!1;return se(e).then(r=>{t||n({id:e,schedule:r})}).catch(()=>{t||n({id:e,schedule:null})}),()=>{t=!0}},[e]),e?t.id===e?{loading:!1,schedule:t.schedule}:{loading:!0,schedule:null}:{loading:!1,schedule:null}}async function se(n){let r=await(0,a.getDoc)((0,a.doc)(e.ui,t.y,n));if(!r.exists())return null;let i=r.data();if(c(i)!==`link`){let e=t.Pt(r.id,i);return l(i)?e:{...e,name:``}}let o=m(r.id,i);if(!o.scheduleId)return null;let s=await(0,a.getDoc)((0,a.doc)(e.ui,t.y,o.scheduleId));return s.exists()?h(o,t.Pt(s.id,s.data())):null}async function ce(n){if(n.joined)return console.error(`Refused to save a joined bookable as one schedule`,n.id),`That meeting is a booking link on a schedule — change the link or the schedule, not the two at once.`;try{return await(0,a.setDoc)((0,a.doc)(e.ui,t.y,n.id),{...S(n),updatedAt:Date.now()}),null}catch(e){return console.error(`Could not save the schedule`,e),`The hours could not be saved — make sure you are signed in and that this schedule is yours, then try again.`}}async function le(n){try{return await(0,a.setDoc)((0,a.doc)(e.ui,t.y,n.id),{...x(n),updatedAt:Date.now()}),null}catch(e){return console.error(`Could not save the booking link`,e),`The link could not be saved — make sure you are signed in and that this schedule is yours, then try again.`}}async function ue(n){try{return await(0,a.deleteDoc)((0,a.doc)(e.ui,t.y,n)),null}catch(e){return console.error(`Could not remove the booking link`,e),`It could not be removed — make sure you are signed in and that this link is yours, then try again.`}}async function de(n){if(!n.length)return null;let{schedules:r,links:i}=b(n);try{let n=Date.now();for(let i of r)await(0,a.setDoc)((0,a.doc)(e.ui,t.y,i.id),{...S(i),updatedAt:n});for(let r of i)await(0,a.setDoc)((0,a.doc)(e.ui,t.y,r.id),{...x(r),updatedAt:n});return null}catch(e){return console.error(`Could not split the older schedules into hours and links`,e),`Your older schedules could not be tidied into hours and booking links — make sure you are signed in, then reload the screen.`}}async function fe(n){try{return await(0,a.deleteDoc)((0,a.doc)(e.ui,t.y,n)),null}catch(e){return console.error(`Could not remove the schedule`,e),`It could not be removed — make sure you are signed in and that this schedule is yours, then try again.`}}var pe=e=>e.name.trim()||e.email.split(`@`)[0]||``;function j(){let[t,n]=(0,i.useState)({loading:!0,members:[]});return(0,i.useEffect)(()=>{let t=e.Zr(`user_profiles/team`,()=>(0,a.query)((0,a.collection)(e.ui,`user_profiles`),(0,a.where)(`role`,`in`,[`internal`,`admin`])),e=>{let t=[];e.forEach(e=>{let n=e.data()||{},r=n.role===`admin`||n.role===`internal`?n.role:null;!r||n.inactive===!0||t.push({id:e.id,name:String(n.displayName||``),email:String(n.email||``),role:r})}),t.sort((e,t)=>(e.name||e.email).localeCompare(t.name||t.email)),n({loading:!1,members:t})},()=>n({loading:!1,members:[]}));return()=>t()},[]),t}function M(n,o,s={}){let c=s.keepOpen===!0,[l,u]=(0,i.useState)([]),d=(n||[]).slice().sort().join(`,`),[f]=(0,i.useState)(()=>Date.now()),p=o instanceof Date&&!Number.isNaN(o.getTime())?o.getTime():f,m=new Date(Math.floor(p/6e4)*6e4).toISOString();return(0,i.useEffect)(()=>{if(!d)return;let n=new Set(d.split(`,`)),i=new Date(Date.parse(m)-I).toISOString(),o=(0,a.onSnapshot)((0,a.query)((0,a.collection)(e.ui,t.x),(0,a.where)(`start`,`>=`,i)),e=>{let t=[];e.forEach(e=>{let i=e.data()||{},a=String(i.memberId||``);if(!n.has(a))return;let o={memberId:a,start:String(i.start||``),end:String(i.end||``),createdAt:typeof i.createdAt==`number`?i.createdAt:0};if(F(o)){if(r.l(i,Date.now())){if(!c)return;o.open=!0}o.end>=m&&t.push(o)}}),u(t)},()=>u([]));return()=>o()},[d,m,c]),d?l:N}var N=[],P=/^\d{4}-\d{2}-\d{2}T/,F=e=>P.test(e.start)&&P.test(e.end)&&!Number.isNaN(Date.parse(e.start))&&!Number.isNaN(Date.parse(e.end)),I=4*36e5,L=15*6e4,R=`taken`,z=`That time was just taken — pick another.`,B=`The time could not be saved — check your connection and try again.`;function me(e){let n=Date.parse(e.start),r=Date.parse(e.end),i=Math.ceil((n-I)/L)*L,a=[];for(let n=i;n<r;n+=L)a.push(t.qt(e.memberId,new Date(n).toISOString()));return a}var V=class extends Error{ids;constructor(e){super(`ask the server`),this.ids=e}};async function he(n,i,o){let s=t.qt(n.memberId,n.start);await(0,a.runTransaction)(e.ui,async c=>{let l=(0,a.doc)(e.ui,t.x,s),u=me(n).filter(e=>e!==s),[d,...f]=await Promise.all([c.get(l),...u.map(n=>c.get((0,a.doc)(e.ui,t.x,n)))]),p=Date.now(),m=[],h=``;if(d.exists()){let e=d.data()||{};if(!r.l(e,p))throw Error(R);h=r.m(e)||o.get(s)||``,h||m.push(s)}if(f.forEach((e,i)=>{if(!e.exists())return;let a=e.data()||{};if(t.Dt({start:String(a.start||``),end:String(a.end||``)},n)){if(!r.l(a,p))throw Error(R);!r.m(a)&&!o.has(u[i])&&m.push(u[i])}}),m.length)throw new V(m);c.set(l,{memberId:n.memberId,start:n.start,end:n.end,createdAt:Date.now(),...i?{holdUntil:i}:{},...h?{freed:h}:{}})})}var ge=e=>e?.code===`permission-denied`;async function H(t,n){let r=new Map;for(let i=0;i<3;i+=1)try{return await he(t,n,r),{refused:null}}catch(t){if(t instanceof V){for(let n of t.ids){let t=await e.kn(n);if(typeof t==`string`)return{refused:B};if(t.state===`free`){r.set(n,t.pass);continue}if(t.state!==`gone`)return t.state===`paid`&&await W({[n]:t.pass},`paid`),{refused:z}}continue}return t?.message===R?{refused:z}:(console.error(`Could not claim the time`,t),{refused:B,rules:ge(t)})}return{refused:z}}async function U(e){return(await H(e,0)).refused}async function _e(e,t){let n=await H(e,t);if(!n.refused)return{holdUntil:t};if(!n.rules||!t)return{error:n.refused};let r=await H(e,0);return r.refused?{error:r.refused}:{holdUntil:0}}async function W(n,i){let o=[],s=[];return await Promise.all(Object.entries(n).map(async([n,c])=>{if(!n||!c)return;let l=(0,a.doc)(e.ui,t.x,n);try{await(0,a.setDoc)(l,{[i]:c},{merge:!0}),o.push(n);return}catch{}try{let e=await(0,a.getDoc)(l),t=e.exists()?e.data()||{}:null;!t||(i===`paid`?r.u(t):r.m(t))?o.push(n):s.push(n)}catch{s.push(n)}})),{written:o,refused:s}}async function G(n){try{await(0,a.deleteDoc)((0,a.doc)(e.ui,t.x,t.qt(n.memberId,n.start)))}catch{}}async function ve(n,r){try{return await(0,a.setDoc)((0,a.doc)(e.ui,t.t,t.qt(n.memberId,n.start)),{memberId:n.memberId,memberName:r.memberName,scheduleId:r.scheduleId,scheduleName:r.scheduleName,paymentId:r.paymentId||``,paymentSession:r.paymentSession||``,...r.holdUntil?{holdUntil:r.holdUntil}:{},start:n.start,end:n.end,timeZone:r.timeZone,name:r.name,email:r.email.trim().toLowerCase(),answers:r.answers,formId:r.formId,entryId:r.entryId,uid:e.li.currentUser?.uid||`guest`,createdAt:Date.now(),pending:!0}),null}catch(e){return console.error(`Could not write the booking`,e),`The booking could not be saved — check your connection and try again.`}}var K=(e,n)=>({id:e,memberId:String(n?.memberId||``),scheduleId:String(n?.scheduleId||``),scheduleName:String(n?.scheduleName||``),own:n?.own===!0,title:String(n?.title||``),color:String(n?.color||``),paymentId:String(n?.paymentId||``),paymentSession:String(n?.paymentSession||``),...Number.isInteger(n?.holdUntil)&&n.holdUntil>0?{holdUntil:n.holdUntil}:{},cancelled:n?.cancelled===!0,cancelledAt:typeof n?.cancelledAt==`number`?n.cancelledAt:0,cancelReason:String(n?.cancelReason||``),cancelledBy:String(n?.cancelledBy||``),cancelledSide:n?.cancelledSide===`host`||n?.cancelledSide===`booker`?n.cancelledSide:``,cancelledByUid:String(n?.cancelledByUid||``),pending:n?.pending===!0,acceptedAt:typeof n?.acceptedAt==`number`?n.acceptedAt:0,heldOnly:!1,copyIds:[e],partySize:1,partyAccepted:n?.pending===!0?0:1,start:String(n?.start||``),end:String(n?.end||``),memberName:String(n?.memberName||``),timeZone:t.gt(n?.timeZone)?String(n.timeZone):``,name:String(n?.name||``),email:String(n?.email||``),answers:n?.answers&&typeof n.answers==`object`?Object.fromEntries(Object.entries(n.answers).map(([e,t])=>[e,String(t??``)])):{},formId:String(n?.formId||``),entryId:String(n?.entryId||``),uid:String(n?.uid||``),createdAt:typeof n?.createdAt==`number`?n.createdAt:0});function ye(n={}){let[r,o]=(0,i.useState)({loading:!0,bookings:[],error:null}),s=(n.members||[]).slice().sort().join(`,`),c=!!n.includePast,l=(0,i.useRef)(n.now);return(0,i.useEffect)(()=>{l.current=n.now}),(0,i.useEffect)(()=>{let n=l.current,r=s?new Set(s.split(`,`)):null,i=(n?n():new Date).toISOString(),u=(0,a.onSnapshot)(c?(0,a.collection)(e.ui,t.t):(0,a.query)((0,a.collection)(e.ui,t.t),(0,a.where)(`end`,`>=`,i)),e=>{let t=l.current,n=(t?t():new Date).toISOString(),i=[];e.forEach(e=>{let t=K(e.id,e.data());r&&!r.has(t.memberId)||F(t)&&i.push(t)});let a=i.filter(e=>e.end>=n).sort((e,t)=>e.start.localeCompare(t.start)),s=c?i.filter(e=>e.end<n).sort((e,t)=>t.start.localeCompare(e.start)):[];o({loading:!1,bookings:[...a,...s],error:null})},e=>{o({loading:!1,bookings:[],error:String(e?.code||``).includes(`permission`)?`This is for the team — sign in as a team member or admin to see the bookings.`:`The bookings could not be loaded.`})});return()=>u()},[s,c]),r}function q(n,r,i){return e.Zr(`${t.t}/uid=${n}`,()=>(0,a.query)((0,a.collection)(e.ui,t.t),(0,a.where)(`uid`,`==`,n)),e=>r(e.docs),i)}function J(n,r,i){return e.Zr(`${t.t}/email=${n}`,()=>(0,a.query)((0,a.collection)(e.ui,t.t),(0,a.where)(`email`,`==`,n)),e=>r(e.docs),i)}function be(t,n){let{user:r}=e.Ft(),a=t===void 0&&n===void 0,o=a?r?.uid||``:t||``,s=(a?r?.email||``:n||``).trim().toLowerCase(),[c,l]=(0,i.useState)(Y),[u,d]=(0,i.useState)(Y);(0,i.useEffect)(()=>{if(o)return q(o,e=>l({done:!0,list:e.map(e=>K(e.id,e.data())).filter(F),error:null}),e=>l({done:!0,list:[],error:Z(e)}))},[o]),(0,i.useEffect)(()=>{if(s)return J(s,e=>d({done:!0,list:e.map(e=>K(e.id,e.data())).filter(F),error:null}),e=>d({done:!0,list:[],error:Z(e)}))},[s]);let f=o?c:X,p=s?u:X;return{loading:!f.done||!p.done,bookings:(0,i.useMemo)(()=>we(Ce(f.list,p.list)),[f.list,p.list]),error:f.error&&p.error?f.error:null}}var Y={done:!1,list:[],error:null},X={done:!0,list:[],error:null},Z=e=>String(e?.code||``).includes(`permission`)?`These are not readable from this account.`:`The bookings could not be loaded.`,xe=e=>{let t=new Set(e.legacyIds);return new Set(e.schedules.filter(e=>!t.has(e.id)).map(e=>e.id))},Se=(e,t)=>e.map(e=>e.scheduleId&&t.has(e.scheduleId)?{...e,scheduleName:``}:e);function Ce(...e){let t=new Map;for(let n of e)for(let e of n)e.own||t.set(e.id,e);return[...t.values()].sort((e,t)=>e.start.localeCompare(t.start))}function we(e){let t=new Map;for(let n of e){let e=C(n),r=t.get(e);r?r.push(n):t.set(e,[n])}return[...t.values()].map(e=>{let t=w(e);if(e.length===1)return{...e[0],...t};let n=e.map(e=>e.memberName.trim()).filter(Boolean),r=n.length<=1?n.join(``):`${n.slice(0,-1).join(`, `)} and ${n[n.length-1]}`,i=e.find(e=>e.cancelled&&(e.cancelReason||e.cancelledBy));return{...e[0],...t,memberName:r,cancelled:e.every(e=>e.cancelled),cancelReason:i?.cancelReason||e[0].cancelReason,cancelledBy:i?.cancelledBy||e[0].cancelledBy,cancelledSide:i?.cancelledSide||e[0].cancelledSide}})}async function Q(n,r){try{return await(0,a.setDoc)((0,a.doc)(e.ui,t.t,n),{color:r},{merge:!0}),null}catch(e){return console.error(`Could not colour the booking`,e),`The colour could not be saved — make sure you are signed in as a team member and try again.`}}async function Te(n){let r={memberId:n.memberId,scheduleId:``,start:n.start,end:n.end},i=await U(r);if(i)return i===`That time was just taken — pick another.`?`Something is already booked at that time — pick another.`:i;try{return await(0,a.setDoc)((0,a.doc)(e.ui,t.t,t.qt(n.memberId,n.start)),{memberId:n.memberId,memberName:n.memberName,scheduleId:``,scheduleName:``,paymentId:``,paymentSession:``,own:!0,title:n.title,color:n.color,start:n.start,end:n.end,timeZone:n.timeZone,name:``,email:``,answers:n.note?{note:n.note}:{},formId:``,entryId:``,uid:e.li.currentUser?.uid||``,createdAt:Date.now()}),null}catch(e){return console.error(`Could not save the event`,e),await G(r),`The event could not be saved — make sure you are signed in as a team member and try again.`}}async function Ee(n){try{return await(0,a.setDoc)((0,a.doc)(e.ui,t.t,n),{pending:!1,acceptedAt:Date.now()},{merge:!0}),null}catch(e){return console.error(`Could not accept the booking`,e),`It could not be accepted — make sure you are signed in as a team member and try again.`}}async function De(n,r={}){try{let i=r.ids?.length?r.ids:await $(n),o={cancelled:!0,cancelledAt:Date.now(),cancelReason:(r.reason||``).trim(),cancelledBy:(r.by||``).trim(),cancelledSide:r.side||``,...r.byUid&&r.side!==`booker`?{cancelledByUid:r.byUid}:{}};for(let n of i)await(0,a.setDoc)((0,a.doc)(e.ui,t.t,n),o,{merge:!0}),await(0,a.deleteDoc)((0,a.doc)(e.ui,t.x,n));return null}catch(e){return console.error(`Could not cancel the booking`,e),r.side===`booker`?`It could not be cancelled — check your connection and try again.`:`It could not be cancelled — make sure you are signed in as a team member and try again.`}}async function $(n){try{let r=await(0,a.getDoc)((0,a.doc)(e.ui,t.t,n)),i=r.exists()&&r.data()||{},o=String(i.entryId||``),s=String(i.start||``);if(!o||!s)return[n];let c=await(0,a.getDocs)((0,a.query)((0,a.collection)(e.ui,t.t),(0,a.where)(`entryId`,`==`,o))),l=new Set([n]);return c.forEach(e=>{String(e.data()?.start||``)===s&&l.add(e.id)}),[...l]}catch{return[n]}}async function Oe(n,r){try{let i=r?.length?r:await $(n);for(let n of i)await(0,a.deleteDoc)((0,a.doc)(e.ui,t.t,n)),await(0,a.deleteDoc)((0,a.doc)(e.ui,t.x,n));return null}catch(e){return console.error(`Could not remove the booking`,e),`It could not be removed — make sure you are signed in as a team member and try again.`}}async function ke(n,r){try{return await(0,a.deleteDoc)((0,a.doc)(e.ui,t.x,t.qt(n,r))),null}catch(e){return console.error(`Could not free the held time`,e),`The time could not be freed — make sure you are signed in as a team member and try again.`}}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return ve}}),Object.defineProperty(exports,`B`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`F`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`H`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`I`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`L`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`N`,{enumerable:!0,get:function(){return te}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return xe}}),Object.defineProperty(exports,`P`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`R`,{enumerable:!0,get:function(){return ee}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`U`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`V`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`W`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return ae}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return Oe}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return be}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return ke}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return fe}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return pe}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return de}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return Se}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return Te}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return _e}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return ce}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return De}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Ee}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return ue}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return ye}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return ie}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return oe}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return re}}),Object.defineProperty(exports,`z`,{enumerable:!0,get:function(){return y}});
|
|
1
|
+
require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-Ckn1pKAL.cjs`),t=require(`./schedule-BAea6q8_.cjs`),n=require(`./chevron-down-lyDK1rfL.cjs`),r=require(`./bookingHold-DhS-tuuC.cjs`);let i=require(`react`),a=require(`firebase/firestore`);var o={name:`calendar-check`,size:24,node:[[`path`,{d:`M8 2v3`,key:`1ioesn`}],[`path`,{d:`M16 2v3`,key:`otl347`}],[`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`2`,key:`h1oib`}],[`path`,{d:`M3 9h18`,key:`1pudct`}],[`path`,{d:`m9 15 2 2 4-4`,key:`1grp1n`}]]};o.node;var s=n.n(o),c=e=>e?.kind===`link`?`link`:`schedule`,l=e=>e?.kind!==`schedule`&&e?.kind!==`link`,u=()=>`l_${Date.now().toString(36)}${Math.random().toString(36).slice(2,6)}`,d=()=>`s_${Date.now().toString(36)}${Math.random().toString(36).slice(2,6)}`,f=(e,n)=>({id:e,scheduleId:n.id,memberId:n.memberId,memberName:n.memberName,name:``,description:``,slotMinutes:30,horizonDays:30,noticeHours:12,questions:t.$(),paymentId:``,notifyOwner:!0,confirmBooker:!0,enabled:!0}),p=(e,t,n)=>{let r=typeof e==`number`?e:Number(e);return!Number.isFinite(r)||r<0||n&&!n.includes(r)?t:r},m=(e,n)=>({id:e,scheduleId:String(n?.scheduleId||``),memberId:String(n?.memberId||``),memberName:String(n?.memberName||``),name:String(n?.name||``),description:String(n?.description||``),slotMinutes:p(n?.slotMinutes,30,t.b.map(e=>Number(e.value))),horizonDays:p(n?.horizonDays,30),noticeHours:p(n?.noticeHours,12),questions:t.Nt(n?.questions),paymentId:String(n?.paymentId||``),notifyOwner:n?.notifyOwner!==!1,confirmBooker:n?.confirmBooker!==!1,enabled:n?.enabled===!0,createdAt:typeof n?.createdAt==`number`?n.createdAt:void 0,updatedAt:typeof n?.updatedAt==`number`?n.updatedAt:void 0});function h(e,t){return t?{...t,id:e.id,scheduleId:t.id,memberId:t.memberId,memberName:e.memberName||t.memberName,name:e.name,description:e.description,slotMinutes:e.slotMinutes,horizonDays:e.horizonDays,noticeHours:e.noticeHours,questions:e.questions,paymentId:e.paymentId,notifyOwner:e.notifyOwner,confirmBooker:e.confirmBooker,enabled:e.enabled,createdAt:e.createdAt,updatedAt:e.updatedAt,joined:!0}:null}function g(e){let t=new Map(e.schedules.map(e=>[e.id,e])),n=new Set(e.legacyIds),r=e.schedules.filter(e=>n.has(e.id));for(let n of e.links){let e=h(n,t.get(n.scheduleId));e&&r.push(e)}return r.sort((e,t)=>(e.createdAt||0)-(t.createdAt||0)||e.id.localeCompare(t.id))}var _=e=>e.name.trim()||t.O(e),v=(e,n)=>n?`${_(e)} — ${t.Yt(e.slotMinutes)} · ${t.ut(n)}`:`${_(e)} — the hours it was booked in are gone`,ee=(e,n)=>{let r=n?h(e,n):null;return r&&t.P(r)?{state:`saved`,label:`Bookable`}:{state:`off`,label:e.enabled?`In progress`:`Turned off`}};function y(e,n){if(!n)return`The hours this link was booked in are gone — pick another set.`;let r=h(e,n);return r?t.Rt({...r,enabled:!0}):`The hours this link was booked in are gone — pick another set.`}function b(e,n=`Working hours`){let r=[],i=[],a=new Map;for(let o of e){let e=[o.memberId,o.timeZone,JSON.stringify(o.days),JSON.stringify(o.blocked)].join(`|`),s=a.get(e);s||(s={...t.M(d(),o.memberId,o.memberName,o.timeZone),name:n,days:o.days,blocked:o.blocked,enabled:!0,createdAt:o.createdAt},a.set(e,s),r.push(s)),i.push({...f(o.id,s),memberName:o.memberName,name:o.name,description:o.description,slotMinutes:o.slotMinutes,horizonDays:o.horizonDays,noticeHours:o.noticeHours,questions:o.questions,paymentId:o.paymentId,notifyOwner:o.notifyOwner,confirmBooker:o.confirmBooker,enabled:o.enabled,createdAt:o.createdAt})}return{schedules:r,links:i}}var x=e=>{let{id:t,...n}=e;return{...n,kind:`link`}},S=e=>({kind:`schedule`,memberId:e.memberId,memberName:e.memberName,name:e.name,timeZone:e.timeZone,days:e.days,blocked:e.blocked,enabled:!0,createdAt:e.createdAt||Date.now()}),C=e=>e.entryId?`${e.entryId}__${e.start}`:e.id;function w(e){let t=e.filter(e=>!e.cancelled),n=t.length?t:e;return{copyIds:e.map(e=>e.id),pending:n.some(e=>e.pending),partySize:n.length,partyAccepted:n.filter(e=>!e.pending).length}}function T(e){let t=new Map;for(let n of e){if(n.own)continue;let e=C(n),r=t.get(e);r?r.push(n):t.set(e,[n])}let n=new Map;for(let e of t.values()){let t=w(e);for(let r of e)n.set(r.id,t)}return n}var E=5*6e4;function D(e,n,r){let i=new Set(n.map(e=>e.id));return e.filter(e=>i.has(t.qt(e.memberId,e.start))?!1:(e.createdAt||0)<r-E)}var O=`Not paid — the time was let go`;function k(e,t,n,r){return e.cancelled||!e.holdUntil||!e.paymentSession||!t||t.paid||t.status!==`expired`||e.holdUntil>r&&n.has(e.id)?e:{...e,cancelled:!0,cancelledAt:e.holdUntil,cancelReason:O,cancelledSide:`booker`}}var te=(e,n=``)=>({id:t.qt(e.memberId,e.start),memberId:e.memberId,memberName:n,scheduleId:``,scheduleName:``,own:!1,title:``,color:``,paymentId:``,paymentSession:``,cancelled:!1,cancelledAt:0,cancelReason:``,cancelledBy:``,cancelledSide:``,cancelledByUid:``,pending:!1,acceptedAt:0,heldOnly:!0,copyIds:[],partySize:0,partyAccepted:0,start:e.start,end:e.end,timeZone:``,name:``,email:``,answers:{},formId:``,entryId:``,uid:``,createdAt:e.createdAt||0}),ne={schedules:[],links:[],legacyIds:[]};function A(){let[e,t]=(0,i.useState)({loading:!1,docs:ne});return(0,i.useEffect)(()=>{},[]),e}function re(){let{loading:e,docs:t}=A();return{loading:e,schedules:(0,i.useMemo)(()=>g(t),[t])}}function ie(){let{loading:e,docs:t}=A();return{loading:e,schedules:t.schedules}}function ae(){let{loading:e,docs:n}=A();return{loading:e,schedules:(0,i.useMemo)(()=>{let e=g(n),r=new Set(e.map(e=>e.id));return[...e,...n.schedules.filter(e=>!r.has(e.id)&&t.P(e))]},[n])}}function oe(e){let[t,n]=(0,i.useState)({id:``,schedule:null});return(0,i.useEffect)(()=>{if(!e)return;let t=!1;return se(e).then(r=>{t||n({id:e,schedule:r})}).catch(()=>{t||n({id:e,schedule:null})}),()=>{t=!0}},[e]),e?t.id===e?{loading:!1,schedule:t.schedule}:{loading:!0,schedule:null}:{loading:!1,schedule:null}}async function se(n){let r=await(0,a.getDoc)((0,a.doc)(e.ui,t.y,n));if(!r.exists())return null;let i=r.data();if(c(i)!==`link`){let e=t.Pt(r.id,i);return l(i)?e:{...e,name:``}}let o=m(r.id,i);if(!o.scheduleId)return null;let s=await(0,a.getDoc)((0,a.doc)(e.ui,t.y,o.scheduleId));return s.exists()?h(o,t.Pt(s.id,s.data())):null}async function ce(n){if(n.joined)return console.error(`Refused to save a joined bookable as one schedule`,n.id),`That meeting is a booking link on a schedule — change the link or the schedule, not the two at once.`;try{return await(0,a.setDoc)((0,a.doc)(e.ui,t.y,n.id),{...S(n),updatedAt:Date.now()}),null}catch(e){return console.error(`Could not save the schedule`,e),`The hours could not be saved — make sure you are signed in and that this schedule is yours, then try again.`}}async function le(n){try{return await(0,a.setDoc)((0,a.doc)(e.ui,t.y,n.id),{...x(n),updatedAt:Date.now()}),null}catch(e){return console.error(`Could not save the booking link`,e),`The link could not be saved — make sure you are signed in and that this schedule is yours, then try again.`}}async function ue(n){try{return await(0,a.deleteDoc)((0,a.doc)(e.ui,t.y,n)),null}catch(e){return console.error(`Could not remove the booking link`,e),`It could not be removed — make sure you are signed in and that this link is yours, then try again.`}}async function de(n){if(!n.length)return null;let{schedules:r,links:i}=b(n);try{let n=Date.now();for(let i of r)await(0,a.setDoc)((0,a.doc)(e.ui,t.y,i.id),{...S(i),updatedAt:n});for(let r of i)await(0,a.setDoc)((0,a.doc)(e.ui,t.y,r.id),{...x(r),updatedAt:n});return null}catch(e){return console.error(`Could not split the older schedules into hours and links`,e),`Your older schedules could not be tidied into hours and booking links — make sure you are signed in, then reload the screen.`}}async function fe(n){try{return await(0,a.deleteDoc)((0,a.doc)(e.ui,t.y,n)),null}catch(e){return console.error(`Could not remove the schedule`,e),`It could not be removed — make sure you are signed in and that this schedule is yours, then try again.`}}var pe=e=>e.name.trim()||e.email.split(`@`)[0]||``;function j(){let[t,n]=(0,i.useState)({loading:!0,members:[]});return(0,i.useEffect)(()=>{let t=e.Zr(`user_profiles/team`,()=>(0,a.query)((0,a.collection)(e.ui,`user_profiles`),(0,a.where)(`role`,`in`,[`internal`,`admin`])),e=>{let t=[];e.forEach(e=>{let n=e.data()||{},r=n.role===`admin`||n.role===`internal`?n.role:null;!r||n.inactive===!0||t.push({id:e.id,name:String(n.displayName||``),email:String(n.email||``),role:r})}),t.sort((e,t)=>(e.name||e.email).localeCompare(t.name||t.email)),n({loading:!1,members:t})},()=>n({loading:!1,members:[]}));return()=>t()},[]),t}function M(n,o,s={}){let c=s.keepOpen===!0,[l,u]=(0,i.useState)([]),d=(n||[]).slice().sort().join(`,`),[f]=(0,i.useState)(()=>Date.now()),p=o instanceof Date&&!Number.isNaN(o.getTime())?o.getTime():f,m=new Date(Math.floor(p/6e4)*6e4).toISOString();return(0,i.useEffect)(()=>{if(!d)return;let n=new Set(d.split(`,`)),i=new Date(Date.parse(m)-I).toISOString(),o=(0,a.onSnapshot)((0,a.query)((0,a.collection)(e.ui,t.x),(0,a.where)(`start`,`>=`,i)),e=>{let t=[];e.forEach(e=>{let i=e.data()||{},a=String(i.memberId||``);if(!n.has(a))return;let o={memberId:a,start:String(i.start||``),end:String(i.end||``),createdAt:typeof i.createdAt==`number`?i.createdAt:0};if(F(o)){if(r.l(i,Date.now())){if(!c)return;o.open=!0}o.end>=m&&t.push(o)}}),u(t)},()=>u([]));return()=>o()},[d,m,c]),d?l:N}var N=[],P=/^\d{4}-\d{2}-\d{2}T/,F=e=>P.test(e.start)&&P.test(e.end)&&!Number.isNaN(Date.parse(e.start))&&!Number.isNaN(Date.parse(e.end)),I=4*36e5,L=15*6e4,R=`taken`,z=`That time was just taken — pick another.`,B=`The time could not be saved — check your connection and try again.`;function me(e){let n=Date.parse(e.start),r=Date.parse(e.end),i=Math.ceil((n-I)/L)*L,a=[];for(let n=i;n<r;n+=L)a.push(t.qt(e.memberId,new Date(n).toISOString()));return a}var V=class extends Error{ids;constructor(e){super(`ask the server`),this.ids=e}};async function he(n,i,o){let s=t.qt(n.memberId,n.start);await(0,a.runTransaction)(e.ui,async c=>{let l=(0,a.doc)(e.ui,t.x,s),u=me(n).filter(e=>e!==s),[d,...f]=await Promise.all([c.get(l),...u.map(n=>c.get((0,a.doc)(e.ui,t.x,n)))]),p=Date.now(),m=[],h=``;if(d.exists()){let e=d.data()||{};if(!r.l(e,p))throw Error(R);h=r.m(e)||o.get(s)||``,h||m.push(s)}if(f.forEach((e,i)=>{if(!e.exists())return;let a=e.data()||{};if(t.Dt({start:String(a.start||``),end:String(a.end||``)},n)){if(!r.l(a,p))throw Error(R);!r.m(a)&&!o.has(u[i])&&m.push(u[i])}}),m.length)throw new V(m);c.set(l,{memberId:n.memberId,start:n.start,end:n.end,createdAt:Date.now(),...i?{holdUntil:i}:{},...h?{freed:h}:{}})})}var ge=e=>e?.code===`permission-denied`;async function H(t,n){let r=new Map;for(let i=0;i<3;i+=1)try{return await he(t,n,r),{refused:null}}catch(t){if(t instanceof V){for(let n of t.ids){let t=await e.kn(n);if(typeof t==`string`)return{refused:B};if(t.state===`free`){r.set(n,t.pass);continue}if(t.state!==`gone`)return t.state===`paid`&&await W({[n]:t.pass},`paid`),{refused:z}}continue}return t?.message===R?{refused:z}:(console.error(`Could not claim the time`,t),{refused:B,rules:ge(t)})}return{refused:z}}async function U(e){return(await H(e,0)).refused}async function _e(e,t){let n=await H(e,t);if(!n.refused)return{holdUntil:t};if(!n.rules||!t)return{error:n.refused};let r=await H(e,0);return r.refused?{error:r.refused}:{holdUntil:0}}async function W(n,i){let o=[],s=[];return await Promise.all(Object.entries(n).map(async([n,c])=>{if(!n||!c)return;let l=(0,a.doc)(e.ui,t.x,n);try{await(0,a.setDoc)(l,{[i]:c},{merge:!0}),o.push(n);return}catch{}try{let e=await(0,a.getDoc)(l),t=e.exists()?e.data()||{}:null;!t||(i===`paid`?r.u(t):r.m(t))?o.push(n):s.push(n)}catch{s.push(n)}})),{written:o,refused:s}}async function G(n){try{await(0,a.deleteDoc)((0,a.doc)(e.ui,t.x,t.qt(n.memberId,n.start)))}catch{}}async function ve(n,r){try{return await(0,a.setDoc)((0,a.doc)(e.ui,t.t,t.qt(n.memberId,n.start)),{memberId:n.memberId,memberName:r.memberName,scheduleId:r.scheduleId,scheduleName:r.scheduleName,paymentId:r.paymentId||``,paymentSession:r.paymentSession||``,...r.holdUntil?{holdUntil:r.holdUntil}:{},start:n.start,end:n.end,timeZone:r.timeZone,name:r.name,email:r.email.trim().toLowerCase(),answers:r.answers,formId:r.formId,entryId:r.entryId,uid:e.li.currentUser?.uid||`guest`,createdAt:Date.now(),pending:!0}),null}catch(e){return console.error(`Could not write the booking`,e),`The booking could not be saved — check your connection and try again.`}}var K=(e,n)=>({id:e,memberId:String(n?.memberId||``),scheduleId:String(n?.scheduleId||``),scheduleName:String(n?.scheduleName||``),own:n?.own===!0,title:String(n?.title||``),color:String(n?.color||``),paymentId:String(n?.paymentId||``),paymentSession:String(n?.paymentSession||``),...Number.isInteger(n?.holdUntil)&&n.holdUntil>0?{holdUntil:n.holdUntil}:{},cancelled:n?.cancelled===!0,cancelledAt:typeof n?.cancelledAt==`number`?n.cancelledAt:0,cancelReason:String(n?.cancelReason||``),cancelledBy:String(n?.cancelledBy||``),cancelledSide:n?.cancelledSide===`host`||n?.cancelledSide===`booker`?n.cancelledSide:``,cancelledByUid:String(n?.cancelledByUid||``),pending:n?.pending===!0,acceptedAt:typeof n?.acceptedAt==`number`?n.acceptedAt:0,heldOnly:!1,copyIds:[e],partySize:1,partyAccepted:n?.pending===!0?0:1,start:String(n?.start||``),end:String(n?.end||``),memberName:String(n?.memberName||``),timeZone:t.gt(n?.timeZone)?String(n.timeZone):``,name:String(n?.name||``),email:String(n?.email||``),answers:n?.answers&&typeof n.answers==`object`?Object.fromEntries(Object.entries(n.answers).map(([e,t])=>[e,String(t??``)])):{},formId:String(n?.formId||``),entryId:String(n?.entryId||``),uid:String(n?.uid||``),createdAt:typeof n?.createdAt==`number`?n.createdAt:0});function ye(n={}){let[r,o]=(0,i.useState)({loading:!0,bookings:[],error:null}),s=(n.members||[]).slice().sort().join(`,`),c=!!n.includePast,l=(0,i.useRef)(n.now);return(0,i.useEffect)(()=>{l.current=n.now}),(0,i.useEffect)(()=>{let n=l.current,r=s?new Set(s.split(`,`)):null,i=(n?n():new Date).toISOString(),u=(0,a.onSnapshot)(c?(0,a.collection)(e.ui,t.t):(0,a.query)((0,a.collection)(e.ui,t.t),(0,a.where)(`end`,`>=`,i)),e=>{let t=l.current,n=(t?t():new Date).toISOString(),i=[];e.forEach(e=>{let t=K(e.id,e.data());r&&!r.has(t.memberId)||F(t)&&i.push(t)});let a=i.filter(e=>e.end>=n).sort((e,t)=>e.start.localeCompare(t.start)),s=c?i.filter(e=>e.end<n).sort((e,t)=>t.start.localeCompare(e.start)):[];o({loading:!1,bookings:[...a,...s],error:null})},e=>{o({loading:!1,bookings:[],error:String(e?.code||``).includes(`permission`)?`This is for the team — sign in as a team member or admin to see the bookings.`:`The bookings could not be loaded.`})});return()=>u()},[s,c]),r}function q(n,r,i){return e.Zr(`${t.t}/uid=${n}`,()=>(0,a.query)((0,a.collection)(e.ui,t.t),(0,a.where)(`uid`,`==`,n)),e=>r(e.docs),i)}function J(n,r,i){return e.Zr(`${t.t}/email=${n}`,()=>(0,a.query)((0,a.collection)(e.ui,t.t),(0,a.where)(`email`,`==`,n)),e=>r(e.docs),i)}function be(t,n){let{user:r}=e.Ft(),a=t===void 0&&n===void 0,o=a?r?.uid||``:t||``,s=(a?r?.email||``:n||``).trim().toLowerCase(),[c,l]=(0,i.useState)(Y),[u,d]=(0,i.useState)(Y);(0,i.useEffect)(()=>{if(o)return q(o,e=>l({done:!0,list:e.map(e=>K(e.id,e.data())).filter(F),error:null}),e=>l({done:!0,list:[],error:Z(e)}))},[o]),(0,i.useEffect)(()=>{if(s)return J(s,e=>d({done:!0,list:e.map(e=>K(e.id,e.data())).filter(F),error:null}),e=>d({done:!0,list:[],error:Z(e)}))},[s]);let f=o?c:X,p=s?u:X;return{loading:!f.done||!p.done,bookings:(0,i.useMemo)(()=>we(Ce(f.list,p.list)),[f.list,p.list]),error:f.error&&p.error?f.error:null}}var Y={done:!1,list:[],error:null},X={done:!0,list:[],error:null},Z=e=>String(e?.code||``).includes(`permission`)?`These are not readable from this account.`:`The bookings could not be loaded.`,xe=e=>{let t=new Set(e.legacyIds);return new Set(e.schedules.filter(e=>!t.has(e.id)).map(e=>e.id))},Se=(e,t)=>e.map(e=>e.scheduleId&&t.has(e.scheduleId)?{...e,scheduleName:``}:e);function Ce(...e){let t=new Map;for(let n of e)for(let e of n)e.own||t.set(e.id,e);return[...t.values()].sort((e,t)=>e.start.localeCompare(t.start))}function we(e){let t=new Map;for(let n of e){let e=C(n),r=t.get(e);r?r.push(n):t.set(e,[n])}return[...t.values()].map(e=>{let t=w(e);if(e.length===1)return{...e[0],...t};let n=e.map(e=>e.memberName.trim()).filter(Boolean),r=n.length<=1?n.join(``):`${n.slice(0,-1).join(`, `)} and ${n[n.length-1]}`,i=e.find(e=>e.cancelled&&(e.cancelReason||e.cancelledBy));return{...e[0],...t,memberName:r,cancelled:e.every(e=>e.cancelled),cancelReason:i?.cancelReason||e[0].cancelReason,cancelledBy:i?.cancelledBy||e[0].cancelledBy,cancelledSide:i?.cancelledSide||e[0].cancelledSide}})}async function Q(n,r){try{return await(0,a.setDoc)((0,a.doc)(e.ui,t.t,n),{color:r},{merge:!0}),null}catch(e){return console.error(`Could not colour the booking`,e),`The colour could not be saved — make sure you are signed in as a team member and try again.`}}async function Te(n){let r={memberId:n.memberId,scheduleId:``,start:n.start,end:n.end},i=await U(r);if(i)return i===`That time was just taken — pick another.`?`Something is already booked at that time — pick another.`:i;try{return await(0,a.setDoc)((0,a.doc)(e.ui,t.t,t.qt(n.memberId,n.start)),{memberId:n.memberId,memberName:n.memberName,scheduleId:``,scheduleName:``,paymentId:``,paymentSession:``,own:!0,title:n.title,color:n.color,start:n.start,end:n.end,timeZone:n.timeZone,name:``,email:``,answers:n.note?{note:n.note}:{},formId:``,entryId:``,uid:e.li.currentUser?.uid||``,createdAt:Date.now()}),null}catch(e){return console.error(`Could not save the event`,e),await G(r),`The event could not be saved — make sure you are signed in as a team member and try again.`}}async function Ee(n){try{return await(0,a.setDoc)((0,a.doc)(e.ui,t.t,n),{pending:!1,acceptedAt:Date.now()},{merge:!0}),null}catch(e){return console.error(`Could not accept the booking`,e),`It could not be accepted — make sure you are signed in as a team member and try again.`}}async function De(n,r={}){try{let i=r.ids?.length?r.ids:await $(n),o={cancelled:!0,cancelledAt:Date.now(),cancelReason:(r.reason||``).trim(),cancelledBy:(r.by||``).trim(),cancelledSide:r.side||``,...r.byUid&&r.side!==`booker`?{cancelledByUid:r.byUid}:{}};for(let n of i)await(0,a.setDoc)((0,a.doc)(e.ui,t.t,n),o,{merge:!0}),await(0,a.deleteDoc)((0,a.doc)(e.ui,t.x,n));return null}catch(e){return console.error(`Could not cancel the booking`,e),r.side===`booker`?`It could not be cancelled — check your connection and try again.`:`It could not be cancelled — make sure you are signed in as a team member and try again.`}}async function $(n){try{let r=await(0,a.getDoc)((0,a.doc)(e.ui,t.t,n)),i=r.exists()&&r.data()||{},o=String(i.entryId||``),s=String(i.start||``);if(!o||!s)return[n];let c=await(0,a.getDocs)((0,a.query)((0,a.collection)(e.ui,t.t),(0,a.where)(`entryId`,`==`,o))),l=new Set([n]);return c.forEach(e=>{String(e.data()?.start||``)===s&&l.add(e.id)}),[...l]}catch{return[n]}}async function Oe(n,r){try{let i=r?.length?r:await $(n);for(let n of i)await(0,a.deleteDoc)((0,a.doc)(e.ui,t.t,n)),await(0,a.deleteDoc)((0,a.doc)(e.ui,t.x,n));return null}catch(e){return console.error(`Could not remove the booking`,e),`It could not be removed — make sure you are signed in as a team member and try again.`}}async function ke(n,r){try{return await(0,a.deleteDoc)((0,a.doc)(e.ui,t.x,t.qt(n,r))),null}catch(e){return console.error(`Could not free the held time`,e),`The time could not be freed — make sure you are signed in as a team member and try again.`}}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return ve}}),Object.defineProperty(exports,`B`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`F`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`H`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`I`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`L`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`N`,{enumerable:!0,get:function(){return te}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return xe}}),Object.defineProperty(exports,`P`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`R`,{enumerable:!0,get:function(){return ee}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`U`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`V`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`W`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return ae}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return Oe}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return be}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return ke}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return fe}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return pe}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return de}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return Se}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return Te}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return _e}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return ce}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return De}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Ee}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return ue}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return ye}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return ie}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return oe}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return re}}),Object.defineProperty(exports,`z`,{enumerable:!0,get:function(){return y}});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Ft as e, Zr as t, kn as n, li as r, ui as i } from "./TimeZoneField-
|
|
1
|
+
import { Ft as e, Zr as t, kn as n, li as r, ui as i } from "./TimeZoneField-oIMwb5_X.js";
|
|
2
2
|
import { $ as a, Dt as o, M as s, Nt as c, O as l, P as u, Pt as d, Rt as f, Yt as p, b as ee, gt as te, qt as m, t as h, ut as ne, x as g, y as _ } from "./schedule-C13m_kiO.js";
|
|
3
3
|
import { n as re } from "./chevron-down--LwXEv9w.js";
|
|
4
4
|
import { l as v, m as y, u as ie } from "./bookingHold-DX9zPdMr.js";
|
package/dist/server.cjs.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./chunk-CiTBaPhY.cjs`),t=require(`./schedule-BAea6q8_.cjs`),n=require(`./bookingHold-DhS-tuuC.cjs`),r=require(`./tabAudience-2fJAN1aD.cjs`),i=require(`./soldLines-BGtA9Oub.cjs`),a=require(`./recordPrice-Cy7Km-eX.cjs`),o=require(`./appIcons-BNovDw6_.cjs`),s=require(`./aiModels-DzYPysSf.cjs`);let c=require(`node:fs`);c=e.a(c,1);let l=require(`express`);l=e.a(l,1);let u=require(`node:crypto`),d=require(`stripe`);d=e.a(d,1);var f=`https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com`,p=60;function m(e,t,n,r=Math.floor(Date.now()/1e3)){return n?e.alg===`RS256`?e.kid?t.aud===n?t.iss===`https://securetoken.google.com/${n}`?t.sub?t.sub.length>128?`Token subject is not a valid uid.`:typeof t.exp!=`number`||t.exp<=r?`Token has expired.`:typeof t.iat!=`number`||t.iat>r+p?`Token was issued in the future.`:null:`Token has no subject.`:`Token has the wrong issuer.`:`Token was issued for a different Firebase project.`:`Token has no key id.`:`Token is not signed with RS256.`:`The server does not know its Firebase project id.`}function h(e){return Buffer.from(e.replace(/-/g,`+`).replace(/_/g,`/`),`base64`)}function g(e){let t=String(e||``).split(`.`);if(t.length!==3)return null;try{return{header:JSON.parse(h(t[0]).toString(`utf8`)),claims:JSON.parse(h(t[1]).toString(`utf8`)),signed:`${t[0]}.${t[1]}`,signature:h(t[2])}}catch{return null}}var _=null,v=null;async function y(){if(_&&_.expiresAt>Date.now())return _.keys;v||=b().finally(()=>{v=null});try{return await v}catch(e){if(_)return _.keys;throw e}}async function b(){let e=await fetch(f,{signal:AbortSignal.timeout(5e3)});if(!e.ok)throw Error(`Could not fetch Google signing keys (${e.status}).`);let t=await e.json(),n=/max-age=(\d+)/.exec(e.headers.get(`cache-control`)||``);return _={keys:t,expiresAt:Date.now()+(n?Number(n[1]):3600)*1e3},t}async function x(e,t){let n=g(e);if(!n)throw Error(`That is not a valid sign-in token.`);let r=m(n.header,n.claims,t);if(r)throw Error(r);let i=(await y())[n.header.kid];if(!i)throw Error(`Token was signed with a key Google no longer publishes.`);let a=(0,u.createVerify)(`RSA-SHA256`);if(a.update(n.signed),a.end(),!a.verify(i,n.signature))throw Error(`Token signature does not check out.`);return{uid:n.claims.sub,email:n.claims.email||null,emailVerified:!!n.claims.email_verified,signInProvider:n.claims.firebase?.sign_in_provider||null}}function S(){return(process.env.VITE_FIREBASE_PROJECT_ID||process.env.FIREBASE_PROJECT_ID||``).trim()}var ee=`https://firestore.googleapis.com/v1`;function te(e){return e==null?null:`stringValue`in e?e.stringValue:`integerValue`in e?Number(e.integerValue):`doubleValue`in e?e.doubleValue:`booleanValue`in e?e.booleanValue:`timestampValue`in e?e.timestampValue:`nullValue`in e?null:`mapValue`in e?ne(e.mapValue?.fields||{}):`arrayValue`in e?(e.arrayValue?.values||[]).map(te):null}function ne(e){let t={};for(let[n,r]of Object.entries(e||{}))t[n]=te(r);return t}function re(e,t){let n=`${e}/${t}`.split(`/`);if(n.length%2!=0)return`That is not a document path.`;for(let e of n)if(!e||e===`.`||e===`..`||!/^[A-Za-z0-9_.@~+-]+$/.test(e))return`That is not a document path.`;return null}var ie=1e4;async function C(e,t,n,r){let i=re(t,n);if(i)throw Error(i);let a=`${ee}/projects/${e}/databases/(default)/documents/${t}/${n}`,o=await fetch(a,{headers:r?{Authorization:`Bearer ${r}`}:{},signal:AbortSignal.timeout(ie)});if(o.status===404)return null;if(o.status===403)throw Error(`You do not have permission to read that record.`);if(!o.ok)throw Error(`Firestore refused the read (${o.status}).`);return ne((await o.json()).fields||{})}var ae=50;async function oe(e,t,n){if(!/^[A-Za-z0-9_.@~+-]+$/.test(t)||t===`.`||t===`..`)throw Error(`That is not a collection.`);let r=[],i=``;for(let a=0;a<ae;a++){let a=`${ee}/projects/${e}/databases/(default)/documents/${t}?pageSize=300${i?`&pageToken=${encodeURIComponent(i)}`:``}`,o=await fetch(a,{headers:n?{Authorization:`Bearer ${n}`}:{},signal:AbortSignal.timeout(ie)});if(o.status===403)throw Error(`You do not have permission to read those records.`);if(!o.ok)throw Error(`Firestore refused the read (${o.status}).`);let s=await o.json();for(let e of s.documents||[])r.push({id:String(e.name||``).split(`/`).pop()||``,data:ne(e.fields||{})});let c=typeof s.nextPageToken==`string`?s.nextPageToken:``;if(!c)return r;if(c===i)break;i=c}throw Error(`There are too many records to read.`)}var se=[`email`,`Email`,`emailAddress`,`email_address`,`userEmail`,`contactEmail`,`submitterEmail`];function ce(e){let t=[];for(let n of se){let r=e[n];typeof r==`string`&&r.includes(`@`)&&t.push(r.trim())}return t}function le(e){for(let t of se){let n=e[t];if(typeof n==`string`&&n.includes(`@`))return n.trim()}return null}var ue=4320*60*1e3,de=new Set([`user`,`users`,`free`,`guest`,`guests`,`internal`,`admin`,`admins`,`public`,`owner`,`team`,`member`,`members`,`none`,`role`,`roles`]),fe=e=>typeof e==`string`&&/^[a-z][a-z0-9]{1,23}$/.test(e)&&!de.has(e),pe=e=>(0,u.createHmac)(`sha256`,e).update(`your-ai-firebase plan roles v1`).digest(`hex`),me=(e,t,n,r)=>(0,u.createHash)(`sha256`).update(`${e}:${t}:${n}:${r}`).digest(`hex`);function he(e){let t=new Map;for(let n of e){let e=Array.isArray(n?.plans)?n.plans:[];for(let n of e){let e=String(n?.roleId||``);if(fe(e))for(let r of[n?.monthly,n?.yearly])for(let n of[r?.priceId,r?.livePriceId]){let r=String(n||``).trim();r&&t.set(r,e)}}}return t}var ge=e=>he(e).size>0;function _e(e,t,n){let r=null;for(let i of e){if(!i.active||!i.priceId)continue;let e=t.get(i.priceId);if(!e)continue;let a=typeof i.currentPeriodEnd==`number`?i.currentPeriodEnd*1e3:n,o=Math.round(Math.max(a,n)+ue);(!r||o>r.until)&&(r={role:e,until:o})}return r}var ve=null;function w(){return(process.env.STRIPE_SECRET_KEY||``).trim()}function ye(){let e=w();return e?e.startsWith(`sk_live_`)?`live`:`test`:null}function T(){let e=w();if(!e)throw Error(`STRIPE_SECRET_KEY is not set.`);return ve||=new d.default(e),ve}var be=4e3,xe=null;async function Se(e=T,t=Date.now()){let n=w();if(!n)return null;xe?.key!==n&&(xe={key:n,currency:null,failedAt:null,pending:null});let r=xe;return r.currency?r.currency:r.pending?r.pending:r.failedAt!==null&&t-r.failedAt<6e4?null:(r.pending=Promise.resolve().then(()=>e().accounts.retrieveCurrent(void 0,{timeout:be,maxNetworkRetries:0})).then(e=>{let t=String(e?.default_currency||``).trim().toLowerCase();if(!/^[a-z]{3}$/.test(t))throw Error(`The account named no currency.`);return r.currency=t,r.failedAt=null,t}).catch(()=>(r.failedAt=t,null)).finally(()=>{r.pending=null}),r.pending)}async function Ce(e,t=T){return(typeof e==`string`?e.trim().toLowerCase():``)||await Se(t)||`usd`}function we(e){let t=e.currency,n=0;for(let r of Array.isArray(e.lines)?e.lines:[]){let e=Number(r?.amount),i=Number(r?.quantity);if(!Number.isFinite(e)||!Number.isInteger(i))return NaN;n+=E(e,t)*i}for(let r of Array.isArray(e.extras)?e.extras:[]){let e=Number(r?.amount);if(!Number.isFinite(e))return NaN;n+=e<0?-E(-e,t):E(e,t)}return D(n,t)}var Te=Number(process.env.STRIPE_MAX_ADHOC_AMOUNT||1e4),Ee=.5;function De(e){let{priceId:t,amount:n,mode:r=`payment`,quantity:i=1}=e||{};if(!t&&n===void 0)return`This button does not say what is being sold.`;if(t&&n!==void 0)return`A payment has either a Stripe price or an amount, not both.`;if(r!==`payment`&&r!==`subscription`)return`A payment is either one-time or a subscription.`;if(!Number.isInteger(i)||i<1||i>999)return`Quantity must be a whole number between 1 and 999.`;if(n!==void 0){if(r===`subscription`)return`A subscription needs a price created in Stripe — a typed amount cannot recur.`;if(typeof n!=`number`||!Number.isFinite(n))return`That amount is not a number.`;if(n<.5)return`The smallest amount that can be charged is ${Ee}.`;if(n>Te)return`That amount is above the ${Te} limit for typed prices. Use a price created in Stripe.`;if(!e.productName||!String(e.productName).trim())return`A typed amount needs a name for what is being bought.`}if(t&&!/^price_[A-Za-z0-9]+$/.test(t))return`That does not look like a Stripe price id.`;if(e.lines!==void 0){if(t)return`A basket of lines is charged by its amounts, not a Stripe price.`;if(!Array.isArray(e.lines)||!e.lines.length)return`The basket has no lines in it.`;if(e.lines.length>100)return`A basket can hold at most 100 lines.`;for(let t of e.lines){if(!t||typeof t!=`object`)return`A basket line is not a line.`;if(!String(t.name||``).trim())return`A basket line has no name.`;let e=Number(t.amount);if(!Number.isFinite(e)||e<0)return`A basket line has a price that is not a number.`;if(!Number.isInteger(t.quantity)||t.quantity<1||t.quantity>999)return`A basket line needs a whole quantity between 1 and 999.`;if(t.collection!==void 0&&!/^pub_[A-Za-z0-9_]{1,120}$/.test(String(t.collection)))return`A basket line names a collection that is not a public one.`}if(e.extras!==void 0&&!Array.isArray(e.extras))return`The extras on the basket are not a list.`;for(let t of e.extras||[])if(!t||typeof t!=`object`||!Number.isFinite(Number(t.amount)))return`An extra on the basket is not a number.`;if(Math.abs(we(e)-Number(n))>.011)return`The basket’s lines do not add up to its total.`}return null}var Oe=new Set([`bif`,`clp`,`djf`,`gnf`,`jpy`,`kmf`,`krw`,`mga`,`pyg`,`rwf`,`ugx`,`vnd`,`vuv`,`xaf`,`xof`,`xpf`]),ke=new Set([`bhd`,`jod`,`kwd`,`omr`,`tnd`]),Ae=e=>String(e||`usd`).toLowerCase();function E(e,t){let n=Ae(t);return Oe.has(n)?Math.round(e):ke.has(n)?Math.round(e*100)*10:Math.round(e*100)}function D(e,t){if(e==null)return null;let n=Ae(t);return Oe.has(n)?e:ke.has(n)?e/1e3:e/100}function je(e,t,n){let r=String(e||``).replace(/\/+$/,``),i=(e,t)=>{let n=String(e||t);return n.startsWith(`/`)?n:`/${n}`},a=i(t,`/payment-complete`);return{success:`${r}${a}${a.includes(`?`)?`&`:`?`}session_id={CHECKOUT_SESSION_ID}`,cancel:`${r}${i(n,`/payment-cancelled`)}`}}function Me(e){return e===`active`||e===`trialing`||e===`past_due`}var Ne=(e,t,r,i)=>(0,u.createHash)(`sha256`).update(n.d(e,t,r,i)).digest(`hex`),Pe=(e,t)=>`${e}__${String(t).replace(/[-:]/g,``).slice(0,15)}`,Fe=/^[A-Za-z0-9_-]{1,100}$/,Ie=/^cs_[A-Za-z0-9_]{1,250}$/,Le=12,O=(e,t)=>({status:e,error:t});function Re(e){if(!Array.isArray(e)||!e.length)return`Say which times are being paid for.`;if(e.length>Le)return`That is more people than one meeting can hold.`;let t=[];for(let r of e){let e=String(r?.bookingId||``),i=String(r?.scheduleId||``);if(!n.p(e)||!Fe.test(i))return`One of those times could not be read.`;if(t.some(t=>t.bookingId===e))return`The same time was named twice.`;t.push({bookingId:e,scheduleId:i})}return t}async function ze(e,t){let r=Re(e.legs);if(typeof r==`string`)return O(400,r);let i=String(e.when||``).trim().slice(0,300),a=(t.now||Date.now)(),[o,s]=await Promise.all([Promise.all(r.map(e=>t.read(`pub_bookings`,e.bookingId))),Promise.all(r.map(e=>t.read(`sys_schedules`,e.scheduleId)))]),c=-1;for(let e=0;e<r.length;e+=1){let t=o[e],i=s[e];if(!t)return O(409,`That time is no longer held for you — pick it again.`);if(!i)return O(404,`That booking link is no longer open.`);let a=String(t.memberId||``);if(!a||a!==String(i.memberId||``)||Pe(a,String(t.start||``))!==r[e].bookingId)return O(400,`That time does not belong to that booking link.`);if(i.enabled!==!0)return O(409,`This is not taking bookings at the moment.`);if(n.u(t)||t.letGo)return O(409,`That time is no longer held for you — pick it again.`);let l=n.c(t);if(c!==-1&&l!==c)return O(400,`Those times were not held together — pick them again.`);c=l}let l=c-a;if(c&&(l<21e5||l>216e5))return O(400,`The time could not be held long enough to pay. Check the date and time on this device, then try again.`);let u=n._(s.map(e=>({paymentId:String(e?.paymentId||``)})));if(!u.length)return O(400,`There is nothing to pay for this booking.`);let d=await Promise.all(u.map(e=>t.read(`sys_payments`,e))),f=e=>[...new Set(s.filter(t=>String(t?.paymentId||``)===e).map(e=>String(e?.memberName||``).trim()).filter(Boolean))].join(`, `),p=t.currency?await t.currency():`usd`,m=[],h=0;for(let e=0;e<u.length;e+=1){let t=n.g(d[e]);if(!t)return O(409,`The payment for this booking is not set up yet — ask whoever sent you the link.`);let i=f(u[e]),a=`${n.h(d[e])}${r.length>1&&i?` — ${i}`:``}`.slice(0,250),o=E(t,p);m.push({quantity:1,price_data:{currency:p,product_data:{name:a},unit_amount:o}}),h+=o}let g=D(h,p);if(h<50)return O(409,`The payment for this booking is below what can be charged by card.`);let _=s[0]||{},v=`${String(_.name||``).trim()||n.h(d[0])}${i?` — ${i}`:``}`.slice(0,450),y=e=>s.some(t=>t?.[e]!==!1)?`yes`:`no`,b=String(e.email||``).trim().slice(0,254),x=String(e.name||``).trim().slice(0,200);return{lineItems:m,metadata:{bookingId:r[0].bookingId,[n.t]:r.map(e=>e.bookingId).join(`,`).slice(0,500),...c?{[n.o]:String(c)}:{},scheduleId:r[0].scheduleId,productName:v,...i?{when:i}:{},...x?{name:x}:{},...b?{email:b}:{},emailReceipt:y(`confirmBooker`),notifyOwner:y(`notifyOwner`)},expiresAt:Math.floor((a+n.n)/1e3),total:g,currency:p,productName:v}}async function Be(e,t){try{await e.checkout.sessions.expire(t)}catch{}}var Ve=10;async function He(e,t,r){let i=Math.floor((r-n.r-10*6e4)/1e3),a=Math.ceil((r-n.i+10*6e4)/1e3),o=[],s;for(let c=0;c<Ve;c+=1){let c=await e.checkout.sessions.list({created:{gte:i,lte:a},limit:100,starting_after:s});for(let e of c.data)n.s(e.metadata).includes(t)&&n.f(e.metadata)===r&&o.push(e);if(!c.has_more||!c.data.length)break;s=c.data[c.data.length-1].id}return o}async function Ue(e,t,r){if(!n.p(e))return O(400,`That time could not be read.`);if(t&&!Ie.test(t))return O(400,`That payment could not be read.`);let i=(r.now||Date.now)(),a=await r.read(`pub_bookings`,e);if(!a)return{state:`gone`};let o=n.c(a);if(!o||n.u(a))return{state:`kept`};let s=r.stripe();if(t){let r=await s.checkout.sessions.retrieve(t),i=r.metadata||{};if(!n.s(i).includes(e)||n.f(i)!==o)return O(404,`That payment is not for this time.`);r.status===`open`&&await Be(s,t)}let c=await He(s,e,o);if(c.some(e=>e.status===`complete`))return{state:`paid`,pass:Ne(r.key(),e,o,`paid`)};let l=c.filter(e=>e.status===`open`&&e.id!==t);if(l.length){if(i<o)return{state:`open`};for(let e of l)await Be(s,e.id)}return!c.length&&i<o?{state:`open`}:{state:`free`,pass:Ne(r.key(),e,o,`free`)}}function We(e,t){if(e.status!==`complete`||!t)return{};let r=e.metadata||{},i=n.f(r);if(!i)return{};let a={};for(let e of n.s(r))a[e]=Ne(t,e,i,`paid`);return a}function Ge(e,t){e.post(`/payments/booking-checkout`,async(e,n)=>{let r=e.body||{},i=await t.paymentsOff()||await t.limited(e);if(i)return t.fail(n,i.status,i.error);let a=await t.origin(e,r.origin);if(!a)return t.fail(n,400,`The page did not say where to send the payer back to.`);try{let i=await ze(r,t);if(`error`in i)return t.fail(n,i.status,i.error);let{uid:o,...s}=await t.payer(e,i.metadata),c=String(r.successPath||``).split(`?`)[0].slice(0,200),l={...i.metadata,...c?{page:c}:{},...o?{uid:o}:{}};t.stamp(l);let u=t.returnUrls(a,String(r.successPath||``),String(r.cancelPath||``)),d={mode:`payment`,line_items:i.lineItems,success_url:u.success,cancel_url:u.cancel,expires_at:i.expiresAt,allow_promotion_codes:!0,...s,metadata:l,payment_intent_data:{metadata:l,description:i.productName}},f=t.stripe(),p=await f.checkout.sessions.create(d).catch(e=>{if(!d.customer_email||e?.param!==`customer_email`)throw e;return f.checkout.sessions.create({...d,customer_email:void 0})});return n.json({success:!0,sessionId:p.id,url:p.url,amount:i.total,currency:i.currency})}catch(e){return t.sendError(n,e)}}),e.post(`/payments/booking-hold`,async(e,n)=>{let r=e.body||{},i=await t.holdLimited(e);if(i)return t.fail(n,i.status,i.error);try{let e=await Ue(String(r.bookingId||``),String(r.sessionId||``),t);return`error`in e?t.fail(n,e.status,e.error):n.json({success:!0,...e})}catch(e){return t.sendError(n,e)}})}var Ke=`https://api.resend.com`;function k(){return(process.env.RESEND_KEY||process.env.RESEND_API_KEY||``).trim()}var qe=`onboarding@resend.dev`,Je=e=>String(e||``).trim().toLowerCase().endsWith(`@resend.dev`);function A(e){let t=String(e??``).trim(),n=t.match(/<([^<>]*)>/);if(n&&(t=n[1]),t=t.replace(/^["'\s]+|["'\s]+$/g,``),!/^[^\s@<>"',;()]+@[^\s@<>"',;()]+\.[^\s@<>"',;()]+$/.test(t))return``;let r=t.lastIndexOf(`@`);return`${t.slice(0,r)}@${t.slice(r+1).toLowerCase()}`}var Ye=e=>{let t=A(e);return t?t.slice(t.lastIndexOf(`@`)+1):``};function Xe(e){let t=String(e??``).trim().toLowerCase();return t=t.replace(/^[a-z]+:\/\//,``).replace(/[/?#].*$/,``).replace(/:\d+$/,``).replace(/\.$/,``),t.includes(`@`)&&(t=t.slice(t.lastIndexOf(`@`)+1)),t=t.replace(/^www\./,``),/^(?=.{4,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z][a-z0-9-]{0,62}[a-z0-9]$/.test(t)?t:``}function j(){let e=(process.env.ADMIN_EMAILS||process.env.VITE_ADMIN_EMAILS||``).match(/[^\s<>,;"'()]+@[^\s<>,;"'()]+/g)||[];return[...new Set(e.map(e=>A(e).toLowerCase()).filter(Boolean))]}var Ze=e=>{let[t,n]=String(e).split(`@`);return n?`${t.slice(0,1)}•••@${n}`:`•••`},Qe=15e3,$e=null;async function M(e=!1){if(!e&&$e&&Date.now()-$e.at<Qe)return $e.data;let t;try{t=await C(S(),`sys_configs`,`email`)}catch{t=$e?.data??null}return $e={at:Date.now(),data:t},t}var et=e=>e?.enabled!==!1;async function tt(){let e=await M();return{receipts:e?.receipts!==!1,saleAlerts:e?.saleAlerts!==!1}}async function nt(e,t={}){let n=await fetch(`${Ke}${e}`,{method:t.method||`GET`,headers:{Authorization:`Bearer ${k()}`,...t.body===void 0?{}:{"Content-Type":`application/json`}},...t.body===void 0?{}:{body:JSON.stringify(t.body)},signal:AbortSignal.timeout(1e4)}),r=await n.json().catch(()=>({}));return{status:n.status,body:r}}function rt(e,t){if(e>=200&&e<300)return`works`;let n=String(t?.name||``);return e===401&&n===`restricted_api_key`?`sending-only`:e===401||e===403||e===400&&/api key/i.test(String(t?.message||``))?`refused`:`unknown`}var it=e=>(Array.isArray(e?.data)?e.data:[]).map(e=>({id:String(e?.id||``),name:Xe(e?.name),status:String(e?.status||``)})).filter(e=>e.id&&e.name),at=6e4,ot=1e4,st=e=>(0,u.createHash)(`sha256`).update(e).digest(`hex`).slice(0,16),N=null,ct=null,lt=null;async function ut(e=!1){let t=k();if(!t)return{key:`refused`,domains:[]};let n=st(t);if(!e&&N&&N.mark===n){let e=N.answer.key===`unknown`?ot:at;if(Date.now()-N.at<e)return N.answer}if(lt)return lt;lt=(async()=>{let e;try{let{status:t,body:n}=await nt(`/domains?limit=100`),r=rt(t,n);e={key:r,domains:r===`works`?it(n):[]}}catch{e={key:`unknown`,domains:[]}}return e.key===`unknown`&&ct?.mark===n?e=ct.answer:e.key!==`unknown`&&(ct={mark:n,answer:e}),N={at:Date.now(),mark:n,answer:e},e})();try{return await lt}finally{lt=null}}function dt(e){let t=Xe(e?.name),n=(Array.isArray(e?.records)?e.records:[]).filter(e=>String(e?.record||``).toLowerCase()!==`tracking`).map(e=>{let n=String(e?.name||``).trim().toLowerCase().replace(/\.$/,``),r=!n||n===`@`||n===t?t:n.endsWith(`.${t}`)?n:`${n}.${t}`,i=e?.priority===void 0||e?.priority===null||e?.priority===``?null:Number(e.priority);return{record:String(e?.record||``),type:String(e?.type||``).toUpperCase(),name:r===t?`@`:r.slice(0,-(t.length+1)),fullName:r,value:String(e?.value||``),priority:Number.isFinite(i)?i:null,status:String(e?.status||``)}}).filter(e=>e.type&&e.value);return{id:String(e?.id||``),name:t,status:String(e?.status||``),records:n}}function ft(){N=null}var pt=null,mt=(e,t)=>!!t&&e.some(e=>e.name===t&&e.status===`verified`);async function ht(){let e=k(),t=A(process.env.EMAIL_FROM),n=e?await M():null,r=A(n?.from),i=Xe(n?.domain),a={from:qe,verified:!1,how:`practice`};if(!e)return t&&!Je(t)?{from:t,verified:!1,how:`env`}:a;let o=await ut(),s=st(e);if(o.key===`unknown`&&pt?.mark===s)return pt.sender;let c;if(t)c={from:t,verified:Je(t)?!1:o.key===`works`?mt(o.domains,Ye(t)):o.key!==`refused`,how:`env`};else if(o.key===`works`){let e=o.domains.filter(e=>e.status===`verified`).map(e=>e.name);c=r&&e.includes(Ye(r))?{from:r,verified:!0,how:`chosen`}:i&&e.includes(i)?{from:`hello@${i}`,verified:!0,how:`domain`}:a}else c=o.key===`sending-only`&&r&&!Je(r)?{from:r,verified:!0,how:`chosen`}:a;return o.key!==`unknown`&&(pt={mark:s,sender:c}),c}function gt(){return pt?.sender.from||A(process.env.EMAIL_FROM)||`onboarding@resend.dev`}async function _t(){return!k()||!et(await M())||(await ut()).key===`refused`?!1:(await ht()).verified}var vt=e=>e?.ownerMailWho===`me`?`me`:`admins`,yt=e=>(0,u.createHmac)(`sha256`,e).update(`your-ai-firebase owner mail v1`).digest();function bt(e,t){let n=(0,u.randomBytes)(12),r=(0,u.createCipheriv)(`aes-256-gcm`,t,n);return[`v1`,n,Buffer.concat([r.update(JSON.stringify({me:e.me,admins:e.admins}),`utf8`),r.final()]),r.getAuthTag()].map(e=>typeof e==`string`?e:e.toString(`base64url`)).join(`.`)}function xt(e,t){let n=typeof e==`string`?e.split(`.`):[];if(n.length!==4||n[0]!==`v1`)return null;try{let[e,r,i]=n.slice(1).map(e=>Buffer.from(e,`base64url`)),a=(0,u.createDecipheriv)(`aes-256-gcm`,t,e,{authTagLength:16});a.setAuthTag(i);let o=JSON.parse(Buffer.concat([a.update(r),a.final()]).toString(`utf8`));return{me:A(o?.me).toLowerCase(),admins:(Array.isArray(o?.admins)?o.admins:[]).map(e=>A(e).toLowerCase()).filter(Boolean)}}catch{return null}}var St=(e,t)=>{let n=new Set(e?.me?[e.me]:[]);return j().forEach(e=>n.add(e)),e&&t===`admins`&&e.admins.forEach(e=>n.add(e)),[...n]};async function Ct(){let e=k(),t=e?await M():null;return St(e?xt(t?.ownerMail,yt(e)):null,vt(t))}async function wt(){let e=A(process.env.EMAIL_REPLY_TO);if(e)return e;let t=k();return(t?xt((await M())?.ownerMail,yt(t)):null)?.me||j()[0]||void 0}var Tt=e=>e?.role===`admin`&&e?.inactive!==!0&&e?.removed!==!0?A(e.email).toLowerCase():``;async function Et(e,t,n){let r=yt(k()),i=await M(!0),a=xt(i?.ownerMail,r),o=e.email&&e.emailVerified?A(e.email).toLowerCase():``;o||=A((await C(S(),`user_profiles`,e.uid,t).catch(()=>null))?.email).toLowerCase();let s;try{s=(await oe(S(),`user_profiles`,t)).map(e=>Tt(e.data)).filter(Boolean)}catch{s=a?.admins||[]}o&&!s.includes(o)&&s.push(o),s=[...new Set(s)].sort();let c=j().map(e=>e.toLowerCase()),l=a?.me&&(s.includes(a.me)||c.includes(a.me))?a.me:``,u=n?o||l:l||o,d=n||vt(i);return{sealed:a&&a.me===u&&a.admins.join(`,`)===s.join(`,`)&&d===vt(i)?null:bt({me:u,admins:s},r),who:d,me:u,count:St({me:u,admins:s},d).length}}var P={"no-key":`Email is not connected yet: RESEND_KEY is not in your app’s secrets.`,off:`Email is switched off on the Email screen.`,"wrong-key":`Resend did not accept your key. Make a new one in Resend with Full access and paste it as RESEND_KEY.`,unverified:`Your domain is not verified yet, so Resend will not send from it. Check its three records on the Email screen.`,practice:`Mail still goes out from Resend’s practice address, which only reaches the address your Resend account was made with. Verify your domain on the Email screen to reach anyone else.`,"too-many":`Too many emails went out in a short time. Wait a few minutes and try again.`,unreachable:`Resend could not be reached. Try again in a moment.`,nobody:`There was nobody to send it to.`,other:`Resend would not send this email. Try again in a moment.`};function Dt(e,t){let n=String(t?.name||``),r=String(t?.message||``);return e===429?`too-many`:/testing emails|your own email address/i.test(r)?`practice`:/not verified|verify a domain/i.test(r)?`unverified`:/api.?key/i.test(n)||/api key/i.test(r)||e===401?`wrong-key`:e>=500?`unreachable`:`other`}var Ot=null;function kt(e,t){Ot={at:Date.now(),to:e.map(Ze).join(`, `),cause:t,reason:P[t]}}var At=()=>Ot;function jt(){$e=null,N=null,ct=null,lt=null,pt=null,Ot=null}var Mt=`https://api.resend.com/emails`;function Nt(){return gt()}var Pt={appName:``,logoUrl:``,appUrl:``,accent:`#7c3aed`,foreground:`#1e1b4b`,buttonText:``,buttonGradient:[],panelBg:``,panelBorder:``};function Ft(e,t){let n=String(e??``).trim();return/^#(?:[0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(n)?n:t}function It(e){let t=String(e??``).trim();return t.length>2e3||/[\s"'<>]/.test(t)?``:/^https?:\/\/[^/]+/i.test(t)?t:``}function Lt(e){return String(e??``).replace(/[\r\n\t<>]/g,` `).replace(/\s+/g,` `).trim().slice(0,60)}function Rt(e){let t=e&&typeof e==`object`?e:{},n=Array.isArray(t.buttonGradient)?t.buttonGradient.map(e=>Ft(e,``)).filter(Boolean).slice(0,2):[];return{appName:Lt(t.appName),logoUrl:It(t.logoUrl),appUrl:It(t.appUrl),accent:Ft(t.accent,Pt.accent),foreground:Ft(t.foreground,Pt.foreground),buttonText:Ft(t.buttonText,``),buttonGradient:n,panelBg:Ft(t.panelBg,``),panelBorder:Ft(t.panelBorder,``)}}function zt(e){let t=e.replace(`#`,``);if(t.length===3&&(t=t.split(``).map(e=>e+e).join(``)),t.length<6)return null;let n=parseInt(t.slice(0,6),16);return Number.isNaN(n)?null:[n>>16&255,n>>8&255,n&255]}function Bt(e,t,n=[255,255,255]){let r=zt(e);return r?`#`+r.map((e,r)=>Math.round(e+(n[r]-e)*t)).map(e=>e.toString(16).padStart(2,`0`)).join(``):e}function Vt(e){let t=zt(e);return t?(.299*t[0]+.587*t[1]+.114*t[2])/255:1}function Ht(e,t=`#1f2937`,n=`#ffffff`){return Vt(e)>.6?t:n}function Ut(e){let t=e.accent,n=Vt(e.foreground)>.55?Pt.foreground:e.foreground,r=e.buttonGradient[0]||Bt(t,.22,[0,0,0]),i=e.buttonGradient[1]||(e.buttonGradient[0]?e.buttonGradient[0]:t),a=e.panelBg||Bt(t,.94);return{accent:t,text:n,muted:`#6b7280`,faint:`#9ca3af`,g0:r,g1:i,btnFg:e.buttonText||Ht(r),panelBg:a,panelBorder:e.panelBorder||(e.panelBg?Bt(e.panelBg,.12,[0,0,0]):Bt(t,.84)),hr:Bt(t,.88)}}var F={test:{audience:`admins`,look:`notification`,kicker:`Test`,subject:`Test email from {{appName}}`,title:`{{appName}} can send email`,opener:`{{appName}} can send email`,body:`This is a test. If you are reading it, the connection works and every email your app sends will look like this one.
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./chunk-CiTBaPhY.cjs`),t=require(`./schedule-BAea6q8_.cjs`),n=require(`./bookingHold-DhS-tuuC.cjs`),r=require(`./tabAudience-2fJAN1aD.cjs`),i=require(`./soldLines-BGtA9Oub.cjs`),a=require(`./recordPrice-Cy7Km-eX.cjs`),o=require(`./appIcons-C90OKlV5.cjs`),s=require(`./aiModels-DzYPysSf.cjs`);let c=require(`node:fs`);c=e.a(c,1);let l=require(`express`);l=e.a(l,1);let u=require(`node:crypto`),d=require(`stripe`);d=e.a(d,1);var f=`https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com`,p=60;function m(e,t,n,r=Math.floor(Date.now()/1e3)){return n?e.alg===`RS256`?e.kid?t.aud===n?t.iss===`https://securetoken.google.com/${n}`?t.sub?t.sub.length>128?`Token subject is not a valid uid.`:typeof t.exp!=`number`||t.exp<=r?`Token has expired.`:typeof t.iat!=`number`||t.iat>r+p?`Token was issued in the future.`:null:`Token has no subject.`:`Token has the wrong issuer.`:`Token was issued for a different Firebase project.`:`Token has no key id.`:`Token is not signed with RS256.`:`The server does not know its Firebase project id.`}function h(e){return Buffer.from(e.replace(/-/g,`+`).replace(/_/g,`/`),`base64`)}function g(e){let t=String(e||``).split(`.`);if(t.length!==3)return null;try{return{header:JSON.parse(h(t[0]).toString(`utf8`)),claims:JSON.parse(h(t[1]).toString(`utf8`)),signed:`${t[0]}.${t[1]}`,signature:h(t[2])}}catch{return null}}var _=null,v=null;async function y(){if(_&&_.expiresAt>Date.now())return _.keys;v||=b().finally(()=>{v=null});try{return await v}catch(e){if(_)return _.keys;throw e}}async function b(){let e=await fetch(f,{signal:AbortSignal.timeout(5e3)});if(!e.ok)throw Error(`Could not fetch Google signing keys (${e.status}).`);let t=await e.json(),n=/max-age=(\d+)/.exec(e.headers.get(`cache-control`)||``);return _={keys:t,expiresAt:Date.now()+(n?Number(n[1]):3600)*1e3},t}async function x(e,t){let n=g(e);if(!n)throw Error(`That is not a valid sign-in token.`);let r=m(n.header,n.claims,t);if(r)throw Error(r);let i=(await y())[n.header.kid];if(!i)throw Error(`Token was signed with a key Google no longer publishes.`);let a=(0,u.createVerify)(`RSA-SHA256`);if(a.update(n.signed),a.end(),!a.verify(i,n.signature))throw Error(`Token signature does not check out.`);return{uid:n.claims.sub,email:n.claims.email||null,emailVerified:!!n.claims.email_verified,signInProvider:n.claims.firebase?.sign_in_provider||null}}function S(){return(process.env.VITE_FIREBASE_PROJECT_ID||process.env.FIREBASE_PROJECT_ID||``).trim()}var ee=`https://firestore.googleapis.com/v1`;function te(e){return e==null?null:`stringValue`in e?e.stringValue:`integerValue`in e?Number(e.integerValue):`doubleValue`in e?e.doubleValue:`booleanValue`in e?e.booleanValue:`timestampValue`in e?e.timestampValue:`nullValue`in e?null:`mapValue`in e?ne(e.mapValue?.fields||{}):`arrayValue`in e?(e.arrayValue?.values||[]).map(te):null}function ne(e){let t={};for(let[n,r]of Object.entries(e||{}))t[n]=te(r);return t}function re(e,t){let n=`${e}/${t}`.split(`/`);if(n.length%2!=0)return`That is not a document path.`;for(let e of n)if(!e||e===`.`||e===`..`||!/^[A-Za-z0-9_.@~+-]+$/.test(e))return`That is not a document path.`;return null}var ie=1e4;async function C(e,t,n,r){let i=re(t,n);if(i)throw Error(i);let a=`${ee}/projects/${e}/databases/(default)/documents/${t}/${n}`,o=await fetch(a,{headers:r?{Authorization:`Bearer ${r}`}:{},signal:AbortSignal.timeout(ie)});if(o.status===404)return null;if(o.status===403)throw Error(`You do not have permission to read that record.`);if(!o.ok)throw Error(`Firestore refused the read (${o.status}).`);return ne((await o.json()).fields||{})}var ae=50;async function oe(e,t,n){if(!/^[A-Za-z0-9_.@~+-]+$/.test(t)||t===`.`||t===`..`)throw Error(`That is not a collection.`);let r=[],i=``;for(let a=0;a<ae;a++){let a=`${ee}/projects/${e}/databases/(default)/documents/${t}?pageSize=300${i?`&pageToken=${encodeURIComponent(i)}`:``}`,o=await fetch(a,{headers:n?{Authorization:`Bearer ${n}`}:{},signal:AbortSignal.timeout(ie)});if(o.status===403)throw Error(`You do not have permission to read those records.`);if(!o.ok)throw Error(`Firestore refused the read (${o.status}).`);let s=await o.json();for(let e of s.documents||[])r.push({id:String(e.name||``).split(`/`).pop()||``,data:ne(e.fields||{})});let c=typeof s.nextPageToken==`string`?s.nextPageToken:``;if(!c)return r;if(c===i)break;i=c}throw Error(`There are too many records to read.`)}var se=[`email`,`Email`,`emailAddress`,`email_address`,`userEmail`,`contactEmail`,`submitterEmail`];function ce(e){let t=[];for(let n of se){let r=e[n];typeof r==`string`&&r.includes(`@`)&&t.push(r.trim())}return t}function le(e){for(let t of se){let n=e[t];if(typeof n==`string`&&n.includes(`@`))return n.trim()}return null}var ue=4320*60*1e3,de=new Set([`user`,`users`,`free`,`guest`,`guests`,`internal`,`admin`,`admins`,`public`,`owner`,`team`,`member`,`members`,`none`,`role`,`roles`]),fe=e=>typeof e==`string`&&/^[a-z][a-z0-9]{1,23}$/.test(e)&&!de.has(e),pe=e=>(0,u.createHmac)(`sha256`,e).update(`your-ai-firebase plan roles v1`).digest(`hex`),me=(e,t,n,r)=>(0,u.createHash)(`sha256`).update(`${e}:${t}:${n}:${r}`).digest(`hex`);function he(e){let t=new Map;for(let n of e){let e=Array.isArray(n?.plans)?n.plans:[];for(let n of e){let e=String(n?.roleId||``);if(fe(e))for(let r of[n?.monthly,n?.yearly])for(let n of[r?.priceId,r?.livePriceId]){let r=String(n||``).trim();r&&t.set(r,e)}}}return t}var ge=e=>he(e).size>0;function _e(e,t,n){let r=null;for(let i of e){if(!i.active||!i.priceId)continue;let e=t.get(i.priceId);if(!e)continue;let a=typeof i.currentPeriodEnd==`number`?i.currentPeriodEnd*1e3:n,o=Math.round(Math.max(a,n)+ue);(!r||o>r.until)&&(r={role:e,until:o})}return r}var ve=null;function w(){return(process.env.STRIPE_SECRET_KEY||``).trim()}function ye(){let e=w();return e?e.startsWith(`sk_live_`)?`live`:`test`:null}function T(){let e=w();if(!e)throw Error(`STRIPE_SECRET_KEY is not set.`);return ve||=new d.default(e),ve}var be=4e3,xe=null;async function Se(e=T,t=Date.now()){let n=w();if(!n)return null;xe?.key!==n&&(xe={key:n,currency:null,failedAt:null,pending:null});let r=xe;return r.currency?r.currency:r.pending?r.pending:r.failedAt!==null&&t-r.failedAt<6e4?null:(r.pending=Promise.resolve().then(()=>e().accounts.retrieveCurrent(void 0,{timeout:be,maxNetworkRetries:0})).then(e=>{let t=String(e?.default_currency||``).trim().toLowerCase();if(!/^[a-z]{3}$/.test(t))throw Error(`The account named no currency.`);return r.currency=t,r.failedAt=null,t}).catch(()=>(r.failedAt=t,null)).finally(()=>{r.pending=null}),r.pending)}async function Ce(e,t=T){return(typeof e==`string`?e.trim().toLowerCase():``)||await Se(t)||`usd`}function we(e){let t=e.currency,n=0;for(let r of Array.isArray(e.lines)?e.lines:[]){let e=Number(r?.amount),i=Number(r?.quantity);if(!Number.isFinite(e)||!Number.isInteger(i))return NaN;n+=E(e,t)*i}for(let r of Array.isArray(e.extras)?e.extras:[]){let e=Number(r?.amount);if(!Number.isFinite(e))return NaN;n+=e<0?-E(-e,t):E(e,t)}return D(n,t)}var Te=Number(process.env.STRIPE_MAX_ADHOC_AMOUNT||1e4),Ee=.5;function De(e){let{priceId:t,amount:n,mode:r=`payment`,quantity:i=1}=e||{};if(!t&&n===void 0)return`This button does not say what is being sold.`;if(t&&n!==void 0)return`A payment has either a Stripe price or an amount, not both.`;if(r!==`payment`&&r!==`subscription`)return`A payment is either one-time or a subscription.`;if(!Number.isInteger(i)||i<1||i>999)return`Quantity must be a whole number between 1 and 999.`;if(n!==void 0){if(r===`subscription`)return`A subscription needs a price created in Stripe — a typed amount cannot recur.`;if(typeof n!=`number`||!Number.isFinite(n))return`That amount is not a number.`;if(n<.5)return`The smallest amount that can be charged is ${Ee}.`;if(n>Te)return`That amount is above the ${Te} limit for typed prices. Use a price created in Stripe.`;if(!e.productName||!String(e.productName).trim())return`A typed amount needs a name for what is being bought.`}if(t&&!/^price_[A-Za-z0-9]+$/.test(t))return`That does not look like a Stripe price id.`;if(e.lines!==void 0){if(t)return`A basket of lines is charged by its amounts, not a Stripe price.`;if(!Array.isArray(e.lines)||!e.lines.length)return`The basket has no lines in it.`;if(e.lines.length>100)return`A basket can hold at most 100 lines.`;for(let t of e.lines){if(!t||typeof t!=`object`)return`A basket line is not a line.`;if(!String(t.name||``).trim())return`A basket line has no name.`;let e=Number(t.amount);if(!Number.isFinite(e)||e<0)return`A basket line has a price that is not a number.`;if(!Number.isInteger(t.quantity)||t.quantity<1||t.quantity>999)return`A basket line needs a whole quantity between 1 and 999.`;if(t.collection!==void 0&&!/^pub_[A-Za-z0-9_]{1,120}$/.test(String(t.collection)))return`A basket line names a collection that is not a public one.`}if(e.extras!==void 0&&!Array.isArray(e.extras))return`The extras on the basket are not a list.`;for(let t of e.extras||[])if(!t||typeof t!=`object`||!Number.isFinite(Number(t.amount)))return`An extra on the basket is not a number.`;if(Math.abs(we(e)-Number(n))>.011)return`The basket’s lines do not add up to its total.`}return null}var Oe=new Set([`bif`,`clp`,`djf`,`gnf`,`jpy`,`kmf`,`krw`,`mga`,`pyg`,`rwf`,`ugx`,`vnd`,`vuv`,`xaf`,`xof`,`xpf`]),ke=new Set([`bhd`,`jod`,`kwd`,`omr`,`tnd`]),Ae=e=>String(e||`usd`).toLowerCase();function E(e,t){let n=Ae(t);return Oe.has(n)?Math.round(e):ke.has(n)?Math.round(e*100)*10:Math.round(e*100)}function D(e,t){if(e==null)return null;let n=Ae(t);return Oe.has(n)?e:ke.has(n)?e/1e3:e/100}function je(e,t,n){let r=String(e||``).replace(/\/+$/,``),i=(e,t)=>{let n=String(e||t);return n.startsWith(`/`)?n:`/${n}`},a=i(t,`/payment-complete`);return{success:`${r}${a}${a.includes(`?`)?`&`:`?`}session_id={CHECKOUT_SESSION_ID}`,cancel:`${r}${i(n,`/payment-cancelled`)}`}}function Me(e){return e===`active`||e===`trialing`||e===`past_due`}var Ne=(e,t,r,i)=>(0,u.createHash)(`sha256`).update(n.d(e,t,r,i)).digest(`hex`),Pe=(e,t)=>`${e}__${String(t).replace(/[-:]/g,``).slice(0,15)}`,Fe=/^[A-Za-z0-9_-]{1,100}$/,Ie=/^cs_[A-Za-z0-9_]{1,250}$/,Le=12,O=(e,t)=>({status:e,error:t});function Re(e){if(!Array.isArray(e)||!e.length)return`Say which times are being paid for.`;if(e.length>Le)return`That is more people than one meeting can hold.`;let t=[];for(let r of e){let e=String(r?.bookingId||``),i=String(r?.scheduleId||``);if(!n.p(e)||!Fe.test(i))return`One of those times could not be read.`;if(t.some(t=>t.bookingId===e))return`The same time was named twice.`;t.push({bookingId:e,scheduleId:i})}return t}async function ze(e,t){let r=Re(e.legs);if(typeof r==`string`)return O(400,r);let i=String(e.when||``).trim().slice(0,300),a=(t.now||Date.now)(),[o,s]=await Promise.all([Promise.all(r.map(e=>t.read(`pub_bookings`,e.bookingId))),Promise.all(r.map(e=>t.read(`sys_schedules`,e.scheduleId)))]),c=-1;for(let e=0;e<r.length;e+=1){let t=o[e],i=s[e];if(!t)return O(409,`That time is no longer held for you — pick it again.`);if(!i)return O(404,`That booking link is no longer open.`);let a=String(t.memberId||``);if(!a||a!==String(i.memberId||``)||Pe(a,String(t.start||``))!==r[e].bookingId)return O(400,`That time does not belong to that booking link.`);if(i.enabled!==!0)return O(409,`This is not taking bookings at the moment.`);if(n.u(t)||t.letGo)return O(409,`That time is no longer held for you — pick it again.`);let l=n.c(t);if(c!==-1&&l!==c)return O(400,`Those times were not held together — pick them again.`);c=l}let l=c-a;if(c&&(l<21e5||l>216e5))return O(400,`The time could not be held long enough to pay. Check the date and time on this device, then try again.`);let u=n._(s.map(e=>({paymentId:String(e?.paymentId||``)})));if(!u.length)return O(400,`There is nothing to pay for this booking.`);let d=await Promise.all(u.map(e=>t.read(`sys_payments`,e))),f=e=>[...new Set(s.filter(t=>String(t?.paymentId||``)===e).map(e=>String(e?.memberName||``).trim()).filter(Boolean))].join(`, `),p=t.currency?await t.currency():`usd`,m=[],h=0;for(let e=0;e<u.length;e+=1){let t=n.g(d[e]);if(!t)return O(409,`The payment for this booking is not set up yet — ask whoever sent you the link.`);let i=f(u[e]),a=`${n.h(d[e])}${r.length>1&&i?` — ${i}`:``}`.slice(0,250),o=E(t,p);m.push({quantity:1,price_data:{currency:p,product_data:{name:a},unit_amount:o}}),h+=o}let g=D(h,p);if(h<50)return O(409,`The payment for this booking is below what can be charged by card.`);let _=s[0]||{},v=`${String(_.name||``).trim()||n.h(d[0])}${i?` — ${i}`:``}`.slice(0,450),y=e=>s.some(t=>t?.[e]!==!1)?`yes`:`no`,b=String(e.email||``).trim().slice(0,254),x=String(e.name||``).trim().slice(0,200);return{lineItems:m,metadata:{bookingId:r[0].bookingId,[n.t]:r.map(e=>e.bookingId).join(`,`).slice(0,500),...c?{[n.o]:String(c)}:{},scheduleId:r[0].scheduleId,productName:v,...i?{when:i}:{},...x?{name:x}:{},...b?{email:b}:{},emailReceipt:y(`confirmBooker`),notifyOwner:y(`notifyOwner`)},expiresAt:Math.floor((a+n.n)/1e3),total:g,currency:p,productName:v}}async function Be(e,t){try{await e.checkout.sessions.expire(t)}catch{}}var Ve=10;async function He(e,t,r){let i=Math.floor((r-n.r-10*6e4)/1e3),a=Math.ceil((r-n.i+10*6e4)/1e3),o=[],s;for(let c=0;c<Ve;c+=1){let c=await e.checkout.sessions.list({created:{gte:i,lte:a},limit:100,starting_after:s});for(let e of c.data)n.s(e.metadata).includes(t)&&n.f(e.metadata)===r&&o.push(e);if(!c.has_more||!c.data.length)break;s=c.data[c.data.length-1].id}return o}async function Ue(e,t,r){if(!n.p(e))return O(400,`That time could not be read.`);if(t&&!Ie.test(t))return O(400,`That payment could not be read.`);let i=(r.now||Date.now)(),a=await r.read(`pub_bookings`,e);if(!a)return{state:`gone`};let o=n.c(a);if(!o||n.u(a))return{state:`kept`};let s=r.stripe();if(t){let r=await s.checkout.sessions.retrieve(t),i=r.metadata||{};if(!n.s(i).includes(e)||n.f(i)!==o)return O(404,`That payment is not for this time.`);r.status===`open`&&await Be(s,t)}let c=await He(s,e,o);if(c.some(e=>e.status===`complete`))return{state:`paid`,pass:Ne(r.key(),e,o,`paid`)};let l=c.filter(e=>e.status===`open`&&e.id!==t);if(l.length){if(i<o)return{state:`open`};for(let e of l)await Be(s,e.id)}return!c.length&&i<o?{state:`open`}:{state:`free`,pass:Ne(r.key(),e,o,`free`)}}function We(e,t){if(e.status!==`complete`||!t)return{};let r=e.metadata||{},i=n.f(r);if(!i)return{};let a={};for(let e of n.s(r))a[e]=Ne(t,e,i,`paid`);return a}function Ge(e,t){e.post(`/payments/booking-checkout`,async(e,n)=>{let r=e.body||{},i=await t.paymentsOff()||await t.limited(e);if(i)return t.fail(n,i.status,i.error);let a=await t.origin(e,r.origin);if(!a)return t.fail(n,400,`The page did not say where to send the payer back to.`);try{let i=await ze(r,t);if(`error`in i)return t.fail(n,i.status,i.error);let{uid:o,...s}=await t.payer(e,i.metadata),c=String(r.successPath||``).split(`?`)[0].slice(0,200),l={...i.metadata,...c?{page:c}:{},...o?{uid:o}:{}};t.stamp(l);let u=t.returnUrls(a,String(r.successPath||``),String(r.cancelPath||``)),d={mode:`payment`,line_items:i.lineItems,success_url:u.success,cancel_url:u.cancel,expires_at:i.expiresAt,allow_promotion_codes:!0,...s,metadata:l,payment_intent_data:{metadata:l,description:i.productName}},f=t.stripe(),p=await f.checkout.sessions.create(d).catch(e=>{if(!d.customer_email||e?.param!==`customer_email`)throw e;return f.checkout.sessions.create({...d,customer_email:void 0})});return n.json({success:!0,sessionId:p.id,url:p.url,amount:i.total,currency:i.currency})}catch(e){return t.sendError(n,e)}}),e.post(`/payments/booking-hold`,async(e,n)=>{let r=e.body||{},i=await t.holdLimited(e);if(i)return t.fail(n,i.status,i.error);try{let e=await Ue(String(r.bookingId||``),String(r.sessionId||``),t);return`error`in e?t.fail(n,e.status,e.error):n.json({success:!0,...e})}catch(e){return t.sendError(n,e)}})}var Ke=`https://api.resend.com`;function k(){return(process.env.RESEND_KEY||process.env.RESEND_API_KEY||``).trim()}var qe=`onboarding@resend.dev`,Je=e=>String(e||``).trim().toLowerCase().endsWith(`@resend.dev`);function A(e){let t=String(e??``).trim(),n=t.match(/<([^<>]*)>/);if(n&&(t=n[1]),t=t.replace(/^["'\s]+|["'\s]+$/g,``),!/^[^\s@<>"',;()]+@[^\s@<>"',;()]+\.[^\s@<>"',;()]+$/.test(t))return``;let r=t.lastIndexOf(`@`);return`${t.slice(0,r)}@${t.slice(r+1).toLowerCase()}`}var Ye=e=>{let t=A(e);return t?t.slice(t.lastIndexOf(`@`)+1):``};function Xe(e){let t=String(e??``).trim().toLowerCase();return t=t.replace(/^[a-z]+:\/\//,``).replace(/[/?#].*$/,``).replace(/:\d+$/,``).replace(/\.$/,``),t.includes(`@`)&&(t=t.slice(t.lastIndexOf(`@`)+1)),t=t.replace(/^www\./,``),/^(?=.{4,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z][a-z0-9-]{0,62}[a-z0-9]$/.test(t)?t:``}function j(){let e=(process.env.ADMIN_EMAILS||process.env.VITE_ADMIN_EMAILS||``).match(/[^\s<>,;"'()]+@[^\s<>,;"'()]+/g)||[];return[...new Set(e.map(e=>A(e).toLowerCase()).filter(Boolean))]}var Ze=e=>{let[t,n]=String(e).split(`@`);return n?`${t.slice(0,1)}•••@${n}`:`•••`},Qe=15e3,$e=null;async function M(e=!1){if(!e&&$e&&Date.now()-$e.at<Qe)return $e.data;let t;try{t=await C(S(),`sys_configs`,`email`)}catch{t=$e?.data??null}return $e={at:Date.now(),data:t},t}var et=e=>e?.enabled!==!1;async function tt(){let e=await M();return{receipts:e?.receipts!==!1,saleAlerts:e?.saleAlerts!==!1}}async function nt(e,t={}){let n=await fetch(`${Ke}${e}`,{method:t.method||`GET`,headers:{Authorization:`Bearer ${k()}`,...t.body===void 0?{}:{"Content-Type":`application/json`}},...t.body===void 0?{}:{body:JSON.stringify(t.body)},signal:AbortSignal.timeout(1e4)}),r=await n.json().catch(()=>({}));return{status:n.status,body:r}}function rt(e,t){if(e>=200&&e<300)return`works`;let n=String(t?.name||``);return e===401&&n===`restricted_api_key`?`sending-only`:e===401||e===403||e===400&&/api key/i.test(String(t?.message||``))?`refused`:`unknown`}var it=e=>(Array.isArray(e?.data)?e.data:[]).map(e=>({id:String(e?.id||``),name:Xe(e?.name),status:String(e?.status||``)})).filter(e=>e.id&&e.name),at=6e4,ot=1e4,st=e=>(0,u.createHash)(`sha256`).update(e).digest(`hex`).slice(0,16),N=null,ct=null,lt=null;async function ut(e=!1){let t=k();if(!t)return{key:`refused`,domains:[]};let n=st(t);if(!e&&N&&N.mark===n){let e=N.answer.key===`unknown`?ot:at;if(Date.now()-N.at<e)return N.answer}if(lt)return lt;lt=(async()=>{let e;try{let{status:t,body:n}=await nt(`/domains?limit=100`),r=rt(t,n);e={key:r,domains:r===`works`?it(n):[]}}catch{e={key:`unknown`,domains:[]}}return e.key===`unknown`&&ct?.mark===n?e=ct.answer:e.key!==`unknown`&&(ct={mark:n,answer:e}),N={at:Date.now(),mark:n,answer:e},e})();try{return await lt}finally{lt=null}}function dt(e){let t=Xe(e?.name),n=(Array.isArray(e?.records)?e.records:[]).filter(e=>String(e?.record||``).toLowerCase()!==`tracking`).map(e=>{let n=String(e?.name||``).trim().toLowerCase().replace(/\.$/,``),r=!n||n===`@`||n===t?t:n.endsWith(`.${t}`)?n:`${n}.${t}`,i=e?.priority===void 0||e?.priority===null||e?.priority===``?null:Number(e.priority);return{record:String(e?.record||``),type:String(e?.type||``).toUpperCase(),name:r===t?`@`:r.slice(0,-(t.length+1)),fullName:r,value:String(e?.value||``),priority:Number.isFinite(i)?i:null,status:String(e?.status||``)}}).filter(e=>e.type&&e.value);return{id:String(e?.id||``),name:t,status:String(e?.status||``),records:n}}function ft(){N=null}var pt=null,mt=(e,t)=>!!t&&e.some(e=>e.name===t&&e.status===`verified`);async function ht(){let e=k(),t=A(process.env.EMAIL_FROM),n=e?await M():null,r=A(n?.from),i=Xe(n?.domain),a={from:qe,verified:!1,how:`practice`};if(!e)return t&&!Je(t)?{from:t,verified:!1,how:`env`}:a;let o=await ut(),s=st(e);if(o.key===`unknown`&&pt?.mark===s)return pt.sender;let c;if(t)c={from:t,verified:Je(t)?!1:o.key===`works`?mt(o.domains,Ye(t)):o.key!==`refused`,how:`env`};else if(o.key===`works`){let e=o.domains.filter(e=>e.status===`verified`).map(e=>e.name);c=r&&e.includes(Ye(r))?{from:r,verified:!0,how:`chosen`}:i&&e.includes(i)?{from:`hello@${i}`,verified:!0,how:`domain`}:a}else c=o.key===`sending-only`&&r&&!Je(r)?{from:r,verified:!0,how:`chosen`}:a;return o.key!==`unknown`&&(pt={mark:s,sender:c}),c}function gt(){return pt?.sender.from||A(process.env.EMAIL_FROM)||`onboarding@resend.dev`}async function _t(){return!k()||!et(await M())||(await ut()).key===`refused`?!1:(await ht()).verified}var vt=e=>e?.ownerMailWho===`me`?`me`:`admins`,yt=e=>(0,u.createHmac)(`sha256`,e).update(`your-ai-firebase owner mail v1`).digest();function bt(e,t){let n=(0,u.randomBytes)(12),r=(0,u.createCipheriv)(`aes-256-gcm`,t,n);return[`v1`,n,Buffer.concat([r.update(JSON.stringify({me:e.me,admins:e.admins}),`utf8`),r.final()]),r.getAuthTag()].map(e=>typeof e==`string`?e:e.toString(`base64url`)).join(`.`)}function xt(e,t){let n=typeof e==`string`?e.split(`.`):[];if(n.length!==4||n[0]!==`v1`)return null;try{let[e,r,i]=n.slice(1).map(e=>Buffer.from(e,`base64url`)),a=(0,u.createDecipheriv)(`aes-256-gcm`,t,e,{authTagLength:16});a.setAuthTag(i);let o=JSON.parse(Buffer.concat([a.update(r),a.final()]).toString(`utf8`));return{me:A(o?.me).toLowerCase(),admins:(Array.isArray(o?.admins)?o.admins:[]).map(e=>A(e).toLowerCase()).filter(Boolean)}}catch{return null}}var St=(e,t)=>{let n=new Set(e?.me?[e.me]:[]);return j().forEach(e=>n.add(e)),e&&t===`admins`&&e.admins.forEach(e=>n.add(e)),[...n]};async function Ct(){let e=k(),t=e?await M():null;return St(e?xt(t?.ownerMail,yt(e)):null,vt(t))}async function wt(){let e=A(process.env.EMAIL_REPLY_TO);if(e)return e;let t=k();return(t?xt((await M())?.ownerMail,yt(t)):null)?.me||j()[0]||void 0}var Tt=e=>e?.role===`admin`&&e?.inactive!==!0&&e?.removed!==!0?A(e.email).toLowerCase():``;async function Et(e,t,n){let r=yt(k()),i=await M(!0),a=xt(i?.ownerMail,r),o=e.email&&e.emailVerified?A(e.email).toLowerCase():``;o||=A((await C(S(),`user_profiles`,e.uid,t).catch(()=>null))?.email).toLowerCase();let s;try{s=(await oe(S(),`user_profiles`,t)).map(e=>Tt(e.data)).filter(Boolean)}catch{s=a?.admins||[]}o&&!s.includes(o)&&s.push(o),s=[...new Set(s)].sort();let c=j().map(e=>e.toLowerCase()),l=a?.me&&(s.includes(a.me)||c.includes(a.me))?a.me:``,u=n?o||l:l||o,d=n||vt(i);return{sealed:a&&a.me===u&&a.admins.join(`,`)===s.join(`,`)&&d===vt(i)?null:bt({me:u,admins:s},r),who:d,me:u,count:St({me:u,admins:s},d).length}}var P={"no-key":`Email is not connected yet: RESEND_KEY is not in your app’s secrets.`,off:`Email is switched off on the Email screen.`,"wrong-key":`Resend did not accept your key. Make a new one in Resend with Full access and paste it as RESEND_KEY.`,unverified:`Your domain is not verified yet, so Resend will not send from it. Check its three records on the Email screen.`,practice:`Mail still goes out from Resend’s practice address, which only reaches the address your Resend account was made with. Verify your domain on the Email screen to reach anyone else.`,"too-many":`Too many emails went out in a short time. Wait a few minutes and try again.`,unreachable:`Resend could not be reached. Try again in a moment.`,nobody:`There was nobody to send it to.`,other:`Resend would not send this email. Try again in a moment.`};function Dt(e,t){let n=String(t?.name||``),r=String(t?.message||``);return e===429?`too-many`:/testing emails|your own email address/i.test(r)?`practice`:/not verified|verify a domain/i.test(r)?`unverified`:/api.?key/i.test(n)||/api key/i.test(r)||e===401?`wrong-key`:e>=500?`unreachable`:`other`}var Ot=null;function kt(e,t){Ot={at:Date.now(),to:e.map(Ze).join(`, `),cause:t,reason:P[t]}}var At=()=>Ot;function jt(){$e=null,N=null,ct=null,lt=null,pt=null,Ot=null}var Mt=`https://api.resend.com/emails`;function Nt(){return gt()}var Pt={appName:``,logoUrl:``,appUrl:``,accent:`#7c3aed`,foreground:`#1e1b4b`,buttonText:``,buttonGradient:[],panelBg:``,panelBorder:``};function Ft(e,t){let n=String(e??``).trim();return/^#(?:[0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(n)?n:t}function It(e){let t=String(e??``).trim();return t.length>2e3||/[\s"'<>]/.test(t)?``:/^https?:\/\/[^/]+/i.test(t)?t:``}function Lt(e){return String(e??``).replace(/[\r\n\t<>]/g,` `).replace(/\s+/g,` `).trim().slice(0,60)}function Rt(e){let t=e&&typeof e==`object`?e:{},n=Array.isArray(t.buttonGradient)?t.buttonGradient.map(e=>Ft(e,``)).filter(Boolean).slice(0,2):[];return{appName:Lt(t.appName),logoUrl:It(t.logoUrl),appUrl:It(t.appUrl),accent:Ft(t.accent,Pt.accent),foreground:Ft(t.foreground,Pt.foreground),buttonText:Ft(t.buttonText,``),buttonGradient:n,panelBg:Ft(t.panelBg,``),panelBorder:Ft(t.panelBorder,``)}}function zt(e){let t=e.replace(`#`,``);if(t.length===3&&(t=t.split(``).map(e=>e+e).join(``)),t.length<6)return null;let n=parseInt(t.slice(0,6),16);return Number.isNaN(n)?null:[n>>16&255,n>>8&255,n&255]}function Bt(e,t,n=[255,255,255]){let r=zt(e);return r?`#`+r.map((e,r)=>Math.round(e+(n[r]-e)*t)).map(e=>e.toString(16).padStart(2,`0`)).join(``):e}function Vt(e){let t=zt(e);return t?(.299*t[0]+.587*t[1]+.114*t[2])/255:1}function Ht(e,t=`#1f2937`,n=`#ffffff`){return Vt(e)>.6?t:n}function Ut(e){let t=e.accent,n=Vt(e.foreground)>.55?Pt.foreground:e.foreground,r=e.buttonGradient[0]||Bt(t,.22,[0,0,0]),i=e.buttonGradient[1]||(e.buttonGradient[0]?e.buttonGradient[0]:t),a=e.panelBg||Bt(t,.94);return{accent:t,text:n,muted:`#6b7280`,faint:`#9ca3af`,g0:r,g1:i,btnFg:e.buttonText||Ht(r),panelBg:a,panelBorder:e.panelBorder||(e.panelBg?Bt(e.panelBg,.12,[0,0,0]):Bt(t,.84)),hr:Bt(t,.88)}}var F={test:{audience:`admins`,look:`notification`,kicker:`Test`,subject:`Test email from {{appName}}`,title:`{{appName}} can send email`,opener:`{{appName}} can send email`,body:`This is a test. If you are reading it, the connection works and every email your app sends will look like this one.
|
|
2
2
|
|
|
3
3
|
Sent {{now}}.`,button:{label:`Open the app`},description:`Proves the connection works. Goes to whoever pressed Send yourself a test email.`},new_submission:{audience:`admins`,look:`notification`,kicker:`New form entry`,subject:`New {{formName}} submission`,title:`Someone filled in {{formName}}`,opener:`Someone filled in {{formName}}`,body:`{{summary}}`,facts:[[`Name`,`{{name}}`],[`Email`,`{{email}}`]],button:{label:`Open the inbox`,path:`/inbox`},description:`Lets you know someone filled in a form.`},submission_received:{audience:`record`,look:`text`,kicker:`Received`,subject:`We got your message`,title:`We got your message`,greeting:`Hi {{name}},`,body:`{{note}}`,stock:`Thanks for getting in touch — we have your message and will come back to you shortly.`,description:`Tells the person who wrote in that their message arrived.`},booking_requested:{audience:`record`,look:`text`,kicker:`Requested`,subject:`We have your booking request — {{when}}`,title:`Your booking request is in`,greeting:`Hi {{name}},`,body:`You asked for {{when}} with {{memberName}}. The time is held for you while it is confirmed — we will let you know as soon as it is.`,facts:[[`When`,`{{when}}`],[`With`,`{{memberName}}`],[`What`,`{{scheduleName}}`]],description:`Tells the person who booked that the request is in and the time is held.`},booking_confirmed:{audience:`record`,look:`text`,kicker:`Booked`,subject:`Your booking is confirmed — {{when}}`,title:`Your booking is confirmed`,greeting:`Hi {{name}},`,body:`Your time is booked: {{when}} with {{memberName}}. We look forward to seeing you.`,facts:[[`When`,`{{when}}`],[`With`,`{{memberName}}`],[`What`,`{{scheduleName}}`]],description:`Tells the person who booked that the time is theirs.`},booking_cancelled:{audience:`record`,look:`text`,kicker:`Cancelled`,subject:`Your booking was cancelled — {{when}}`,title:`Your booking was cancelled`,greeting:`Hi {{name}},`,body:`{{when}} with {{memberName}} is no longer going ahead.
|
|
4
4
|
|
package/dist/server.es.js
CHANGED
|
@@ -3,7 +3,7 @@ import { _ as l, c as u, d, f, g as p, h as m, i as h, n as g, o as _, p as v, r
|
|
|
3
3
|
import { a as te, t as ne } from "./tabAudience-DJ6H5Uth.js";
|
|
4
4
|
import { a as re, o as ie, r as ae, t as oe } from "./soldLines-Ci-FLIrS.js";
|
|
5
5
|
import { t as se } from "./recordPrice-C4nFKZLy.js";
|
|
6
|
-
import { a as ce, g as le, m as ue, o as de, t as fe, v as pe, y as me } from "./appIcons-
|
|
6
|
+
import { a as ce, g as le, m as ue, o as de, t as fe, v as pe, y as me } from "./appIcons-CCArfCDe.js";
|
|
7
7
|
import { a as he, c as ge, i as _e, l as ve, n as ye, o as be, r as xe, s as Se, t as Ce } from "./aiModels-DuNFHWRS.js";
|
|
8
8
|
import * as we from "node:fs";
|
|
9
9
|
import Te from "express";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Mn as e, li as t } from "./TimeZoneField-
|
|
2
|
-
import { r as n } from "./serviceSwitches-
|
|
1
|
+
import { Mn as e, li as t } from "./TimeZoneField-oIMwb5_X.js";
|
|
2
|
+
import { r as n } from "./serviceSwitches-CZHwvVfP.js";
|
|
3
3
|
import { useCallback as r, useEffect as i, useRef as a, useState as o } from "react";
|
|
4
4
|
//#region src/lib/serviceStatus.ts
|
|
5
5
|
var s = "The server could not be reached.";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-
|
|
1
|
+
require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-Ckn1pKAL.cjs`),t=require(`./serviceSwitches-mhJbQBrV.cjs`);let n=require(`react`);var r=`The server could not be reached.`;function i(t,i,a=0,o=!1){let[c,l]=(0,n.useState)(null),[u,d]=(0,n.useState)(``),f=(0,n.useRef)(!0);(0,n.useEffect)(()=>(f.current=!0,()=>{f.current=!1}),[]);let p=(0,n.useRef)(i);(0,n.useEffect)(()=>{p.current=i},[i]);let m=(0,n.useCallback)(async()=>{try{let n=o?await e.li?.currentUser?.getIdToken().catch(()=>null):null,r=await(await fetch(t,n?{headers:{Authorization:`Bearer ${n}`}}:void 0)).json();if(t===s.payments&&e.Mn(r),!f.current)return;l(p.current(r)),d(``)}catch{f.current&&d(r)}},[t,o]);return(0,n.useEffect)(()=>{if(m(),!a)return;let e=setInterval(m,a);return()=>clearInterval(e)},[m,a]),{status:c,error:u,reread:m}}var a=e=>({configured:!!e?.configured,mode:e?.mode===`live`||e?.mode===`test`?e.mode:null,webhookConfigured:!!e?.webhookConfigured}),o=e=>{let t=Number(e?.ownerCount??e?.adminCount)||0,n=e?.lastRefusal;return{configured:!!e?.configured,enabled:e?.enabled!==!1,key:e?.key===`works`||e?.key===`sending-only`||e?.key===`refused`?e.key:null,from:e?.from??null,senderVerified:e?.senderVerified===!0,domain:typeof e?.domain==`string`&&e.domain?e.domain:null,ownerCount:t,adminCount:t,receipts:e?.receipts!==!1,saleAlerts:e?.saleAlerts!==!1,lastRefusal:n&&typeof n.reason==`string`?{at:Number(n.at)||0,to:String(n.to||``),cause:String(n.cause||``),reason:n.reason}:null}},s={email:`/api/email/status`,payments:`/api/payments/status`,ai:`/api/ai/status`},c=(e=0)=>i(s.payments,a,e),l=(e=0,t=!1)=>i(s.email,o,e,t),u=e=>({configured:!!e?.configured&&e?.key!==`refused`,practice:e?.senderVerified===!1}),d=5e3;function f(e){let r=i(s[e],u),a=t.r(e),{error:o,reread:c}=r;return(0,n.useEffect)(()=>{if(!o)return;let e=setInterval(()=>{c()},d);return()=>clearInterval(e)},[o,c]),{loading:r.status===null||a.loading,configured:r.status?.configured===!0,on:a.on,...e===`email`?{practice:r.status?.practice===!0}:{}}}Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Pn as e, ui as t } from "./TimeZoneField-
|
|
1
|
+
import { Pn as e, ui as t } from "./TimeZoneField-oIMwb5_X.js";
|
|
2
2
|
import "./aiModels-DuNFHWRS.js";
|
|
3
3
|
import { useEffect as n, useState as r } from "react";
|
|
4
4
|
import { doc as i, onSnapshot as a, setDoc as o } from "firebase/firestore";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-
|
|
1
|
+
require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-Ckn1pKAL.cjs`);require(`./aiModels-DzYPysSf.cjs`);let t=require(`react`),n=require(`firebase/firestore`);function r(){a()}var i=new Map;function a(){i.clear()}var o={email:{collection:`sys_configs`,doc:`email`},payments:{collection:`sys_payments`,doc:`_settings`},ai:{collection:`sys_configs`,doc:`ai`},chat:{collection:`sys_configs`,doc:`chat`}},s={email:!0,payments:!0,ai:!0,chat:!1},c=(e,t=!0)=>typeof e?.enabled==`boolean`?e.enabled:t;function l(i){let{collection:a,doc:l}=o[i],u=s[i],[d,f]=(0,t.useState)({loading:!0,on:u});return(0,t.useEffect)(()=>(0,n.onSnapshot)((0,n.doc)(e.ui,a,l),e=>f({loading:!1,on:c(e.exists()?e.data():null,u)}),()=>f({loading:!1,on:u})),[a,l,u]),{loading:d.loading,on:d.on,set:async t=>{let o=d.on;f({loading:!1,on:t});try{return await(0,n.setDoc)((0,n.doc)(e.ui,a,l),{enabled:t},{merge:!0}),i===`payments`&&e.Pn(),i===`ai`&&r(),null}catch{return f({loading:!1,on:o}),`The switch could not be saved. Check that you are signed in as an admin.`}}}}function u(){let{collection:r,doc:i}=o.email,[a,s]=(0,t.useState)({loading:!0,receipts:!0,saleAlerts:!0});(0,t.useEffect)(()=>(0,n.onSnapshot)((0,n.doc)(e.ui,r,i),e=>{let t=e.exists()?e.data():null;s({loading:!1,receipts:t?.receipts!==!1,saleAlerts:t?.saleAlerts!==!1})},()=>s(e=>({...e,loading:!1}))),[r,i]);let c=async(t,o)=>{let c=a[t];s(e=>({...e,loading:!1,[t]:o}));try{return await(0,n.setDoc)((0,n.doc)(e.ui,r,i),{[t]:o},{merge:!0}),null}catch{return s(e=>({...e,[t]:c})),`The switch could not be saved. Check that you are signed in as an admin.`}};return{...a,set:c}}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});
|
package/dist/vite.cjs.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./chunk-CiTBaPhY.cjs`),t=require(`./appIcons-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./chunk-CiTBaPhY.cjs`),t=require(`./appIcons-C90OKlV5.cjs`);let n=require(`node:fs`);n=e.a(n,1);let r=require(`node:path`);r=e.a(r,1);var i=`// OWNED BY YOUR AI FIREBASE — edits to this file are discarded by the build.`,a=`virtual:your-ai-firebase/registries`,o=`${i}
|
|
2
2
|
import { lazy, type ComponentType } from 'react';
|
|
3
3
|
import { FirebaseOS } from 'your-ai-workflow-firebase-os';
|
|
4
4
|
|
package/dist/vite.es.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as e, D as t, E as n, S as r, T as i, _ as a, a as o, b as s, c, d as l, f as u, g as d, h as f, i as p, l as m, m as h, n as g, p as _, r as v, s as y, t as b, u as x, v as S, w as C, x as w, y as T } from "./appIcons-
|
|
1
|
+
import { C as e, D as t, E as n, S as r, T as i, _ as a, a as o, b as s, c, d as l, f as u, g as d, h as f, i as p, l as m, m as h, n as g, p as _, r as v, s as y, t as b, u as x, v as S, w as C, x as w, y as T } from "./appIcons-CCArfCDe.js";
|
|
2
2
|
import * as E from "node:fs";
|
|
3
3
|
import * as D from "node:path";
|
|
4
4
|
//#region src/vite/canonical.ts
|