@tebuto/react-booking-widget 1.1.1 → 1.2.0
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/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/package.json +1 -1
package/dist/esm/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsxs as e,jsx as t,Fragment as n}from"react/jsx-runtime";import{createContext as r,useMemo as o,useContext as i,useState as a,useCallback as l,useEffect as s,useRef as c}from"react";var d=function(){return d=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},d.apply(this,arguments)};function u(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{s(r.next(e))}catch(e){i(e)}}function l(e){try{s(r.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((r=r.apply(e,t||[])).next())}))}function g(e,t){var n,r,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},a=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return a.next=l(0),a.throw=l(1),a.return=l(2),"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function l(l){return function(s){return function(l){if(n)throw new TypeError("Generator is already executing.");for(;a&&(a=0,l[0]&&(i=0)),i;)try{if(n=1,r&&(o=2&l[0]?r.return:l[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,l[1])).done)return o;switch(r=0,o&&(l=[2&l[0],o.value]),l[0]){case 0:case 1:o=l;break;case 4:return i.label++,{value:l[1],done:!1};case 5:i.label++,r=l[1],l=[0];continue;case 7:l=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==l[0]&&2!==l[0])){i=0;continue}if(3===l[0]&&(!o||l[1]>o[0]&&l[1]<o[3])){i.label=l[1];break}if(6===l[0]&&i.label<o[1]){i.label=o[1],o=l;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(l);break}o[2]&&i.ops.pop(),i.trys.pop();continue}l=t.call(e,i)}catch(e){l=[6,e],r=0}finally{n=o=0}if(5&l[0])throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}([l,s])}}}"function"==typeof SuppressedError&&SuppressedError;function b(n){var r=n.noScriptText,o=void 0===r?"Widget konnte nicht geladen werden. Möglicherweise ist Skripting im Browser deaktiviert.":r,i=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n}(n,["noScriptText"]);return e("div",{id:"tebuto-booking-widget","data-testid":"tebuto-booking-widget-container",children:[t(f,{config:i}),t("noscript",{"data-testid":"tebuto-booking-widget-noscript",children:o})]})}function f(e){var n=function(e){var t,n,r,o,i={"data-therapist-uuid":e.therapistUUID},a=null!==(t=e.backgroundColor)&&void 0!==t?t:null===(n=e.theme)||void 0===n?void 0:n.backgroundColor;a&&(i["data-background-color"]=a),e.categories&&e.categories.length>0&&(i["data-categories"]=e.categories.join(",")),void 0!==e.border&&(i["data-border"]=e.border?"true":"false"),void 0!==e.includeSubusers&&(i["data-include-subusers"]=e.includeSubusers?"true":"false"),void 0!==e.showQuickFilters&&(i["data-show-quick-filters"]=e.showQuickFilters?"true":"false");var l=null!==(r=e.inheritFont)&&void 0!==r?r:null===(o=e.theme)||void 0===o?void 0:o.inheritFont;return void 0!==l&&(i["data-inherit-font"]=l?"true":"false"),e.theme&&function(e,t){t.primaryColor&&(e["data-primary-color"]=t.primaryColor),t.textPrimary&&(e["data-text-primary"]=t.textPrimary),t.textSecondary&&(e["data-text-secondary"]=t.textSecondary),t.borderColor&&(e["data-border-color"]=t.borderColor),t.fontFamily&&(e["data-font-family"]=t.fontFamily)}(i,e.theme),i}(e.config);return t("script",d({src:"https://widget.tebuto.de/booking.js"},n,{"data-testid":"tebuto-booking-widget-script"}))}var p=r(null);function h(e){var n=e.therapistUUID,r=e.apiBaseUrl,i=void 0===r?"https://api.tebuto.de":r,a=e.categories,l=e.includeSubusers,s=e.children,c=o((function(){return{therapistUUID:n,apiBaseUrl:i,categories:a,includeSubusers:l,buildUrl:function(e){return"".concat(i).concat(e)}}}),[n,i,a,l]);return t(p.Provider,{value:c,children:s})}function v(){var e=i(p);if(!e)throw new Error("useTebutoContext must be used within a TebutoProvider");return e}function m(){var e=this,t=v(),n=t.therapistUUID,r=t.buildUrl,o=a({data:null,isLoading:!0,error:null}),i=o[0],c=o[1],b=l((function(){return u(e,void 0,void 0,(function(){var e,t,o,i;return g(this,(function(a){switch(a.label){case 0:c((function(e){return d(d({},e),{isLoading:!0,error:null})})),a.label=1;case 1:return a.trys.push([1,4,,5]),[4,fetch(r("/therapists/uuid/".concat(n)))];case 2:if(!(e=a.sent()).ok)throw new Error("Failed to fetch therapist: ".concat(e.statusText));return[4,e.json()];case 3:return t=a.sent(),c({data:t,isLoading:!1,error:null}),[3,5];case 4:return o=a.sent(),i=o instanceof Error?o:new Error("Unknown error occurred"),c({data:null,isLoading:!1,error:i}),[3,5];case 5:return[2]}}))}))}),[n,r]);return s((function(){b()}),[b]),d(d({},i),{refetch:b})}function y(e){var t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return"".concat(t,"-").concat(n,"-").concat(r)}function k(e){var t=new Date(e.start),n=new Date(e.end),r=new Date,o=new Date(r.getFullYear(),r.getMonth(),r.getDate()),i=new Date(t.getFullYear(),t.getMonth(),t.getDate()),a=Math.round((n.getTime()-t.getTime())/6e4);return d(d({},e),{dateKey:y(t),timeString:t.toLocaleTimeString("de-DE",{hour:"2-digit",minute:"2-digit"}),durationMinutes:a,formattedPrice:new Intl.NumberFormat("de-DE",{style:"currency",currency:"EUR"}).format(Number.parseFloat(e.price)),isToday:i.getTime()===o.getTime(),isPast:t<r})}function x(e){var t,n,r,i=this;void 0===e&&(e={});var c=e.autoFetch,b=void 0===c||c,f=e.categories,p=v(),h=p.therapistUUID,m=p.buildUrl,x=p.categories,w=a({data:null,isLoading:b,error:null}),S=w[0],D=w[1],I=null!=f?f:x,T=null!==(t=null==I?void 0:I.join(","))&&void 0!==t?t:"",C=l((function(){return u(i,void 0,void 0,(function(){var e,t,n,r,o;return g(this,(function(i){switch(i.label){case 0:D((function(e){return d(d({},e),{isLoading:!0,error:null})})),i.label=1;case 1:return i.trys.push([1,4,,5]),e=new URL(m("/events/".concat(h))),T&&e.searchParams.set("categories",T),[4,fetch(e.toString())];case 2:if(!(t=i.sent()).ok)throw new Error("Failed to fetch slots: ".concat(t.statusText));return[4,t.json()];case 3:return n=i.sent(),D({data:n,isLoading:!1,error:null}),[3,5];case 4:return r=i.sent(),o=r instanceof Error?r:new Error("Unknown error occurred"),D({data:null,isLoading:!1,error:o}),[3,5];case 5:return[2]}}))}))}),[h,m,T]);s((function(){b&&C()}),[b,C]);var R=o((function(){if(!S.data)return{};for(var e={},t=new Date,n=0,r=S.data;n<r.length;n++){var o=r[n],i=new Date(o.start);if(!(i<=t))e[a=y(i)]||(e[a]=[]),e[a].push(o)}for(var a in e)e[a].sort((function(e,t){return new Date(e.start).getTime()-new Date(t.start).getTime()}));return e}),[S.data]),L=o((function(){return Object.keys(R).map((function(e){return new Date(e)})).sort((function(e,t){return e.getTime()-t.getTime()}))}),[R]),z=l((function(e){var t,n=y(e);return(null!==(t=R[n])&&void 0!==t?t:[]).map(k)}),[R]),F=o((function(){if(!S.data)return[];for(var e=new Map,t=0,n=S.data;t<n.length;t++){var r=n[t];e.has(r.eventCategoryId)||e.set(r.eventCategoryId,{id:r.eventCategoryId,name:r.title,color:r.color})}return Array.from(e.values())}),[S.data]);return d(d({},S),{refetch:C,slotsByDate:R,availableDates:L,getSlotsForDate:z,categories:F,totalSlots:null!==(r=null===(n=S.data)||void 0===n?void 0:n.length)&&void 0!==r?r:0})}function w(){var e=this,t=v(),n=t.therapistUUID,r=t.buildUrl,o=a({claimedSlot:null,claimResponse:null,isLoading:!1,error:null}),i=o[0],s=o[1],b=c(null),f=l((function(){return u(e,void 0,void 0,(function(){return g(this,(function(e){switch(e.label){case 0:if(!i.claimedSlot||!b.current)return s((function(e){return d(d({},e),{claimedSlot:null,claimResponse:null})})),[2];e.label=1;case 1:return e.trys.push([1,3,4,5]),[4,fetch(r("/events/".concat(n,"/unclaim")),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({start:i.claimedSlot.start,eventRuleId:i.claimedSlot.eventRuleId})})];case 2:case 3:return e.sent(),[3,5];case 4:return b.current=null,s((function(e){return d(d({},e),{claimedSlot:null,claimResponse:null})})),[7];case 5:return[2]}}))}))}),[i.claimedSlot,n,r]),p=l((function(t){return u(e,void 0,void 0,(function(){var e,o,a,l,c;return g(this,(function(u){switch(u.label){case 0:return e="".concat(t.start,"-").concat(t.eventRuleId),b.current===e&&i.claimResponse?[2,i.claimResponse]:b.current&&b.current!==e?[4,f()]:[3,2];case 1:u.sent(),u.label=2;case 2:s((function(e){return d(d({},e),{isLoading:!0,error:null})})),u.label=3;case 3:return u.trys.push([3,6,,7]),[4,fetch(r("/events/".concat(n,"/claim")),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({start:t.start,end:t.end,eventRuleId:t.eventRuleId})})];case 4:if(!(o=u.sent()).ok)throw new Error("Failed to claim slot: ".concat(o.statusText));return[4,o.json()];case 5:return(a=u.sent()).isAvailable?(b.current=e,s({claimedSlot:t,claimResponse:a,isLoading:!1,error:null}),[2,a]):(s((function(e){return d(d({},e),{isLoading:!1,error:new Error("This time slot is no longer available")})})),[2,null]);case 6:return l=u.sent(),c=l instanceof Error?l:new Error("Unknown error occurred"),s((function(e){return d(d({},e),{isLoading:!1,error:c})})),[2,null];case 7:return[2]}}))}))}),[n,r,f,i.claimResponse]),h=l((function(e){return!!i.claimedSlot&&(i.claimedSlot.start===e.start&&i.claimedSlot.eventRuleId===e.eventRuleId)}),[i.claimedSlot]),m=l((function(){s((function(e){return d(d({},e),{error:null})}))}),[]);return d(d({},i),{claim:p,unclaim:f,isClaimed:h,clearError:m})}function S(){var e=this,t=v(),n=t.therapistUUID,r=t.buildUrl,o=a({booking:null,isLoading:!1,error:null,isSuccess:!1}),i=o[0],s=o[1],c=l((function(t){return u(e,void 0,void 0,(function(){var e,o,i,a,l,c,u;return g(this,(function(g){switch(g.label){case 0:e=t.slot,o=t.client,i=t.locationSelection,s((function(e){return d(d({},e),{isLoading:!0,error:null})})),g.label=1;case 1:return g.trys.push([1,4,,5]),[4,fetch(r("/events/".concat(n,"/book")),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(d({start:e.start,end:e.end,eventRuleId:e.eventRuleId,locationSelection:null!=i?i:e.location},o))})];case 2:if(!(a=g.sent()).ok)throw new Error("Booking failed: ".concat(a.statusText));return[4,a.json()];case 3:return l=g.sent(),s({booking:l,isLoading:!1,error:null,isSuccess:!0}),[2,l];case 4:return c=g.sent(),u=c instanceof Error?c:new Error("Unknown error occurred"),s((function(e){return d(d({},e),{isLoading:!1,error:u,isSuccess:!1})})),[2,null];case 5:return[2]}}))}))}),[n,r]),b=l((function(){s({booking:null,isLoading:!1,error:null,isSuccess:!1})}),[]),f=l((function(){var e;if(null===(e=i.booking)||void 0===e?void 0:e.ics){var t=new Blob([i.booking.ics],{type:"text/calendar;charset=utf-8"}),n=window.URL.createObjectURL(t),r=document.createElement("a");r.href=n,r.setAttribute("download","appointment.ics"),document.body.appendChild(r),r.click(),document.body.removeChild(r),window.URL.revokeObjectURL(n)}}),[i.booking]);return d(d({},i),{book:c,reset:b,downloadCalendar:f})}function D(e){var t,n,r,i=this;void 0===e&&(e={});var s=e.onBookingComplete,c=e.onError,d=a("loading"),b=d[0],f=d[1],p=a(null),h=p[0],v=p[1],y=a(null),k=y[0],D=y[1],I=a(null),T=I[0],C=I[1],R=m(),L=x({categories:e.categories}),z=w(),F=S();o((function(){"loading"!==b||R.isLoading||L.isLoading||(R.error||L.error?f("error"):f("date-selection"))}),[b,R.isLoading,L.isLoading,R.error,L.error]);var j=o((function(){return h?L.getSlotsForDate(h):[]}),[h,L]),U=l((function(e){v(e),D(null),C(null),e&&f("time-selection")}),[v,D,C,f]),E=l((function(e){return u(i,void 0,void 0,(function(){return g(this,(function(t){switch(t.label){case 0:return e?[3,2]:[4,z.unclaim()];case 1:return t.sent(),D(null),C(null),[2,!0];case 2:return[4,z.claim(e)];case 3:return t.sent()?(D(e),"not-fixed"!==e.location&&C(e.location),f("booking-form"),[2,!0]):(z.error&&(null==c||c(z.error)),[2,!1])}}))}))}),[z,c]),W=l((function(e){return u(i,void 0,void 0,(function(){var t;return g(this,(function(n){switch(n.label){case 0:return k?[4,F.book({slot:k,client:e,locationSelection:null!=T?T:k.location})]:[2,!1];case 1:return(t=n.sent())?(null==s||s(t),f("confirmation"),[2,!0]):(F.error&&(null==c||c(F.error)),[2,!1])}}))}))}),[k,T,F,s,c]),B=l((function(){f("loading"),v(null),D(null),C(null),F.reset(),z.unclaim(),L.refetch()}),[F,z,L]),O=l((function(e){f(e)}),[]),N=l((function(e){C(e)}),[]),M=R.isLoading||L.isLoading||z.isLoading||F.isLoading,P=null!==(r=null!==(n=null!==(t=R.error)&&void 0!==t?t:L.error)&&void 0!==n?n:z.error)&&void 0!==r?r:F.error;return{step:b,goToStep:O,therapist:R,slots:L,selectedDate:h,selectDate:U,selectedDateSlots:j,selectedSlot:k,selectSlot:E,selectedLocation:T,setLocation:N,claim:z,booking:F,submitBooking:W,reset:B,isLoading:M,error:P}}var I={"--booking-bg":"#0f0f10","--booking-surface":"#18181b","--booking-surface-elevated":"#1f1f23","--booking-surface-hover":"#27272a","--booking-border":"#2d2d30","--booking-border-subtle":"#232326","--booking-text":"#fafafa","--booking-text-secondary":"#d4d4d8","--booking-text-muted":"#a1a1aa","--booking-text-subtle":"#71717a","--booking-accent":"#10b981","--booking-accent-hover":"#34d399","--booking-accent-muted":"rgba(16, 185, 129, 0.12)","--booking-accent-glow":"rgba(16, 185, 129, 0.25)","--booking-error":"#ef4444","--booking-error-bg":"rgba(239, 68, 68, 0.1)","--booking-radius":"10px","--booking-radius-sm":"6px","--booking-radius-lg":"14px","--booking-shadow":"0 4px 24px rgba(0, 0, 0, 0.4)","--booking-transition":"0.15s ease","--booking-font":'"Inter", -apple-system, BlinkMacSystemFont, sans-serif'};function T(){return t("div",{style:{width:32,height:32,border:"2px solid var(--booking-border)",borderTopColor:"var(--booking-accent)",borderRadius:"50%",animation:"spin 0.6s linear infinite"}})}function C(){return e("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",padding:80,gap:16},children:[t(T,{}),t("span",{style:{color:"var(--booking-text-muted)",fontSize:14},children:"Verfügbare Termine werden geladen..."})]})}function R(e){var n=e.current,r=e.total;return t("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",gap:8,marginBottom:32},children:Array.from({length:r},(function(e,r){return t("div",{style:{display:"flex",alignItems:"center",gap:8},children:t("div",{style:{width:r===n?28:10,height:10,borderRadius:5,background:r<=n?"var(--booking-accent)":"var(--booking-border)",transition:"all 0.2s ease",boxShadow:r===n?"0 0 12px var(--booking-accent-glow)":"none"}})},r)}))})}function L(n){var r=n.availableDates,i=n.selectedDate,l=n.onSelectDate,s=a((function(){return r.length>0?new Date(r[0]):new Date})),c=s[0],d=s[1],u=o((function(){return new Set(r.map((function(e){return e.toDateString()})))}),[r]),g=o((function(){for(var e=c.getFullYear(),t=c.getMonth(),n=new Date(e,t,1),r=new Date(e,t+1,0).getDate(),o=(n.getDay()+6)%7,i=[],a=[],l=0;l<o;l++)a.push(null);for(var s=1;s<=r;s++)a.push(s),7===a.length&&(i.push(a),a=[]);if(a.length>0){for(;a.length<7;)a.push(null);i.push(a)}return{year:e,month:t,daysInMonth:r,firstDayOfWeek:o,weeks:i}}),[c]),b=g.year,f=g.month,p=g.weeks,h=function(e){var t=new Date(b,f,e);return u.has(t.toDateString())},v=new Date,m=b>v.getFullYear()||b===v.getFullYear()&&f>v.getMonth();return e("div",{children:[e("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:20,padding:"0 4px"},children:[t("button",{type:"button",onClick:function(){d(new Date(b,f-1,1))},disabled:!m,style:{width:36,height:36,border:"1px solid var(--booking-border)",borderRadius:"var(--booking-radius-sm)",background:"var(--booking-surface)",color:m?"var(--booking-text)":"var(--booking-text-subtle)",cursor:m?"pointer":"not-allowed",display:"flex",alignItems:"center",justifyContent:"center",fontSize:16,transition:"var(--booking-transition)",opacity:m?1:.4},children:"‹"}),e("span",{style:{fontSize:16,fontWeight:600,color:"var(--booking-text)"},children:[["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"][f]," ",b]}),t("button",{type:"button",onClick:function(){d(new Date(b,f+1,1))},style:{width:36,height:36,border:"1px solid var(--booking-border)",borderRadius:"var(--booking-radius-sm)",background:"var(--booking-surface)",color:"var(--booking-text)",cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",fontSize:16,transition:"var(--booking-transition)"},children:"›"})]}),t("div",{style:{display:"grid",gridTemplateColumns:"repeat(7, 1fr)",gap:4,marginBottom:8},children:["Mo","Di","Mi","Do","Fr","Sa","So"].map((function(e){return t("div",{style:{textAlign:"center",fontSize:12,fontWeight:500,color:"var(--booking-text-subtle)",padding:"8px 0",textTransform:"uppercase",letterSpacing:"0.05em"},children:e},e)}))}),t("div",{style:{display:"flex",flexDirection:"column",gap:4},children:p.map((function(n,r){return t("div",{style:{display:"grid",gridTemplateColumns:"repeat(7, 1fr)",gap:4},children:n.map((function(n,r){if(null===n)return t("div",{style:{aspectRatio:"1",minHeight:44}},r);var o=h(n),a=function(e){return!!i&&new Date(b,f,e).toDateString()===i.toDateString()}(n),s=function(e){var t=new Date;return e===t.getDate()&&f===t.getMonth()&&b===t.getFullYear()}(n);return e("button",{type:"button",onClick:function(){return function(e){h(e)&&l(new Date(b,f,e))}(n)},disabled:!o,style:{aspectRatio:"1",minHeight:44,border:a?"2px solid var(--booking-accent)":s?"1px solid var(--booking-accent)":"1px solid transparent",borderRadius:"var(--booking-radius-sm)",background:a?"var(--booking-accent)":o?"var(--booking-surface-elevated)":"transparent",color:a?"#000":o?"var(--booking-text)":"var(--booking-text-subtle)",cursor:o?"pointer":"default",fontSize:14,fontWeight:a?600:o?500:400,fontFamily:"inherit",display:"flex",alignItems:"center",justifyContent:"center",transition:"var(--booking-transition)",opacity:o?1:.35,position:"relative"},children:[n,o&&!a&&t("span",{style:{position:"absolute",bottom:6,width:4,height:4,borderRadius:"50%",background:"var(--booking-accent)"}})]},r)}))},r)}))}),e("div",{style:{display:"flex",alignItems:"center",gap:20,marginTop:20,paddingTop:16,borderTop:"1px solid var(--booking-border-subtle)",fontSize:12,color:"var(--booking-text-muted)"},children:[e("div",{style:{display:"flex",alignItems:"center",gap:8},children:[t("span",{style:{width:8,height:8,borderRadius:"50%",background:"var(--booking-accent)"}}),"Termine verfügbar"]}),e("div",{style:{display:"flex",alignItems:"center",gap:8},children:[t("span",{style:{width:8,height:8,borderRadius:"50%",background:"var(--booking-text-subtle)",opacity:.35}}),"Keine Termine"]})]})]})}function z(n){var r,o=n.slots,i=n.selectedSlot,a=n.onSelectSlot,l=n.selectedDate,s=n.onBack,c=function(e){switch(e){case"virtual":return"🎥";case"onsite":return"📍";case"not-fixed":return"🔄"}},d=function(e){switch(e){case"virtual":return"Online";case"onsite":return"Vor Ort";case"not-fixed":return"Flexibel"}},u=o.reduce((function(e,t){var n=t.title;return e[n]||(e[n]=[]),e[n].push(t),e}),{});return e("div",{children:[e("div",{style:{marginBottom:24},children:[t("button",{type:"button",onClick:s,style:{display:"flex",alignItems:"center",gap:6,background:"none",border:"none",color:"var(--booking-text-muted)",fontSize:13,cursor:"pointer",padding:"4px 0",marginBottom:12,fontFamily:"inherit",transition:"var(--booking-transition)"},children:"← Zurück zum Kalender"}),e("h3",{style:{fontSize:18,fontWeight:600,color:"var(--booking-text)",margin:0,display:"flex",alignItems:"center",gap:12},children:[t("span",{style:{width:40,height:40,borderRadius:"var(--booking-radius-sm)",background:"var(--booking-accent-muted)",display:"flex",alignItems:"center",justifyContent:"center",fontSize:18},children:"🕐"}),(r=l,r.toLocaleDateString("de-DE",{weekday:"long",day:"numeric",month:"long",year:"numeric"}))]})]}),t("div",{style:{display:"flex",flexDirection:"column",gap:28},children:Object.entries(u).map((function(n){var r,o=n[0],l=n[1];return e("div",{children:[e("h4",{style:{fontSize:14,fontWeight:600,color:"var(--booking-text-secondary)",margin:"0 0 12px 0",display:"flex",alignItems:"center",gap:8},children:[t("span",{style:{width:3,height:14,borderRadius:2,background:(null===(r=l[0])||void 0===r?void 0:r.color)||"var(--booking-accent)"}}),o]}),t("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(240px, 1fr))",gap:12},children:l.map((function(n){var r=(null==i?void 0:i.start)===n.start&&(null==i?void 0:i.eventRuleId)===n.eventRuleId;return e("button",{type:"button",onClick:function(){return a(n)},style:{padding:"14px 16px",border:r?"2px solid var(--booking-accent)":"1px solid var(--booking-border)",borderRadius:"var(--booking-radius)",background:r?"var(--booking-accent-muted)":"var(--booking-surface-elevated)",cursor:"pointer",textAlign:"left",fontFamily:"inherit",transition:"var(--booking-transition)",display:"flex",alignItems:"center",justifyContent:"space-between",gap:12},children:[e("div",{style:{display:"flex",alignItems:"center",gap:12},children:[t("span",{style:{fontSize:17,fontWeight:600,color:"var(--booking-text)",fontVariantNumeric:"tabular-nums"},children:n.timeString}),e("span",{style:{fontSize:11,color:"var(--booking-text-subtle)",background:"var(--booking-surface)",padding:"4px 8px",borderRadius:4,display:"inline-flex",alignItems:"center",gap:4,whiteSpace:"nowrap",flexShrink:0},children:[c(n.location)," ",d(n.location)]})]}),t("span",{style:{fontSize:14,fontWeight:600,color:"var(--booking-accent)"},children:n.formattedPrice})]},"".concat(n.start,"-").concat(n.eventRuleId))}))})]},o)}))}),0===o.length&&t("div",{style:{textAlign:"center",padding:40,color:"var(--booking-text-muted)"},children:"Keine Termine an diesem Tag verfügbar."})]})}function F(r){var o,i=r.slot,l=r.showLocationSelector,s=r.selectedLocation,c=r.onLocationChange,u=r.onSubmit,g=r.onBack,b=r.isLoading,f=r.error,p=a({firstName:"",lastName:"",email:"",phone:"",notes:""}),h=p[0],v=p[1],m={width:"100%",padding:"14px 16px",border:"1px solid var(--booking-border)",borderRadius:"var(--booking-radius-sm)",background:"var(--booking-bg)",color:"var(--booking-text)",fontSize:15,fontFamily:"inherit",outline:"none",transition:"var(--booking-transition)",boxSizing:"border-box"},y={display:"block",fontSize:13,fontWeight:600,color:"var(--booking-text-secondary)",marginBottom:8,textTransform:"uppercase",letterSpacing:"0.03em"};return e("div",{children:[t("button",{type:"button",onClick:g,style:{display:"inline-flex",alignItems:"center",gap:6,background:"var(--booking-surface-elevated)",border:"1px solid var(--booking-border)",borderRadius:"var(--booking-radius-sm)",color:"var(--booking-text-muted)",fontSize:13,cursor:"pointer",padding:"8px 14px",marginBottom:24,fontFamily:"inherit",transition:"var(--booking-transition)"},children:"← Zurück"}),e("div",{style:{background:"linear-gradient(135deg, var(--booking-accent-muted) 0%, var(--booking-surface-elevated) 100%)",borderRadius:"var(--booking-radius-lg)",padding:24,marginBottom:28,border:"1px solid var(--booking-accent)",position:"relative",overflow:"hidden"},children:[t("div",{style:{position:"absolute",top:0,left:0,width:6,height:"100%",background:i.color||"var(--booking-accent)"}}),e("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",flexWrap:"wrap",gap:16},children:[e("div",{style:{display:"flex",alignItems:"center",gap:20},children:[t("div",{style:{width:56,height:56,borderRadius:"var(--booking-radius)",background:"var(--booking-surface)",display:"flex",alignItems:"center",justifyContent:"center",fontSize:24,border:"1px solid var(--booking-border)"},children:"📅"}),e("div",{children:[t("div",{style:{fontSize:18,fontWeight:700,color:"var(--booking-text)",marginBottom:6},children:i.title}),e("div",{style:{display:"flex",alignItems:"center",gap:16,fontSize:14,color:"var(--booking-text-muted)"},children:[e("span",{style:{display:"flex",alignItems:"center",gap:6},children:[t("span",{style:{opacity:.7},children:"📆"})," ",(o=i.start,new Date(o).toLocaleDateString("de-DE",{weekday:"short",day:"numeric",month:"short"}))]}),e("span",{style:{display:"flex",alignItems:"center",gap:6},children:[t("span",{style:{opacity:.7},children:"🕐"})," ",i.timeString," Uhr"]}),e("span",{style:{display:"flex",alignItems:"center",gap:6},children:[t("span",{style:{opacity:.7},children:"⏱"})," ",i.durationMinutes," Min."]})]})]})]}),e("div",{style:{textAlign:"right"},children:[t("div",{style:{fontSize:12,color:"var(--booking-text-muted)",marginBottom:2},children:"Preis"}),t("div",{style:{fontSize:28,fontWeight:700,color:"var(--booking-accent)"},children:i.formattedPrice})]})]})]}),l&&e("div",{style:{background:"var(--booking-surface-elevated)",borderRadius:"var(--booking-radius)",padding:20,marginBottom:28,border:"1px solid var(--booking-border)"},children:[t("div",{style:{fontSize:14,fontWeight:600,color:"var(--booking-text)",marginBottom:14},children:"Wo soll der Termin stattfinden?"}),t("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:12},children:["virtual","onsite"].map((function(n){return e("button",{type:"button",onClick:function(){return c(n)},style:{padding:"16px 20px",border:s===n?"2px solid var(--booking-accent)":"1px solid var(--booking-border)",borderRadius:"var(--booking-radius)",background:s===n?"var(--booking-accent-muted)":"var(--booking-surface)",color:"var(--booking-text)",cursor:"pointer",fontFamily:"inherit",fontSize:15,fontWeight:600,display:"flex",alignItems:"center",justifyContent:"center",gap:10,transition:"var(--booking-transition)"},children:[t("span",{style:{fontSize:20},children:"virtual"===n?"🎥":"📍"}),"virtual"===n?"Online-Termin":"Vor Ort"]},n)}))})]}),e("div",{style:{background:"var(--booking-surface-elevated)",borderRadius:"var(--booking-radius-lg)",padding:28,border:"1px solid var(--booking-border)"},children:[e("div",{style:{display:"flex",alignItems:"center",gap:14,marginBottom:24,paddingBottom:20,borderBottom:"1px solid var(--booking-border)"},children:[t("div",{style:{width:44,height:44,borderRadius:"var(--booking-radius-sm)",background:"var(--booking-accent-muted)",display:"flex",alignItems:"center",justifyContent:"center",fontSize:20},children:"👤"}),e("div",{children:[t("h3",{style:{fontSize:17,fontWeight:700,color:"var(--booking-text)",margin:0},children:"Ihre Kontaktdaten"}),t("p",{style:{fontSize:13,color:"var(--booking-text-muted)",margin:"4px 0 0 0"},children:"Wir benötigen diese Angaben für Ihre Terminbestätigung"})]})]}),f&&e("div",{style:{background:"var(--booking-error-bg)",border:"1px solid var(--booking-error)",borderRadius:"var(--booking-radius-sm)",padding:"14px 16px",marginBottom:20,color:"var(--booking-error)",fontSize:14,display:"flex",alignItems:"center",gap:10},children:[t("span",{children:"⚠️"})," ",f.message]}),e("form",{onSubmit:function(e){e.preventDefault(),u({firstName:h.firstName,lastName:h.lastName,email:h.email,phone:h.phone||void 0,notes:h.notes||void 0})},style:{display:"flex",flexDirection:"column",gap:20},children:[e("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:16},children:[e("div",{children:[t("label",{htmlFor:"booking-firstName",style:y,children:"Vorname"}),t("input",{id:"booking-firstName",type:"text",required:!0,value:h.firstName,onChange:function(e){return v((function(t){return d(d({},t),{firstName:e.target.value})}))},style:m,placeholder:"Max"})]}),e("div",{children:[t("label",{htmlFor:"booking-lastName",style:y,children:"Nachname"}),t("input",{id:"booking-lastName",type:"text",required:!0,value:h.lastName,onChange:function(e){return v((function(t){return d(d({},t),{lastName:e.target.value})}))},style:m,placeholder:"Mustermann"})]})]}),e("div",{children:[t("label",{htmlFor:"booking-email",style:y,children:"E-Mail-Adresse"}),t("input",{id:"booking-email",type:"email",required:!0,value:h.email,onChange:function(e){return v((function(t){return d(d({},t),{email:e.target.value})}))},style:m,placeholder:"max@beispiel.de"})]}),e("div",{children:[e("label",{htmlFor:"booking-phone",style:d(d({},y),{color:"var(--booking-text-muted)"}),children:["Telefonnummer ",t("span",{style:{fontWeight:400,textTransform:"none"},children:"(optional)"})]}),t("input",{id:"booking-phone",type:"tel",value:h.phone,onChange:function(e){return v((function(t){return d(d({},t),{phone:e.target.value})}))},style:m,placeholder:"+49 123 456789"})]}),e("div",{children:[e("label",{htmlFor:"booking-notes",style:d(d({},y),{color:"var(--booking-text-muted)"}),children:["Nachricht ",t("span",{style:{fontWeight:400,textTransform:"none"},children:"(optional)"})]}),t("textarea",{id:"booking-notes",value:h.notes,onChange:function(e){return v((function(t){return d(d({},t),{notes:e.target.value})}))},style:d(d({},m),{minHeight:100,resize:"vertical"}),placeholder:"Gibt es etwas, das wir vorab wissen sollten?"})]}),t("button",{type:"submit",disabled:b||l&&!s,style:{marginTop:8,padding:"18px 32px",border:"none",borderRadius:"var(--booking-radius)",background:"var(--booking-accent)",color:"#000",fontSize:16,fontWeight:700,cursor:b||l&&!s?"not-allowed":"pointer",fontFamily:"inherit",transition:"var(--booking-transition)",opacity:b||l&&!s?.5:1,display:"flex",alignItems:"center",justifyContent:"center",gap:10,boxShadow:b||l&&!s?"none":"0 4px 14px var(--booking-accent-glow)"},children:b?e(n,{children:[t(T,{})," Wird gebucht..."]}):t(n,{children:"Termin verbindlich buchen"})})]})]})]})}function j(n){var r,o=n.slot,i=n.onDownloadCalendar,a=n.onReset;return e("div",{style:{textAlign:"center",padding:"48px 24px"},children:[t("div",{style:{width:72,height:72,borderRadius:"50%",background:"var(--booking-accent-muted)",display:"flex",alignItems:"center",justifyContent:"center",margin:"0 auto 24px",fontSize:32,border:"2px solid var(--booking-accent)"},children:"✓"}),t("h2",{style:{fontSize:24,fontWeight:700,color:"var(--booking-text)",margin:"0 0 12px 0"},children:"Termin gebucht!"}),e("p",{style:{fontSize:15,color:"var(--booking-text-muted)",maxWidth:400,margin:"0 auto 32px",lineHeight:1.6},children:["Ihr Termin ",e("strong",{style:{color:"var(--booking-text)"},children:['"',o.title,'"']})," am"," ",t("strong",{style:{color:"var(--booking-text)"},children:(r=o.start,new Date(r).toLocaleDateString("de-DE",{weekday:"long",day:"numeric",month:"long",year:"numeric"}))})," um"," ",e("strong",{style:{color:"var(--booking-text)"},children:[o.timeString," Uhr"]})," wurde erfolgreich gebucht."]}),e("div",{style:{display:"flex",gap:12,justifyContent:"center",flexWrap:"wrap"},children:[t("button",{type:"button",onClick:i,style:{padding:"12px 20px",border:"none",borderRadius:"var(--booking-radius-sm)",background:"var(--booking-accent)",color:"#000",fontSize:14,fontWeight:600,cursor:"pointer",fontFamily:"inherit",display:"flex",alignItems:"center",gap:8},children:"📅 Zum Kalender hinzufügen"}),t("button",{type:"button",onClick:a,style:{padding:"12px 20px",border:"1px solid var(--booking-border)",borderRadius:"var(--booking-radius-sm)",background:"transparent",color:"var(--booking-text)",fontSize:14,fontWeight:500,cursor:"pointer",fontFamily:"inherit"},children:"Weiteren Termin buchen"})]})]})}function U(){var n,r=this,o=D(),i=o.step,a=o.goToStep,l=o.therapist,s=o.slots,c=o.selectedDate,b=o.selectDate,f=o.selectedDateSlots,p=o.selectedSlot,h=o.selectSlot,v=o.selectedLocation,m=o.setLocation,y=o.booking,k=o.submitBooking,x=o.reset,w=o.isLoading,S=o.error,T=p?d(d({},p),{dateKey:new Date(p.start).toISOString().split("T")[0],timeString:new Date(p.start).toLocaleTimeString("de-DE",{hour:"2-digit",minute:"2-digit"}),durationMinutes:Math.round((new Date(p.end).getTime()-new Date(p.start).getTime())/6e4),formattedPrice:new Intl.NumberFormat("de-DE",{style:"currency",currency:"EUR"}).format(Number.parseFloat(p.price)),isToday:!1,isPast:!1}):null;return e("div",{style:d(d({},I),{fontFamily:"var(--booking-font)",background:"var(--booking-bg)",color:"var(--booking-text)",minHeight:"100vh",padding:"40px 24px"}),children:[t("style",{children:"\n@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');\n@keyframes spin { to { transform: rotate(360deg); } }\n@keyframes fadeIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }\n"}),e("div",{style:{maxWidth:880,margin:"0 auto"},children:[e("header",{style:{textAlign:"center",marginBottom:40},children:[e("h1",{style:{fontSize:28,fontWeight:700,margin:"0 0 8px 0",color:"var(--booking-text)"},children:["Termin buchen",l.data?" bei ".concat(l.data.name):""]}),t("p",{style:{fontSize:15,color:"var(--booking-text-muted)",margin:0},children:"Wählen Sie einen passenden Termin für Ihr Anliegen"})]}),"loading"!==i&&"error"!==i&&"confirmation"!==i&&t(R,{current:function(){switch(i){case"date-selection":default:return 0;case"time-selection":return 1;case"booking-form":return 2;case"confirmation":return 3}}(),total:3}),t("div",{style:{background:"var(--booking-surface)",borderRadius:"var(--booking-radius-lg)",border:"1px solid var(--booking-border)",boxShadow:"var(--booking-shadow)",overflow:"hidden",animation:"fadeIn 0.3s ease"},children:e("div",{style:{padding:28},children:["loading"===i&&t(C,{}),"error"===i&&e("div",{style:{textAlign:"center",padding:40},children:[t("div",{style:{background:"var(--booking-error-bg)",border:"1px solid var(--booking-error)",borderRadius:"var(--booking-radius)",padding:16,marginBottom:20,color:"var(--booking-error)"},children:null!==(n=null==S?void 0:S.message)&&void 0!==n?n:"Ein Fehler ist aufgetreten"}),t("button",{type:"button",onClick:x,style:{padding:"12px 24px",border:"none",borderRadius:"var(--booking-radius-sm)",background:"var(--booking-accent)",color:"#000",fontSize:14,fontWeight:600,cursor:"pointer",fontFamily:"inherit"},children:"Erneut versuchen"})]}),"date-selection"===i&&e("div",{children:[e("h3",{style:{fontSize:18,fontWeight:600,color:"var(--booking-text)",margin:"0 0 20px 0",display:"flex",alignItems:"center",gap:12},children:[t("span",{style:{width:40,height:40,borderRadius:"var(--booking-radius-sm)",background:"var(--booking-accent-muted)",display:"flex",alignItems:"center",justifyContent:"center",fontSize:18},children:"📅"}),"Datum wählen"]}),t(L,{availableDates:s.availableDates,selectedDate:c,onSelectDate:b})]}),"time-selection"===i&&c&&t(z,{slots:f,selectedSlot:p?d(d({},p),{dateKey:"",timeString:"",durationMinutes:0,formattedPrice:"",isToday:!1,isPast:!1}):null,onSelectSlot:function(e){return u(r,void 0,void 0,(function(){return g(this,(function(t){switch(t.label){case 0:return[4,h(e)];case 1:return t.sent(),[2]}}))}))},selectedDate:c,onBack:function(){return a("date-selection")}}),"booking-form"===i&&T&&t(F,{slot:T,showLocationSelector:"not-fixed"===T.location,selectedLocation:v,onLocationChange:m,onSubmit:k,onBack:function(){return a("time-selection")},isLoading:w,error:S}),"confirmation"===i&&T&&t(j,{slot:T,onDownloadCalendar:y.downloadCalendar,onReset:x})]})})]})]})}function E(e){var n=e.therapistUUID,r=e.categories;return t(h,{therapistUUID:n,categories:r,children:t(U,{})})}export{E as CustomBookingExample,b as TebutoBookingWidget,h as TebutoProvider,x as useAvailableSlots,S as useBookAppointment,D as useBookingFlow,w as useClaimSlot,v as useTebutoContext,m as useTherapist};
|
|
1
|
+
import{jsxs as e,jsx as t,Fragment as n}from"react/jsx-runtime";import{createContext as r,useMemo as o,useContext as i,useState as a,useEffect as l,useCallback as s,useRef as c}from"react";var d=function(){return d=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},d.apply(this,arguments)};function u(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{s(r.next(e))}catch(e){i(e)}}function l(e){try{s(r.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,l)}s((r=r.apply(e,t||[])).next())}))}function g(e,t){var n,r,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},a=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return a.next=l(0),a.throw=l(1),a.return=l(2),"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function l(l){return function(s){return function(l){if(n)throw new TypeError("Generator is already executing.");for(;a&&(a=0,l[0]&&(i=0)),i;)try{if(n=1,r&&(o=2&l[0]?r.return:l[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,l[1])).done)return o;switch(r=0,o&&(l=[2&l[0],o.value]),l[0]){case 0:case 1:o=l;break;case 4:return i.label++,{value:l[1],done:!1};case 5:i.label++,r=l[1],l=[0];continue;case 7:l=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==l[0]&&2!==l[0])){i=0;continue}if(3===l[0]&&(!o||l[1]>o[0]&&l[1]<o[3])){i.label=l[1];break}if(6===l[0]&&i.label<o[1]){i.label=o[1],o=l;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(l);break}o[2]&&i.ops.pop(),i.trys.pop();continue}l=t.call(e,i)}catch(e){l=[6,e],r=0}finally{n=o=0}if(5&l[0])throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}([l,s])}}}"function"==typeof SuppressedError&&SuppressedError;function b(n){var r=n.noScriptText,o=void 0===r?"Widget konnte nicht geladen werden. Möglicherweise ist Skripting im Browser deaktiviert.":r,i=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n}(n,["noScriptText"]);return e("div",{id:"tebuto-booking-widget","data-testid":"tebuto-booking-widget-container",children:[t(f,{config:i}),t("noscript",{"data-testid":"tebuto-booking-widget-noscript",children:o})]})}function f(e){var n=function(e){var t,n,r,o,i={"data-therapist-uuid":e.therapistUUID},a=null!==(t=e.backgroundColor)&&void 0!==t?t:null===(n=e.theme)||void 0===n?void 0:n.backgroundColor;a&&(i["data-background-color"]=a),e.categories&&e.categories.length>0&&(i["data-categories"]=e.categories.join(",")),void 0!==e.border&&(i["data-border"]=e.border?"true":"false"),void 0!==e.includeSubusers&&(i["data-include-subusers"]=e.includeSubusers?"true":"false"),void 0!==e.showQuickFilters&&(i["data-show-quick-filters"]=e.showQuickFilters?"true":"false");var l=null!==(r=e.inheritFont)&&void 0!==r?r:null===(o=e.theme)||void 0===o?void 0:o.inheritFont;return void 0!==l&&(i["data-inherit-font"]=l?"true":"false"),e.theme&&function(e,t){t.primaryColor&&(e["data-primary-color"]=t.primaryColor),t.textPrimary&&(e["data-text-primary"]=t.textPrimary),t.textSecondary&&(e["data-text-secondary"]=t.textSecondary),t.borderColor&&(e["data-border-color"]=t.borderColor),t.fontFamily&&(e["data-font-family"]=t.fontFamily)}(i,e.theme),i}(e.config);return t("script",d({src:"https://widget.tebuto.de/booking.js"},n,{"data-testid":"tebuto-booking-widget-script"}))}var p="tebuto-fingerprint",h=r(null);function m(e){var n=e.therapistUUID,r=e.apiBaseUrl,i=void 0===r?"https://api.tebuto.de":r,s=e.categories,c=e.includeSubusers,d=e.children,u=function(){var e=a(""),t=e[0],n=e[1];return l((function(){if("undefined"!=typeof window){var e=sessionStorage.getItem(p);if(e)n(e);else{var t=crypto.randomUUID();sessionStorage.setItem(p,t),n(t)}}}),[]),t}(),g=o((function(){return{therapistUUID:n,apiBaseUrl:i,categories:s,includeSubusers:c,buildUrl:function(e){return"".concat(i).concat(e)},fingerprint:u}}),[n,i,s,c,u]);return t(h.Provider,{value:g,children:d})}function v(){var e=i(h);if(!e)throw new Error("useTebutoContext must be used within a TebutoProvider");return e}function y(){var e=this,t=v(),n=t.therapistUUID,r=t.buildUrl,o=a({data:null,isLoading:!0,error:null}),i=o[0],c=o[1],b=s((function(){return u(e,void 0,void 0,(function(){var e,t,o,i;return g(this,(function(a){switch(a.label){case 0:c((function(e){return d(d({},e),{isLoading:!0,error:null})})),a.label=1;case 1:return a.trys.push([1,4,,5]),[4,fetch(r("/therapists/uuid/".concat(n)))];case 2:if(!(e=a.sent()).ok)throw new Error("Failed to fetch therapist: ".concat(e.statusText));return[4,e.json()];case 3:return t=a.sent(),c({data:t,isLoading:!1,error:null}),[3,5];case 4:return o=a.sent(),i=o instanceof Error?o:new Error("Unknown error occurred"),c({data:null,isLoading:!1,error:i}),[3,5];case 5:return[2]}}))}))}),[n,r]);return l((function(){b()}),[b]),d(d({},i),{refetch:b})}function k(e){var t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return"".concat(t,"-").concat(n,"-").concat(r)}function x(e){var t=new Date(e.start),n=new Date(e.end),r=new Date,o=new Date(r.getFullYear(),r.getMonth(),r.getDate()),i=new Date(t.getFullYear(),t.getMonth(),t.getDate()),a=Math.round((n.getTime()-t.getTime())/6e4);return d(d({},e),{dateKey:k(t),timeString:t.toLocaleTimeString("de-DE",{hour:"2-digit",minute:"2-digit"}),durationMinutes:a,formattedPrice:new Intl.NumberFormat("de-DE",{style:"currency",currency:"EUR"}).format(Number.parseFloat(e.price)),isToday:i.getTime()===o.getTime(),isPast:t<r})}function w(e){var t,n,r,i=this;void 0===e&&(e={});var c=e.autoFetch,b=void 0===c||c,f=e.categories,p=v(),h=p.therapistUUID,m=p.buildUrl,y=p.categories,w=p.includeSubusers,S=p.fingerprint,D=a({data:null,isLoading:b,error:null}),I=D[0],T=D[1],C=null!=f?f:y,R=null!==(t=null==C?void 0:C.join(","))&&void 0!==t?t:"",L=s((function(){return u(i,void 0,void 0,(function(){var e,t,n,r,o;return g(this,(function(i){switch(i.label){case 0:if(!S)return[2];T((function(e){return d(d({},e),{isLoading:!0,error:null})})),i.label=1;case 1:return i.trys.push([1,4,,5]),(e=new URL(m("/events/".concat(h)))).searchParams.set("fingerprint",S),R&&e.searchParams.set("categories",R),w&&e.searchParams.set("includeSubusers","true"),[4,fetch(e.toString())];case 2:if(!(t=i.sent()).ok)throw new Error("Failed to fetch slots: ".concat(t.statusText));return[4,t.json()];case 3:return n=i.sent(),T({data:n,isLoading:!1,error:null}),[3,5];case 4:return r=i.sent(),o=r instanceof Error?r:new Error("Unknown error occurred"),T({data:null,isLoading:!1,error:o}),[3,5];case 5:return[2]}}))}))}),[h,m,R,w,S]);l((function(){b&&S&&L()}),[b,L,S]);var z=o((function(){if(!I.data)return{};for(var e={},t=new Date,n=0,r=I.data;n<r.length;n++){var o=r[n],i=new Date(o.start);if(!(i<=t))e[a=k(i)]||(e[a]=[]),e[a].push(o)}for(var a in e)e[a].sort((function(e,t){return new Date(e.start).getTime()-new Date(t.start).getTime()}));return e}),[I.data]),F=o((function(){return Object.keys(z).map((function(e){return new Date(e)})).sort((function(e,t){return e.getTime()-t.getTime()}))}),[z]),U=s((function(e){var t,n=k(e);return(null!==(t=z[n])&&void 0!==t?t:[]).map(x)}),[z]),j=o((function(){if(!I.data)return[];for(var e=new Map,t=0,n=I.data;t<n.length;t++){var r=n[t];e.has(r.eventCategoryId)||e.set(r.eventCategoryId,{id:r.eventCategoryId,name:r.title,color:r.color})}return Array.from(e.values())}),[I.data]);return d(d({},I),{refetch:L,slotsByDate:z,availableDates:F,getSlotsForDate:U,categories:j,totalSlots:null!==(r=null===(n=I.data)||void 0===n?void 0:n.length)&&void 0!==r?r:0})}function S(){var e=this,t=v(),n=t.therapistUUID,r=t.buildUrl,o=t.fingerprint,i=a({claimedSlot:null,claimResponse:null,isLoading:!1,error:null}),l=i[0],b=i[1],f=c(null),p=s((function(){return u(e,void 0,void 0,(function(){return g(this,(function(e){switch(e.label){case 0:if(!l.claimedSlot||!f.current)return b((function(e){return d(d({},e),{claimedSlot:null,claimResponse:null})})),[2];e.label=1;case 1:return e.trys.push([1,3,4,5]),[4,fetch(r("/events/".concat(n,"/unclaim")),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({fingerprint:o,start:l.claimedSlot.start,end:l.claimedSlot.end,eventRuleId:l.claimedSlot.eventRuleId})})];case 2:case 3:return e.sent(),[3,5];case 4:return f.current=null,b((function(e){return d(d({},e),{claimedSlot:null,claimResponse:null})})),[7];case 5:return[2]}}))}))}),[l.claimedSlot,n,r,o]),h=s((function(t){return u(e,void 0,void 0,(function(){var e,i,a,s,c;return g(this,(function(u){switch(u.label){case 0:return e="".concat(t.start,"-").concat(t.eventRuleId),f.current===e&&l.claimResponse?[2,l.claimResponse]:f.current&&f.current!==e?[4,p()]:[3,2];case 1:u.sent(),u.label=2;case 2:b((function(e){return d(d({},e),{isLoading:!0,error:null})})),u.label=3;case 3:return u.trys.push([3,6,,7]),[4,fetch(r("/events/".concat(n,"/claim")),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({fingerprint:o,start:t.start,end:t.end,eventRuleId:t.eventRuleId})})];case 4:if(!(i=u.sent()).ok)throw new Error("Failed to claim slot: ".concat(i.statusText));return[4,i.json()];case 5:return(a=u.sent()).isAvailable?(f.current=e,b({claimedSlot:t,claimResponse:a,isLoading:!1,error:null}),[2,a]):(b((function(e){return d(d({},e),{isLoading:!1,error:new Error("This time slot is no longer available")})})),[2,null]);case 6:return s=u.sent(),c=s instanceof Error?s:new Error("Unknown error occurred"),b((function(e){return d(d({},e),{isLoading:!1,error:c})})),[2,null];case 7:return[2]}}))}))}),[n,r,p,l.claimResponse,o]),m=s((function(e){return!!l.claimedSlot&&(l.claimedSlot.start===e.start&&l.claimedSlot.eventRuleId===e.eventRuleId)}),[l.claimedSlot]),y=s((function(){b((function(e){return d(d({},e),{error:null})}))}),[]);return d(d({},l),{claim:h,unclaim:p,isClaimed:m,clearError:y})}function D(){var e=this,t=v(),n=t.therapistUUID,r=t.buildUrl,o=t.fingerprint,i=a({booking:null,isLoading:!1,error:null,isSuccess:!1}),l=i[0],c=i[1],b=s((function(t){return u(e,void 0,void 0,(function(){var e,i,a,l,s,u,b;return g(this,(function(g){switch(g.label){case 0:e=t.slot,i=t.client,a=t.locationSelection,c((function(e){return d(d({},e),{isLoading:!0,error:null})})),g.label=1;case 1:return g.trys.push([1,4,,5]),[4,fetch(r("/events/".concat(n,"/book")),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(d({fingerprint:o,start:e.start,end:e.end,eventRuleId:e.eventRuleId,locationSelection:null!=a?a:e.location},i))})];case 2:if(!(l=g.sent()).ok)throw new Error("Booking failed: ".concat(l.statusText));return[4,l.json()];case 3:return s=g.sent(),c({booking:s,isLoading:!1,error:null,isSuccess:!0}),[2,s];case 4:return u=g.sent(),b=u instanceof Error?u:new Error("Unknown error occurred"),c((function(e){return d(d({},e),{isLoading:!1,error:b,isSuccess:!1})})),[2,null];case 5:return[2]}}))}))}),[n,r,o]),f=s((function(){c({booking:null,isLoading:!1,error:null,isSuccess:!1})}),[]),p=s((function(){var e;if(null===(e=l.booking)||void 0===e?void 0:e.ics){var t=new Blob([l.booking.ics],{type:"text/calendar;charset=utf-8"}),n=window.URL.createObjectURL(t),r=document.createElement("a");r.href=n,r.setAttribute("download","appointment.ics"),document.body.appendChild(r),r.click(),document.body.removeChild(r),window.URL.revokeObjectURL(n)}}),[l.booking]);return d(d({},l),{book:b,reset:f,downloadCalendar:p})}function I(e){var t,n,r,i=this;void 0===e&&(e={});var l=e.onBookingComplete,c=e.onError,d=a("loading"),b=d[0],f=d[1],p=a(null),h=p[0],m=p[1],v=a(null),k=v[0],x=v[1],I=a(null),T=I[0],C=I[1],R=y(),L=w({categories:e.categories}),z=S(),F=D();o((function(){"loading"!==b||R.isLoading||L.isLoading||(R.error||L.error?f("error"):f("date-selection"))}),[b,R.isLoading,L.isLoading,R.error,L.error]);var U=o((function(){return h?L.getSlotsForDate(h):[]}),[h,L]),j=s((function(e){m(e),x(null),C(null),e&&f("time-selection")}),[m,x,C,f]),E=s((function(e){return u(i,void 0,void 0,(function(){return g(this,(function(t){switch(t.label){case 0:return e?[3,2]:[4,z.unclaim()];case 1:return t.sent(),x(null),C(null),[2,!0];case 2:return[4,z.claim(e)];case 3:return t.sent()?(x(e),"not-fixed"!==e.location&&C(e.location),f("booking-form"),[2,!0]):(z.error&&(null==c||c(z.error)),[2,!1])}}))}))}),[z,c]),W=s((function(e){return u(i,void 0,void 0,(function(){var t;return g(this,(function(n){switch(n.label){case 0:return k?[4,F.book({slot:k,client:e,locationSelection:null!=T?T:k.location})]:[2,!1];case 1:return(t=n.sent())?(null==l||l(t),f("confirmation"),[2,!0]):(F.error&&(null==c||c(F.error)),[2,!1])}}))}))}),[k,T,F,l,c]),B=s((function(){f("loading"),m(null),x(null),C(null),F.reset(),z.unclaim(),L.refetch()}),[F,z,L]),O=s((function(e){f(e)}),[]),N=s((function(e){C(e)}),[]),M=R.isLoading||L.isLoading||z.isLoading||F.isLoading,P=null!==(r=null!==(n=null!==(t=R.error)&&void 0!==t?t:L.error)&&void 0!==n?n:z.error)&&void 0!==r?r:F.error;return{step:b,goToStep:O,therapist:R,slots:L,selectedDate:h,selectDate:j,selectedDateSlots:U,selectedSlot:k,selectSlot:E,selectedLocation:T,setLocation:N,claim:z,booking:F,submitBooking:W,reset:B,isLoading:M,error:P}}var T={"--booking-bg":"#0f0f10","--booking-surface":"#18181b","--booking-surface-elevated":"#1f1f23","--booking-surface-hover":"#27272a","--booking-border":"#2d2d30","--booking-border-subtle":"#232326","--booking-text":"#fafafa","--booking-text-secondary":"#d4d4d8","--booking-text-muted":"#a1a1aa","--booking-text-subtle":"#71717a","--booking-accent":"#10b981","--booking-accent-hover":"#34d399","--booking-accent-muted":"rgba(16, 185, 129, 0.12)","--booking-accent-glow":"rgba(16, 185, 129, 0.25)","--booking-error":"#ef4444","--booking-error-bg":"rgba(239, 68, 68, 0.1)","--booking-radius":"10px","--booking-radius-sm":"6px","--booking-radius-lg":"14px","--booking-shadow":"0 4px 24px rgba(0, 0, 0, 0.4)","--booking-transition":"0.15s ease","--booking-font":'"Inter", -apple-system, BlinkMacSystemFont, sans-serif'};function C(){return t("div",{style:{width:32,height:32,border:"2px solid var(--booking-border)",borderTopColor:"var(--booking-accent)",borderRadius:"50%",animation:"spin 0.6s linear infinite"}})}function R(){return e("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",padding:80,gap:16},children:[t(C,{}),t("span",{style:{color:"var(--booking-text-muted)",fontSize:14},children:"Verfügbare Termine werden geladen..."})]})}function L(e){var n=e.current,r=e.total;return t("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",gap:8,marginBottom:32},children:Array.from({length:r},(function(e,r){return t("div",{style:{display:"flex",alignItems:"center",gap:8},children:t("div",{style:{width:r===n?28:10,height:10,borderRadius:5,background:r<=n?"var(--booking-accent)":"var(--booking-border)",transition:"all 0.2s ease",boxShadow:r===n?"0 0 12px var(--booking-accent-glow)":"none"}})},r)}))})}function z(n){var r=n.availableDates,i=n.selectedDate,l=n.onSelectDate,s=a((function(){return r.length>0?new Date(r[0]):new Date})),c=s[0],d=s[1],u=o((function(){return new Set(r.map((function(e){return e.toDateString()})))}),[r]),g=o((function(){for(var e=c.getFullYear(),t=c.getMonth(),n=new Date(e,t,1),r=new Date(e,t+1,0).getDate(),o=(n.getDay()+6)%7,i=[],a=[],l=0;l<o;l++)a.push(null);for(var s=1;s<=r;s++)a.push(s),7===a.length&&(i.push(a),a=[]);if(a.length>0){for(;a.length<7;)a.push(null);i.push(a)}return{year:e,month:t,daysInMonth:r,firstDayOfWeek:o,weeks:i}}),[c]),b=g.year,f=g.month,p=g.weeks,h=function(e){var t=new Date(b,f,e);return u.has(t.toDateString())},m=new Date,v=b>m.getFullYear()||b===m.getFullYear()&&f>m.getMonth();return e("div",{children:[e("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:20,padding:"0 4px"},children:[t("button",{type:"button",onClick:function(){d(new Date(b,f-1,1))},disabled:!v,style:{width:36,height:36,border:"1px solid var(--booking-border)",borderRadius:"var(--booking-radius-sm)",background:"var(--booking-surface)",color:v?"var(--booking-text)":"var(--booking-text-subtle)",cursor:v?"pointer":"not-allowed",display:"flex",alignItems:"center",justifyContent:"center",fontSize:16,transition:"var(--booking-transition)",opacity:v?1:.4},children:"‹"}),e("span",{style:{fontSize:16,fontWeight:600,color:"var(--booking-text)"},children:[["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"][f]," ",b]}),t("button",{type:"button",onClick:function(){d(new Date(b,f+1,1))},style:{width:36,height:36,border:"1px solid var(--booking-border)",borderRadius:"var(--booking-radius-sm)",background:"var(--booking-surface)",color:"var(--booking-text)",cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",fontSize:16,transition:"var(--booking-transition)"},children:"›"})]}),t("div",{style:{display:"grid",gridTemplateColumns:"repeat(7, 1fr)",gap:4,marginBottom:8},children:["Mo","Di","Mi","Do","Fr","Sa","So"].map((function(e){return t("div",{style:{textAlign:"center",fontSize:12,fontWeight:500,color:"var(--booking-text-subtle)",padding:"8px 0",textTransform:"uppercase",letterSpacing:"0.05em"},children:e},e)}))}),t("div",{style:{display:"flex",flexDirection:"column",gap:4},children:p.map((function(n,r){return t("div",{style:{display:"grid",gridTemplateColumns:"repeat(7, 1fr)",gap:4},children:n.map((function(n,r){if(null===n)return t("div",{style:{aspectRatio:"1",minHeight:44}},r);var o=h(n),a=function(e){return!!i&&new Date(b,f,e).toDateString()===i.toDateString()}(n),s=function(e){var t=new Date;return e===t.getDate()&&f===t.getMonth()&&b===t.getFullYear()}(n);return e("button",{type:"button",onClick:function(){return function(e){h(e)&&l(new Date(b,f,e))}(n)},disabled:!o,style:{aspectRatio:"1",minHeight:44,border:a?"2px solid var(--booking-accent)":s?"1px solid var(--booking-accent)":"1px solid transparent",borderRadius:"var(--booking-radius-sm)",background:a?"var(--booking-accent)":o?"var(--booking-surface-elevated)":"transparent",color:a?"#000":o?"var(--booking-text)":"var(--booking-text-subtle)",cursor:o?"pointer":"default",fontSize:14,fontWeight:a?600:o?500:400,fontFamily:"inherit",display:"flex",alignItems:"center",justifyContent:"center",transition:"var(--booking-transition)",opacity:o?1:.35,position:"relative"},children:[n,o&&!a&&t("span",{style:{position:"absolute",bottom:6,width:4,height:4,borderRadius:"50%",background:"var(--booking-accent)"}})]},r)}))},r)}))}),e("div",{style:{display:"flex",alignItems:"center",gap:20,marginTop:20,paddingTop:16,borderTop:"1px solid var(--booking-border-subtle)",fontSize:12,color:"var(--booking-text-muted)"},children:[e("div",{style:{display:"flex",alignItems:"center",gap:8},children:[t("span",{style:{width:8,height:8,borderRadius:"50%",background:"var(--booking-accent)"}}),"Termine verfügbar"]}),e("div",{style:{display:"flex",alignItems:"center",gap:8},children:[t("span",{style:{width:8,height:8,borderRadius:"50%",background:"var(--booking-text-subtle)",opacity:.35}}),"Keine Termine"]})]})]})}function F(n){var r,o=n.slots,i=n.selectedSlot,a=n.onSelectSlot,l=n.selectedDate,s=n.onBack,c=function(e){switch(e){case"virtual":return"🎥";case"onsite":return"📍";case"not-fixed":return"🔄"}},d=function(e){switch(e){case"virtual":return"Online";case"onsite":return"Vor Ort";case"not-fixed":return"Flexibel"}},u=o.reduce((function(e,t){var n=t.title;return e[n]||(e[n]=[]),e[n].push(t),e}),{});return e("div",{children:[e("div",{style:{marginBottom:24},children:[t("button",{type:"button",onClick:s,style:{display:"flex",alignItems:"center",gap:6,background:"none",border:"none",color:"var(--booking-text-muted)",fontSize:13,cursor:"pointer",padding:"4px 0",marginBottom:12,fontFamily:"inherit",transition:"var(--booking-transition)"},children:"← Zurück zum Kalender"}),e("h3",{style:{fontSize:18,fontWeight:600,color:"var(--booking-text)",margin:0,display:"flex",alignItems:"center",gap:12},children:[t("span",{style:{width:40,height:40,borderRadius:"var(--booking-radius-sm)",background:"var(--booking-accent-muted)",display:"flex",alignItems:"center",justifyContent:"center",fontSize:18},children:"🕐"}),(r=l,r.toLocaleDateString("de-DE",{weekday:"long",day:"numeric",month:"long",year:"numeric"}))]})]}),t("div",{style:{display:"flex",flexDirection:"column",gap:28},children:Object.entries(u).map((function(n){var r,o=n[0],l=n[1];return e("div",{children:[e("h4",{style:{fontSize:14,fontWeight:600,color:"var(--booking-text-secondary)",margin:"0 0 12px 0",display:"flex",alignItems:"center",gap:8},children:[t("span",{style:{width:3,height:14,borderRadius:2,background:(null===(r=l[0])||void 0===r?void 0:r.color)||"var(--booking-accent)"}}),o]}),t("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(240px, 1fr))",gap:12},children:l.map((function(n){var r=(null==i?void 0:i.start)===n.start&&(null==i?void 0:i.eventRuleId)===n.eventRuleId;return e("button",{type:"button",onClick:function(){return a(n)},style:{padding:"14px 16px",border:r?"2px solid var(--booking-accent)":"1px solid var(--booking-border)",borderRadius:"var(--booking-radius)",background:r?"var(--booking-accent-muted)":"var(--booking-surface-elevated)",cursor:"pointer",textAlign:"left",fontFamily:"inherit",transition:"var(--booking-transition)",display:"flex",alignItems:"center",justifyContent:"space-between",gap:12},children:[e("div",{style:{display:"flex",alignItems:"center",gap:12},children:[t("span",{style:{fontSize:17,fontWeight:600,color:"var(--booking-text)",fontVariantNumeric:"tabular-nums"},children:n.timeString}),e("span",{style:{fontSize:11,color:"var(--booking-text-subtle)",background:"var(--booking-surface)",padding:"4px 8px",borderRadius:4,display:"inline-flex",alignItems:"center",gap:4,whiteSpace:"nowrap",flexShrink:0},children:[c(n.location)," ",d(n.location)]})]}),t("span",{style:{fontSize:14,fontWeight:600,color:"var(--booking-accent)"},children:n.formattedPrice})]},"".concat(n.start,"-").concat(n.eventRuleId))}))})]},o)}))}),0===o.length&&t("div",{style:{textAlign:"center",padding:40,color:"var(--booking-text-muted)"},children:"Keine Termine an diesem Tag verfügbar."})]})}function U(r){var o,i=r.slot,l=r.showLocationSelector,s=r.selectedLocation,c=r.onLocationChange,u=r.onSubmit,g=r.onBack,b=r.isLoading,f=r.error,p=a({firstName:"",lastName:"",email:"",phone:"",notes:""}),h=p[0],m=p[1],v={width:"100%",padding:"14px 16px",border:"1px solid var(--booking-border)",borderRadius:"var(--booking-radius-sm)",background:"var(--booking-bg)",color:"var(--booking-text)",fontSize:15,fontFamily:"inherit",outline:"none",transition:"var(--booking-transition)",boxSizing:"border-box"},y={display:"block",fontSize:13,fontWeight:600,color:"var(--booking-text-secondary)",marginBottom:8,textTransform:"uppercase",letterSpacing:"0.03em"};return e("div",{children:[t("button",{type:"button",onClick:g,style:{display:"inline-flex",alignItems:"center",gap:6,background:"var(--booking-surface-elevated)",border:"1px solid var(--booking-border)",borderRadius:"var(--booking-radius-sm)",color:"var(--booking-text-muted)",fontSize:13,cursor:"pointer",padding:"8px 14px",marginBottom:24,fontFamily:"inherit",transition:"var(--booking-transition)"},children:"← Zurück"}),e("div",{style:{background:"linear-gradient(135deg, var(--booking-accent-muted) 0%, var(--booking-surface-elevated) 100%)",borderRadius:"var(--booking-radius-lg)",padding:24,marginBottom:28,border:"1px solid var(--booking-accent)",position:"relative",overflow:"hidden"},children:[t("div",{style:{position:"absolute",top:0,left:0,width:6,height:"100%",background:i.color||"var(--booking-accent)"}}),e("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",flexWrap:"wrap",gap:16},children:[e("div",{style:{display:"flex",alignItems:"center",gap:20},children:[t("div",{style:{width:56,height:56,borderRadius:"var(--booking-radius)",background:"var(--booking-surface)",display:"flex",alignItems:"center",justifyContent:"center",fontSize:24,border:"1px solid var(--booking-border)"},children:"📅"}),e("div",{children:[t("div",{style:{fontSize:18,fontWeight:700,color:"var(--booking-text)",marginBottom:6},children:i.title}),e("div",{style:{display:"flex",alignItems:"center",gap:16,fontSize:14,color:"var(--booking-text-muted)"},children:[e("span",{style:{display:"flex",alignItems:"center",gap:6},children:[t("span",{style:{opacity:.7},children:"📆"})," ",(o=i.start,new Date(o).toLocaleDateString("de-DE",{weekday:"short",day:"numeric",month:"short"}))]}),e("span",{style:{display:"flex",alignItems:"center",gap:6},children:[t("span",{style:{opacity:.7},children:"🕐"})," ",i.timeString," Uhr"]}),e("span",{style:{display:"flex",alignItems:"center",gap:6},children:[t("span",{style:{opacity:.7},children:"⏱"})," ",i.durationMinutes," Min."]})]})]})]}),e("div",{style:{textAlign:"right"},children:[t("div",{style:{fontSize:12,color:"var(--booking-text-muted)",marginBottom:2},children:"Preis"}),t("div",{style:{fontSize:28,fontWeight:700,color:"var(--booking-accent)"},children:i.formattedPrice})]})]})]}),l&&e("div",{style:{background:"var(--booking-surface-elevated)",borderRadius:"var(--booking-radius)",padding:20,marginBottom:28,border:"1px solid var(--booking-border)"},children:[t("div",{style:{fontSize:14,fontWeight:600,color:"var(--booking-text)",marginBottom:14},children:"Wo soll der Termin stattfinden?"}),t("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:12},children:["virtual","onsite"].map((function(n){return e("button",{type:"button",onClick:function(){return c(n)},style:{padding:"16px 20px",border:s===n?"2px solid var(--booking-accent)":"1px solid var(--booking-border)",borderRadius:"var(--booking-radius)",background:s===n?"var(--booking-accent-muted)":"var(--booking-surface)",color:"var(--booking-text)",cursor:"pointer",fontFamily:"inherit",fontSize:15,fontWeight:600,display:"flex",alignItems:"center",justifyContent:"center",gap:10,transition:"var(--booking-transition)"},children:[t("span",{style:{fontSize:20},children:"virtual"===n?"🎥":"📍"}),"virtual"===n?"Online-Termin":"Vor Ort"]},n)}))})]}),e("div",{style:{background:"var(--booking-surface-elevated)",borderRadius:"var(--booking-radius-lg)",padding:28,border:"1px solid var(--booking-border)"},children:[e("div",{style:{display:"flex",alignItems:"center",gap:14,marginBottom:24,paddingBottom:20,borderBottom:"1px solid var(--booking-border)"},children:[t("div",{style:{width:44,height:44,borderRadius:"var(--booking-radius-sm)",background:"var(--booking-accent-muted)",display:"flex",alignItems:"center",justifyContent:"center",fontSize:20},children:"👤"}),e("div",{children:[t("h3",{style:{fontSize:17,fontWeight:700,color:"var(--booking-text)",margin:0},children:"Ihre Kontaktdaten"}),t("p",{style:{fontSize:13,color:"var(--booking-text-muted)",margin:"4px 0 0 0"},children:"Wir benötigen diese Angaben für Ihre Terminbestätigung"})]})]}),f&&e("div",{style:{background:"var(--booking-error-bg)",border:"1px solid var(--booking-error)",borderRadius:"var(--booking-radius-sm)",padding:"14px 16px",marginBottom:20,color:"var(--booking-error)",fontSize:14,display:"flex",alignItems:"center",gap:10},children:[t("span",{children:"⚠️"})," ",f.message]}),e("form",{onSubmit:function(e){e.preventDefault(),u({firstName:h.firstName,lastName:h.lastName,email:h.email,phone:h.phone||void 0,notes:h.notes||void 0})},style:{display:"flex",flexDirection:"column",gap:20},children:[e("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:16},children:[e("div",{children:[t("label",{htmlFor:"booking-firstName",style:y,children:"Vorname"}),t("input",{id:"booking-firstName",type:"text",required:!0,value:h.firstName,onChange:function(e){return m((function(t){return d(d({},t),{firstName:e.target.value})}))},style:v,placeholder:"Max"})]}),e("div",{children:[t("label",{htmlFor:"booking-lastName",style:y,children:"Nachname"}),t("input",{id:"booking-lastName",type:"text",required:!0,value:h.lastName,onChange:function(e){return m((function(t){return d(d({},t),{lastName:e.target.value})}))},style:v,placeholder:"Mustermann"})]})]}),e("div",{children:[t("label",{htmlFor:"booking-email",style:y,children:"E-Mail-Adresse"}),t("input",{id:"booking-email",type:"email",required:!0,value:h.email,onChange:function(e){return m((function(t){return d(d({},t),{email:e.target.value})}))},style:v,placeholder:"max@beispiel.de"})]}),e("div",{children:[e("label",{htmlFor:"booking-phone",style:d(d({},y),{color:"var(--booking-text-muted)"}),children:["Telefonnummer ",t("span",{style:{fontWeight:400,textTransform:"none"},children:"(optional)"})]}),t("input",{id:"booking-phone",type:"tel",value:h.phone,onChange:function(e){return m((function(t){return d(d({},t),{phone:e.target.value})}))},style:v,placeholder:"+49 123 456789"})]}),e("div",{children:[e("label",{htmlFor:"booking-notes",style:d(d({},y),{color:"var(--booking-text-muted)"}),children:["Nachricht ",t("span",{style:{fontWeight:400,textTransform:"none"},children:"(optional)"})]}),t("textarea",{id:"booking-notes",value:h.notes,onChange:function(e){return m((function(t){return d(d({},t),{notes:e.target.value})}))},style:d(d({},v),{minHeight:100,resize:"vertical"}),placeholder:"Gibt es etwas, das wir vorab wissen sollten?"})]}),t("button",{type:"submit",disabled:b||l&&!s,style:{marginTop:8,padding:"18px 32px",border:"none",borderRadius:"var(--booking-radius)",background:"var(--booking-accent)",color:"#000",fontSize:16,fontWeight:700,cursor:b||l&&!s?"not-allowed":"pointer",fontFamily:"inherit",transition:"var(--booking-transition)",opacity:b||l&&!s?.5:1,display:"flex",alignItems:"center",justifyContent:"center",gap:10,boxShadow:b||l&&!s?"none":"0 4px 14px var(--booking-accent-glow)"},children:b?e(n,{children:[t(C,{})," Wird gebucht..."]}):t(n,{children:"Termin verbindlich buchen"})})]})]})]})}function j(n){var r,o=n.slot,i=n.onDownloadCalendar,a=n.onReset;return e("div",{style:{textAlign:"center",padding:"48px 24px"},children:[t("div",{style:{width:72,height:72,borderRadius:"50%",background:"var(--booking-accent-muted)",display:"flex",alignItems:"center",justifyContent:"center",margin:"0 auto 24px",fontSize:32,border:"2px solid var(--booking-accent)"},children:"✓"}),t("h2",{style:{fontSize:24,fontWeight:700,color:"var(--booking-text)",margin:"0 0 12px 0"},children:"Termin gebucht!"}),e("p",{style:{fontSize:15,color:"var(--booking-text-muted)",maxWidth:400,margin:"0 auto 32px",lineHeight:1.6},children:["Ihr Termin ",e("strong",{style:{color:"var(--booking-text)"},children:['"',o.title,'"']})," am"," ",t("strong",{style:{color:"var(--booking-text)"},children:(r=o.start,new Date(r).toLocaleDateString("de-DE",{weekday:"long",day:"numeric",month:"long",year:"numeric"}))})," um"," ",e("strong",{style:{color:"var(--booking-text)"},children:[o.timeString," Uhr"]})," wurde erfolgreich gebucht."]}),e("div",{style:{display:"flex",gap:12,justifyContent:"center",flexWrap:"wrap"},children:[t("button",{type:"button",onClick:i,style:{padding:"12px 20px",border:"none",borderRadius:"var(--booking-radius-sm)",background:"var(--booking-accent)",color:"#000",fontSize:14,fontWeight:600,cursor:"pointer",fontFamily:"inherit",display:"flex",alignItems:"center",gap:8},children:"📅 Zum Kalender hinzufügen"}),t("button",{type:"button",onClick:a,style:{padding:"12px 20px",border:"1px solid var(--booking-border)",borderRadius:"var(--booking-radius-sm)",background:"transparent",color:"var(--booking-text)",fontSize:14,fontWeight:500,cursor:"pointer",fontFamily:"inherit"},children:"Weiteren Termin buchen"})]})]})}function E(){var n,r=this,o=I(),i=o.step,a=o.goToStep,l=o.therapist,s=o.slots,c=o.selectedDate,b=o.selectDate,f=o.selectedDateSlots,p=o.selectedSlot,h=o.selectSlot,m=o.selectedLocation,v=o.setLocation,y=o.booking,k=o.submitBooking,x=o.reset,w=o.isLoading,S=o.error,D=p?d(d({},p),{dateKey:new Date(p.start).toISOString().split("T")[0],timeString:new Date(p.start).toLocaleTimeString("de-DE",{hour:"2-digit",minute:"2-digit"}),durationMinutes:Math.round((new Date(p.end).getTime()-new Date(p.start).getTime())/6e4),formattedPrice:new Intl.NumberFormat("de-DE",{style:"currency",currency:"EUR"}).format(Number.parseFloat(p.price)),isToday:!1,isPast:!1}):null;return e("div",{style:d(d({},T),{fontFamily:"var(--booking-font)",background:"var(--booking-bg)",color:"var(--booking-text)",minHeight:"100vh",padding:"40px 24px"}),children:[t("style",{children:"\n@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');\n@keyframes spin { to { transform: rotate(360deg); } }\n@keyframes fadeIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }\n"}),e("div",{style:{maxWidth:880,margin:"0 auto"},children:[e("header",{style:{textAlign:"center",marginBottom:40},children:[e("h1",{style:{fontSize:28,fontWeight:700,margin:"0 0 8px 0",color:"var(--booking-text)"},children:["Termin buchen",l.data?" bei ".concat(l.data.name):""]}),t("p",{style:{fontSize:15,color:"var(--booking-text-muted)",margin:0},children:"Wählen Sie einen passenden Termin für Ihr Anliegen"})]}),"loading"!==i&&"error"!==i&&"confirmation"!==i&&t(L,{current:function(){switch(i){case"date-selection":default:return 0;case"time-selection":return 1;case"booking-form":return 2;case"confirmation":return 3}}(),total:3}),t("div",{style:{background:"var(--booking-surface)",borderRadius:"var(--booking-radius-lg)",border:"1px solid var(--booking-border)",boxShadow:"var(--booking-shadow)",overflow:"hidden",animation:"fadeIn 0.3s ease"},children:e("div",{style:{padding:28},children:["loading"===i&&t(R,{}),"error"===i&&e("div",{style:{textAlign:"center",padding:40},children:[t("div",{style:{background:"var(--booking-error-bg)",border:"1px solid var(--booking-error)",borderRadius:"var(--booking-radius)",padding:16,marginBottom:20,color:"var(--booking-error)"},children:null!==(n=null==S?void 0:S.message)&&void 0!==n?n:"Ein Fehler ist aufgetreten"}),t("button",{type:"button",onClick:x,style:{padding:"12px 24px",border:"none",borderRadius:"var(--booking-radius-sm)",background:"var(--booking-accent)",color:"#000",fontSize:14,fontWeight:600,cursor:"pointer",fontFamily:"inherit"},children:"Erneut versuchen"})]}),"date-selection"===i&&e("div",{children:[e("h3",{style:{fontSize:18,fontWeight:600,color:"var(--booking-text)",margin:"0 0 20px 0",display:"flex",alignItems:"center",gap:12},children:[t("span",{style:{width:40,height:40,borderRadius:"var(--booking-radius-sm)",background:"var(--booking-accent-muted)",display:"flex",alignItems:"center",justifyContent:"center",fontSize:18},children:"📅"}),"Datum wählen"]}),t(z,{availableDates:s.availableDates,selectedDate:c,onSelectDate:b})]}),"time-selection"===i&&c&&t(F,{slots:f,selectedSlot:p?d(d({},p),{dateKey:"",timeString:"",durationMinutes:0,formattedPrice:"",isToday:!1,isPast:!1}):null,onSelectSlot:function(e){return u(r,void 0,void 0,(function(){return g(this,(function(t){switch(t.label){case 0:return[4,h(e)];case 1:return t.sent(),[2]}}))}))},selectedDate:c,onBack:function(){return a("date-selection")}}),"booking-form"===i&&D&&t(U,{slot:D,showLocationSelector:"not-fixed"===D.location,selectedLocation:m,onLocationChange:v,onSubmit:k,onBack:function(){return a("time-selection")},isLoading:w,error:S}),"confirmation"===i&&D&&t(j,{slot:D,onDownloadCalendar:y.downloadCalendar,onReset:x})]})})]})]})}function W(e){var n=e.therapistUUID,r=e.categories;return t(m,{therapistUUID:n,categories:r,children:t(E,{})})}export{W as CustomBookingExample,b as TebutoBookingWidget,m as TebutoProvider,w as useAvailableSlots,D as useBookAppointment,I as useBookingFlow,S as useClaimSlot,v as useTebutoContext,y as useTherapist};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|