@mylikita/booking-widget 1.54.0 → 1.56.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.
@@ -1,4 +1,4 @@
1
- /*! @mylikita/booking-widget v1.54.0 | MIT */
1
+ /*! @mylikita/booking-widget v1.56.0 | MIT */
2
2
  var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
@@ -1,4 +1,4 @@
1
- /*! @mylikita/booking-widget v1.54.0 | MIT */
1
+ /*! @mylikita/booking-widget v1.56.0 | MIT */
2
2
 
3
3
  // src/client.js
4
4
  async function createBooking({ relayUrl, websiteKey, payload, signal }) {
@@ -1,4 +1,4 @@
1
- /*! @mylikita/booking-widget v1.54.0 | MIT */
1
+ /*! @mylikita/booking-widget v1.56.0 | MIT */
2
2
  var MyLikitaBookingWidget = (() => {
3
3
  var __defProp = Object.defineProperty;
4
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -1,4 +1,4 @@
1
- /*! @mylikita/booking-widget v1.54.0 | MIT */
1
+ /*! @mylikita/booking-widget v1.56.0 | MIT */
2
2
  var MyLikitaBookingWidget=(()=>{var ze=Object.defineProperty;var Ot=Object.getOwnPropertyDescriptor;var Vt=Object.getOwnPropertyNames;var Yt=Object.prototype.hasOwnProperty;var Kt=(r,t)=>{for(var i in t)ze(r,i,{get:t[i],enumerable:!0})},Ft=(r,t,i,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Vt(t))!Yt.call(r,s)&&s!==i&&ze(r,s,{get:()=>t[s],enumerable:!(e=Ot(t,s))||e.enumerable});return r};var Gt=r=>Ft(ze({},"__esModule",{value:!0}),r);var di={};Kt(di,{DEFAULT_THEME:()=>_e,MYLIKITA_MARK_DATA_URI:()=>Re,STATUS_COPY:()=>fe,TERMINAL_STATUSES:()=>wt,createBooking:()=>me,createBookingWidget:()=>kt,createBrandHeader:()=>be,fetchProviders:()=>pe,fetchStatus:()=>ue,newExternalRef:()=>we,pollStatus:()=>ge,resolveTheme:()=>ve,statusCopy:()=>ye});async function me({relayUrl:r,websiteKey:t,payload:i,signal:e}){let s=await fetch(`${j(r)}/v1/bookings`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(i),signal:e}),c=await W(s);if(s.status===409){if(c?.error==="slot_unavailable")throw H(s.status,c,"create");return{ok:!0,duplicate:!0,booking_ref:c?.booking_ref,error:c?.message}}if(!s.ok)throw H(s.status,c,"create");return{ok:!0,duplicate:!1,booking_ref:c?.booking_ref,status:c?.status||"pending_confirmation"}}async function pe({relayUrl:r,websiteKey:t,signal:i}){let e=await fetch(`${j(r)}/v1/providers`,{headers:{Authorization:`Bearer ${t}`},signal:i}),s=await W(e);if(!e.ok)throw H(e.status,s,"providers");return(Array.isArray(s?.providers)?s.providers:[]).map(m=>({external_id:m.external_id,name:m.name||m.external_id,specialty:m.specialty||null,module:m.module||"general"}))}async function mt({relayUrl:r,websiteKey:t,signal:i}){let e=await fetch(`${j(r)}/v1/services`,{headers:{Authorization:`Bearer ${t}`},signal:i}),s=await W(e);if(!e.ok)throw H(e.status,s,"services");return(Array.isArray(s?.services)?s.services:[]).map(m=>({external_id:m.external_id,name:m.name||m.external_id,duration_mins:Number.isFinite(Number(m.duration_mins))?Number(m.duration_mins):30,price:m.price==null?null:Number(m.price),module:m.module||"general",provider_external_ids:Array.isArray(m.provider_external_ids)?m.provider_external_ids:[]}))}async function pt({relayUrl:r,websiteKey:t,payload:i,signal:e}){let s=await fetch(`${j(r)}/v1/waitlist`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(i),signal:e}),c=await W(s);if(s.status===409)return{ok:!0,duplicate:!0,error:c?.message};if(!s.ok)throw H(s.status,c,"waitlist");return{ok:!0,duplicate:!1,status:c?.status||"waiting"}}async function ut({relayUrl:r,websiteKey:t,source:i,signal:e}){try{let s=await fetch(`${j(r)}/v1/track`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify({source:i||null}),signal:e});s.ok||await W(s)}catch{}}async function gt({relayUrl:r,websiteKey:t,date:i,signal:e}){let s=new URLSearchParams({date:i}),c=await fetch(`${j(r)}/v1/availability?${s}`,{headers:{Authorization:`Bearer ${t}`},signal:e}),m=await W(c);if(!c.ok)throw H(c.status,m,"availability");return(Array.isArray(m?.booked)?m.booked:[]).filter(w=>w&&typeof w.start=="string"&&typeof w.end=="string").map(w=>({start:w.start,end:w.end}))}async function ue({relayUrl:r,websiteKey:t,bookingRef:i,signal:e}){let s=await fetch(`${j(r)}/v1/bookings/${encodeURIComponent(i)}`,{headers:{Authorization:`Bearer ${t}`},signal:e}),c=await W(s);if(!s.ok)throw H(s.status,c,"status");return{booking_ref:c?.booking_ref,status:c?.status||"pending_confirmation",appt_ref:c?.appt_ref||null}}async function ge(r,{intervalMs:t=5e3,maxTries:i=12,signal:e}={}){for(let s=0;s<i;s++){if(e?.aborted)return{status:"aborted",resolved:!1,data:null};let c=await r();if(c.status!=="pending_confirmation")return{status:c.status,resolved:!0,data:c};s<i-1&&await Zt(t,e)}return{status:"pending_confirmation",resolved:!1,data:null}}function we(){return`BK-${Date.now()}-${Math.random().toString(36).slice(2,6)}`}function j(r){return String(r||"").replace(/\/+$/,"")}function H(r,t,i){let e=new Error(t?.message||t?.error||`Relay ${i} failed (HTTP ${r})`);return e.code=t?.error||"http_error",e.status=r,e}async function W(r){try{return await r.json()}catch{return null}}function Zt(r,t){return new Promise(i=>{if(t?.aborted)return i();let e=()=>{clearTimeout(s),i()},s=setTimeout(()=>{t?.removeEventListener("abort",e),i()},r);t?.addEventListener("abort",e,{once:!0})})}var fe={pending_confirmation:{title:"Request received",message:"We've received your booking request \u2014 we'll confirm shortly.",kind:"info"},confirmed:{title:"Appointment confirmed",message:"Your appointment is confirmed. See you at the clinic!",kind:"success"},cancelled:{title:"Appointment cancelled",message:"This appointment was cancelled. Please contact the clinic if this was unexpected.",kind:"danger"},rescheduled:{title:"Appointment rescheduled",message:"This appointment was moved \u2014 the new time was sent to you.",kind:"info"},no_show:{title:"Missed appointment",message:"This appointment was marked as missed.",kind:"danger"},expired:{title:"Request expired",message:"This booking request expired \u2014 please call the clinic to book.",kind:"danger"},poll_error:{title:"Something went wrong",message:"We could not check your booking right now. Please try again shortly.",kind:"danger"}};function ye(r){return fe[r]||fe.pending_confirmation}var wt=["confirmed","cancelled","rescheduled","no_show","expired"];var _e={primary:"#0d6efd",primaryDark:"#0b5ed7",primaryText:"#ffffff",accent:"#0d9488",bg:"#ffffff",text:"#1e293b",muted:"#64748b",border:"#e2e8f0",danger:"#dc3545",success:"#15803d",radius:10,font:"system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif"};function ve(r={}){let t=r||{},i=t.accent??t.secondary??_e.accent,e={..._e,...t,accent:i};return{"--mlw-primary":e.primary,"--mlw-primary-dark":e.primaryDark,"--mlw-primary-text":e.primaryText,"--mlw-accent":e.accent,"--mlw-bg":e.bg,"--mlw-text":e.text,"--mlw-muted":e.muted,"--mlw-border":e.border,"--mlw-danger":e.danger,"--mlw-success":e.success,"--mlw-radius":`${e.radius}px`,"--mlw-font":e.font}}var ft=`
3
3
  .mylikita-widget {
4
4
  --mlw-primary: #0d6efd;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mylikita/booking-widget",
3
- "version": "1.54.0",
3
+ "version": "1.56.0",
4
4
  "description": "Drop-in appointment booking widget for MyLikita hospital websites. Submits bookings through the MyLikita relay (POST /v1/bookings) and polls status (GET /v1/bookings/:ref). Themeable via CSS variables.",
5
5
  "type": "module",
6
6
  "main": "dist/mylikita-booking-widget.cjs",