@mediquo/elements 0.5.0 → 0.5.2
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/README.md +3 -1
- package/dist/chunks/api-chat-client-1Vz6ZOwp.js +1 -0
- package/dist/chunks/{apple-pay-outcomes-CjCnBYOD.js → apple-pay-outcomes-0ozxSHyb.js} +1 -1
- package/dist/chunks/appointment-card-skeleton-1c7552Ln.d.ts +398 -0
- package/dist/chunks/appointment-card-skeleton-hglMW7x6.js +1 -0
- package/dist/chunks/{documentation-view-fFbvjJqx.js → documentation-view-geQU8ttU.js} +1 -1
- package/dist/chunks/get-patient-documents-query-DIQH-TMM.js +1 -0
- package/dist/chunks/{index-CLdWVaEs.js → index-BBUiLb3Y.js} +1 -1
- package/dist/chunks/index-BJYWtEmT.js +1 -0
- package/dist/chunks/{index-Xcn-xs13.js → index-Bx8TWBsk.js} +1 -1
- package/dist/chunks/{price-BmA2Dl9f.js → price-DIhNpS8n.js} +1 -1
- package/dist/chunks/{refund-cancel-policy-D_tUYPyv.js → refund-cancel-policy-BQDnePq9.js} +1 -1
- package/dist/chunks/{schemas.d-BEA8Pl6w.d.ts → schemas.d-5CaMrfOq.d.ts} +6 -0
- package/dist/chunks/telemetry-client-BLJVs9me.js +1 -0
- package/dist/env.js +1 -1
- package/dist/events.d.ts +56 -1
- package/dist/events.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/mq-apple-pay-checkout.js +1 -1
- package/dist/mq-appointment-checkout.d.ts +1 -1
- package/dist/mq-appointment-checkout.js +1 -1
- package/dist/mq-appointment-documentation.js +1 -1
- package/dist/mq-chat-room.js +1 -1
- package/dist/mq-checkout.js +1 -1
- package/dist/mq-dashboard.d.ts +224 -0
- package/dist/mq-dashboard.js +1 -0
- package/dist/mq-documents.js +1 -1
- package/dist/mq-google-pay-checkout.js +1 -1
- package/dist/mq-immediate-videocall-checkout.js +1 -1
- package/dist/mq-my-appointments.d.ts +9 -391
- package/dist/mq-my-appointments.js +1 -1
- package/dist/mq-payment-poller.d.ts +61 -0
- package/dist/mq-payment-poller.js +1 -0
- package/dist/mq-professional-presence-sync.js +1 -1
- package/dist/mq-schedule-success.js +2 -2
- package/dist/mq-schedule.d.ts +8 -2
- package/dist/mq-schedule.js +1 -1
- package/dist/mq-support-chat.d.ts +1 -1
- package/dist/mq-support-chat.js +1 -1
- package/dist/mq-terms-and-conditions.js +1 -1
- package/dist/mq-unread-count-sync.js +1 -1
- package/dist/mq-videocall.js +1 -1
- package/dist/react/mq-apple-pay-checkout.d.ts +24 -7
- package/dist/react/mq-apple-pay-checkout.js +1 -1
- package/dist/react/mq-appointment-checkout.d.ts +21 -6
- package/dist/react/mq-appointment-checkout.js +1 -1
- package/dist/react/mq-appointment-documentation.d.ts +17 -6
- package/dist/react/mq-appointment-documentation.js +1 -1
- package/dist/react/mq-chat-room.d.ts +30 -7
- package/dist/react/mq-chat-room.js +1 -1
- package/dist/react/mq-checkout.d.ts +22 -8
- package/dist/react/mq-checkout.js +1 -1
- package/dist/react/mq-dashboard.d.ts +57 -0
- package/dist/react/mq-dashboard.js +2 -0
- package/dist/react/mq-documents.d.ts +16 -2
- package/dist/react/mq-documents.js +1 -1
- package/dist/react/mq-google-pay-checkout.d.ts +29 -7
- package/dist/react/mq-google-pay-checkout.js +1 -1
- package/dist/react/mq-immediate-videocall-checkout.d.ts +15 -5
- package/dist/react/mq-immediate-videocall-checkout.js +1 -1
- package/dist/react/mq-my-appointments.d.ts +26 -6
- package/dist/react/mq-my-appointments.js +1 -1
- package/dist/react/mq-payment-poller.d.ts +33 -0
- package/dist/react/mq-payment-poller.js +2 -0
- package/dist/react/mq-professional-presence-sync.d.ts +8 -2
- package/dist/react/mq-professional-presence-sync.js +1 -1
- package/dist/react/mq-query-client-provider.d.ts +9 -2
- package/dist/react/mq-schedule-success.d.ts +30 -7
- package/dist/react/mq-schedule-success.js +1 -1
- package/dist/react/mq-schedule.d.ts +47 -8
- package/dist/react/mq-schedule.js +1 -1
- package/dist/react/mq-session-provider.d.ts +11 -2
- package/dist/react/mq-socket-provider.d.ts +13 -2
- package/dist/react/mq-support-chat.d.ts +31 -2
- package/dist/react/mq-support-chat.js +1 -1
- package/dist/react/mq-terms-and-conditions.d.ts +21 -5
- package/dist/react/mq-terms-and-conditions.js +1 -1
- package/dist/react/mq-theme-provider.d.ts +13 -2
- package/dist/react/mq-toast-container.d.ts +10 -2
- package/dist/react/mq-unread-count-sync.d.ts +8 -2
- package/dist/react/mq-unread-count-sync.js +1 -1
- package/dist/react/mq-videocall.d.ts +30 -12
- package/dist/react/mq-videocall.js +1 -1
- package/package.json +9 -1
- package/dist/chunks/api-chat-client-CqMn2JEn.js +0 -1
- package/dist/chunks/telemetry-client-Ca71sobH.js +0 -1
package/dist/mq-chat-room.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e,t}from"./chunks/custom-element-DA9Fxvxd.js";import{e as s}from"./chunks/provide-D2fnEhT2.js";import{c as o}from"./chunks/consume-CovVqBjI.js";import{l as i}from"./chunks/localized-decorator-BlOuLhym.js";import{m as a,s as r}from"./chunks/runtime-Bg1WXVCx.js";import{i as n,a as l,x as d,E as c}from"./chunks/lit-element-DiWJYFwC.js";import{n as h}from"./chunks/property-scuRaFcM.js";import{r as m}from"./chunks/state-LQivXIgA.js";import{n as p}from"./chunks/create-context-DqP79qjF.js";import{tokens as g}from"./theme.js";import{a as u,M as v}from"./chunks/api-chat-client-CqMn2JEn.js";import{xIcon as y}from"./ui/icons/x-icon.js";import"./ui/mq-avatar.js";import"./ui/mq-button.js";import"./ui/mq-skeleton.js";import{Q as b}from"./chunks/query-controller-BlO1Ax65.js";import{g as f}from"./chunks/chunk-YMQSBQHL-De_r7BNk.js";import{o as w}from"./chunks/if-defined-BYeVdwgd.js";import{chevronLeftIcon as k}from"./ui/icons/chevron-left-icon.js";import{e as x}from"./chunks/query-CeeutdfT.js";import{l as $}from"./chunks/chunk-4FFT6DC2-CVWibomC.js";import{DownloadFileEvent as I}from"./events.js";import{S as z,g as C}from"./chunks/chunk-GZF3YFSX-DM-GTqxg.js";import{checkDoubleIcon as T}from"./ui/icons/check-double-icon.js";import{checkIcon as D}from"./ui/icons/check-icon.js";import{getLocale as M}from"./i18n.js";import{S as j,a as q}from"./chunks/chunk-YTQUGGS3-DmCGIoFy.js";import{s as S}from"./chunks/context-consumer-ESdICVAb.js";import{Q as P}from"./chunks/chunk-RCFIJTXZ-C6Ir0-sM.js";import{e as _}from"./chunks/class-map-Co76I6aw.js";import{M as A}from"./chunks/mutation-controller-CR2qcqhH.js";import"./chunks/context-provider--AKuwfs9.js";import"./chunks/context-request-event-Dfydf1ub.js";import"./chunks/external-CJj32K_p.js";import"./chunks/parseISO-Dj3qSTG8.js";import"./chunks/format-CRFiCNHw.js";import"./chunks/isBefore-CPpTogxo.js";import"./env.js";import"./ui/icons/types.js";import"./chunks/directive-2EDmOukv.js";import"./chunks/style-map-CIdqdn7C.js";import"./chunks/query-Cjvi4_dT.js";const E=p("apiKey"),R=p("token"),B=p("professionalHash"),U=p("roomId"),H=p("consultationId"),N=p("consultationType");class MqChatRoomCloseEvent extends Event{static{this.eventName="mq-chat-room-close"}constructor(){super(MqChatRoomCloseEvent.eventName,{bubbles:!0,composed:!0})}}class MqChatRoomProfileEvent extends Event{static{this.eventName="mq-chat-room-profile"}constructor(){super(MqChatRoomProfileEvent.eventName,{bubbles:!0,composed:!0})}}const L=n`header{padding:var(--size-3) var(--size-4);background-color:var(--color-background-primary);display:flex;justify-content:space-between;gap:var(--size-1)}.left-side{display:flex;flex:1;min-width:0;align-items:center;gap:var(--size-3)}.left-side mq-avatar{flex-shrink:0}.info{min-width:0}.ghost-btn{text-align:left;background:0 0;border:none;padding:0;cursor:pointer}.right-side{display:flex;align-items:center}.name{font-family:var(--font-body);font-size:var(--text-sm);line-height:var(--text-sm--line-height);font-weight:var(--font-weight-bold);margin:0;color:var(--color-background);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.specialty{font-family:var(--font-body);font-size:var(--text-sm);line-height:var(--text-sm--line-height);font-weight:var(--font-weight-normal);margin:0;color:var(--color-white);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.name-skeleton{margin-bottom:var(--size-1)}.profile-title{font-family:var(--font-body);font-size:var(--text-lg);line-height:var(--text-lg--line-height);font-weight:var(--font-weight-medium);margin:0;color:var(--color-white)}`;let K=class ChatRoomHeader extends l{constructor(){super(...arguments),this.hideCloseButton=!1,this.getProfessionalQuery=new b(this,()=>f(u,{hash:this.professionalHash}))}static{this.styles=L}handleClose(){this.dispatchEvent(new MqChatRoomCloseEvent)}handleClickProfile(){this.dispatchEvent(new MqChatRoomProfileEvent)}renderProfile(){return d`<div class="left-side"><mq-button type="button" size="icon-md" variant="ghost-inverted" @click="${()=>{this.dispatchEvent(new CustomEvent("goto-chat",{bubbles:!0,composed:!0}))}}">${k({size:24})}</mq-button><p class="profile-title">${a("Perfil de profesional")}</p></div>`}renderChat(){return d`${this.getProfessionalQuery.render({complete:e=>d`<button type="button" class="left-side ghost-btn" @click="${this.handleClickProfile}"><mq-avatar src="${w(e.avatar??void 0)}" alt="User Avatar" fallback="John Doe" size="sm"></mq-avatar><div class="info"><p class="name">${e.name}</p><p class="specialty">${e.title}</p></div></button>`,pending:()=>d`<div class="left-side"><mq-skeleton width="45px" height="45px" border-radius="full"></mq-skeleton><div><mq-skeleton class="name-skeleton" height="14px" width="120px"></mq-skeleton><mq-skeleton height="14px" width="100px"></mq-skeleton></div></div>`})}`}render(){return d`<header>${"profile"===this.view?this.renderProfile():this.renderChat()}<div class="right-side">${this.hideCloseButton?c:d`<mq-button type="button" size="icon-md" variant="ghost-inverted" @click="${this.handleClose}">${y({size:24})}</mq-button>`}</div></header>`}};e([h({type:String})],K.prototype,"professionalHash",void 0),e([h({type:Boolean})],K.prototype,"hideCloseButton",void 0),e([h({type:String})],K.prototype,"view",void 0),K=e([i(),t("chat-room-header")],K);const F=/(https?:\/\/[^\s,;:!)\]}\]]+|www\.[^\s,;:!)\]}\]]+|[a-zA-Z0-9][-a-zA-Z0-9]*(?:\.[a-zA-Z0-9][-a-zA-Z0-9]*)+(?:\/[^\s,;:!)\]}\]]*|(?:\?|#|&)[^\s,;:!)\]}\]]*)?)/gi;function O(e){return e.split(F).map((e,t)=>{if(t%2==1){const t=e.startsWith("http")?e:`https://${e}`;return d`<a href="${t}" target="_blank" rel="noopener noreferrer" class="message-link">${e}</a>`}return e})}let Q=class TextMessageBubble extends l{static{this.styles=[n`:host{display:block}.message-bubble{padding:var(--size-2_5) var(--size-4);border-radius:var(--border-radius-lg);word-wrap:break-word;font-family:var(--font-body);font-size:var(--text-sm);line-height:var(--text-sm--line-height);font-weight:var(--font-weight-normal)}.message-bubble.received{background-color:var(--chat-received-message-background);color:var(--chat-received-message-foreground);border-bottom-left-radius:0}.message-bubble.sent{background-color:var(--chat-sent-message-background);color:var(--chat-sent-message-foreground);border-bottom-right-radius:0}.message-content{white-space:pre-wrap}.message-paragraph{margin:0 0 var(--size-3) 0}.message-paragraph:last-child{margin-bottom:0}.message-bubble.received .message-content a.message-link,.message-bubble.sent .message-content a.message-link{color:var(--color-primary-link-default);text-decoration:underline}.message-bubble.received .message-content a.message-link:hover,.message-bubble.sent .message-content a.message-link:hover{opacity:.8}`]}formatMessageContent(e){const t=e.split("\n\n").filter(e=>e.trim());if(t.length<=1)return d`<div class="message-content">${O(e)}</div>`;const s=t.map(e=>d`<div class="message-paragraph">${O(e.trim())}</div>`);return d`<div class="message-content">${s}</div>`}render(){return d`<div class="message-bubble ${this.kind}">${this.formatMessageContent(this.message.string)}</div>`}};e([h({type:Object})],Q.prototype,"message",void 0),e([h({type:String})],Q.prototype,"kind",void 0),Q=e([t("text-message-bubble")],Q);const V=n`:host{display:block}.message-bubble{padding:var(--size-2);border-radius:var(--border-radius-lg);font-size:var(--text-sm);line-height:var(--text-sm--line-height);font-weight:var(--font-weight-normal);overflow:hidden}.message-bubble.received{background-color:var(--chat-received-message-background);border-bottom-left-radius:0}.message-bubble.sent{background-color:var(--chat-sent-message-background);border-bottom-right-radius:0}.image-content{display:block;width:229px;height:229px;object-fit:cover;border-radius:var(--border-radius-md)}.image-placeholder{display:flex;align-items:center;justify-content:center;width:100%;max-width:300px;height:200px;background-color:var(--color-gray-light);border-radius:var(--border-radius-md);color:var(--chat-sent-message-foreground);font-size:var(--text-sm)}.image-content{cursor:pointer;transition:opacity .2s ease}.image-content:hover{opacity:.9}.preview-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:var(--dialog-underlay);display:flex;align-items:center;justify-content:center;z-index:1000;cursor:pointer;opacity:0;transition:opacity var(--dialog-transition-duration) ease}.preview-overlay.open{opacity:1}.preview-image{position:fixed;z-index:1000;inset:var(--mq-safe-top,0) var(--mq-safe-right,0) var(--mq-safe-bottom,0) var(--mq-safe-left,0);max-width:calc(100% - var(--mq-safe-left,4px) - var(--mq-safe-right,4px));max-height:calc(100% - var(--mq-safe-top,4px) - var(--mq-safe-bottom,4px));margin:auto;object-fit:contain;cursor:default;box-shadow:var(--dialog-shadow);transform:scale(.95);transition:transform var(--dialog-transition-duration) ease}.preview-overlay.open .preview-image{transform:scale(1)}.preview-close{z-index:1001;display:inline-flex;align-items:center;justify-content:center;height:var(--size-10);width:var(--size-10);position:absolute;top:var(--mq-safe-top,4px);right:var(--mq-safe-right,4px);background:rgba(255,255,255,.3);border:none;color:var(--color-neutrals-text-default);font-size:var(--text-xl);padding:var(--size-2) var(--size-3);border-radius:var(--border-radius-md);cursor:pointer;transition:background var(--dialog-transition-duration) ease}.preview-close:hover{background:var(--dialog-close-hover-bg)}`;let Y=class ImageMessageBubble extends l{constructor(){super(...arguments),this.showPreview=!1,this.isPreviewRendered=!1,this.isPreviewActive=!1,this.closeTimer=null}static{this.styles=V}handleImageError(e){const t=e.target;t.style.display="none";const s=t.nextElementSibling;s&&(s.style.display="flex")}handleImageLoad(e){const t=e.target.nextElementSibling;t&&(t.style.display="none")}handleImageClick(){this.showPreview=!0,this.isPreviewRendered=!0,this.updateComplete.then(()=>{requestAnimationFrame(()=>{this.isPreviewActive=!0})})}handleImageKeyDown(e){"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),this.handleImageClick())}handleClosePreview(e){e&&e.stopPropagation(),this.isPreviewActive=!1,this.closeTimer&&window.clearTimeout(this.closeTimer),this.closeTimer=window.setTimeout(()=>{this.isPreviewRendered=!1,this.showPreview=!1,this.closeTimer=null},200)}handleOverlayClick(e){e.target===e.currentTarget&&this.handleClosePreview()}handleOverlayKeyDown(e){"Enter"!==e.key&&" "!==e.key||e.target===e.currentTarget&&(e.preventDefault(),this.handleClosePreview())}handleKeyDown(e){"Escape"===e.key&&this.showPreview&&(e.preventDefault(),this.handleClosePreview())}handlePreviewImageKeyDown(e){e.stopPropagation()}connectedCallback(){super.connectedCallback(),document.addEventListener("keydown",this.handleKeyDown.bind(this))}disconnectedCallback(){super.disconnectedCallback(),document.removeEventListener("keydown",this.handleKeyDown.bind(this)),this.closeTimer&&(window.clearTimeout(this.closeTimer),this.closeTimer=null)}render(){const e=this.message.attachment.signed_url??this.message.attachment.url;return d`<div class="message-bubble ${this.kind}"><img class="image-content" src="${e}" width="229" height="229" alt="Shared attachment" @error="${this.handleImageError}" @load="${this.handleImageLoad}" @click="${this.handleImageClick}" @keydown="${this.handleImageKeyDown}" tabindex="0"><div class="image-placeholder" style="display:none">Image unavailable</div></div>${this.showPreview&&this.isPreviewRendered?d`<div class="preview-overlay ${this.isPreviewActive?"open":""}" @click="${this.handleOverlayClick}" @keydown="${this.handleOverlayKeyDown}" tabindex="0"><button class="preview-close" @click="${this.handleClosePreview}" aria-label="Close preview">${y({size:24})}</button> <img class="preview-image" src="${e}" alt="Shared attachment preview" @click="${e=>e.stopPropagation()}" @keydown="${this.handlePreviewImageKeyDown}" tabindex="0"></div>`:""}`}};e([h({type:Object})],Y.prototype,"message",void 0),e([h({type:String})],Y.prototype,"kind",void 0),e([o({context:R})],Y.prototype,"token",void 0),e([m()],Y.prototype,"showPreview",void 0),e([m()],Y.prototype,"isPreviewRendered",void 0),e([m()],Y.prototype,"isPreviewActive",void 0),Y=e([t("image-message-bubble")],Y);const Z=n`:host{background-color:var(--chat-system-message-background);color:var(--chat-system-message-foreground);display:block;padding:var(--size-2_5) var(--size-4);border-radius:var(--border-radius-lg);font-family:var(--font-body);font-size:var(--text-xs);line-height:var(--text-xs--line-height);font-weight:var(--font-weight-normal)}a.message-link{color:var(--color-primary-link-default);text-decoration:underline}a.message-link:hover{opacity:.8}`;let J=class SystemMessageBubble extends l{static{this.styles=Z}render(){return d`<div class="system-message-bubble">${O(this.message.string)}</div>`}};e([h({type:Object})],J.prototype,"message",void 0),J=e([t("system-message-bubble")],J);const G=n`:host{display:block}.message-bubble{display:inline-block;padding:var(--size-2_5) var(--size-4);border-radius:var(--border-radius-lg);word-wrap:break-word;font-family:var(--font-body);font-size:var(--text-sm);line-height:var(--text-sm--line-height);font-weight:var(--font-weight-normal);text-decoration:underline;color:var(--color-primary-link-default);border:none;cursor:pointer;text-align:left}.message-bubble:hover:not(:disabled){opacity:.8}.message-bubble:disabled{opacity:.5;cursor:not-allowed}.message-bubble.received{background-color:var(--chat-received-message-background);border-bottom-left-radius:0}.message-bubble.sent{background-color:var(--chat-sent-message-background);border-bottom-right-radius:0}.message-content{white-space:pre-wrap}.message-paragraph{margin:0 0 var(--size-3) 0}.message-paragraph:last-child{margin-bottom:0}`;let X=class FileMessageBubble extends l{constructor(){super(...arguments),this.isDownloading=!1}static{this.styles=G}formatMessageContent(e){const t=e.split("\n\n").filter(e=>e.trim());if(t.length<=1)return d`<div class="message-content">${e}</div>`;const s=t.map(e=>d`<div class="message-paragraph">${e.trim()}</div>`);return d`<div class="message-content">${s}</div>`}async handleDownload(){if(this.isDownloading)return;const e=this.message.attachment.url;try{this.isDownloading=!0;const t=await fetch(e,{headers:{Authorization:`Bearer ${this.token}`}});if(!t.ok)throw new Error(`Failed to fetch file: ${t.statusText}`);const s=await t.blob(),o=new FileReader;o.onloadend=()=>{const e=o.result,t=new I({url:e,filename:this.message.attachment.file_name});this.dispatchEvent(t),this.isDownloading=!1},o.onerror=()=>{$.error("Error reading file as data URL"),this.isDownloading=!1},o.readAsDataURL(s)}catch(e){$.error("Error downloading file:",e),this.isDownloading=!1}}render(){return d`<button type="button" @click="${this.handleDownload}" class="message-bubble ${this.kind}" ?disabled="${this.isDownloading}">${this.formatMessageContent(this.message.attachment.file_name)}</button>`}};e([h({type:Object})],X.prototype,"message",void 0),e([h({type:String})],X.prototype,"kind",void 0),e([o({context:R})],X.prototype,"token",void 0),e([m()],X.prototype,"isDownloading",void 0),X=e([t("file-message-bubble")],X);let W=class MessageBubble extends l{constructor(){super(...arguments),this.showTimestamp=!0}static{this.styles=[n`:host{display:block}.timestamp{font-family:var(--font-body);font-size:var(--text-xs);color:var(--color-gray-medium);font-weight:var(--font-weight-normal);text-align:left;display:flex;align-items:center;gap:var(--size-1)}.timestamp.sent{text-align:right;justify-content:flex-end}.status-icon{width:12px;height:12px}.status-icon.read{color:var(--color-primary)}`]}formatTimestamp(e){if(!e)return"";try{const t=new Date(e);return new Intl.DateTimeFormat(void 0,{hour:"2-digit",minute:"2-digit",hour12:!1}).format(t)}catch{return e}}renderStatusIcon(){switch(this.message.status){case v.Sent:return D({size:12,color:"currentColor"});case v.Received:return T({size:12,color:"currentColor"});case v.Read:return T({size:12,color:"currentColor",className:"read"});default:return null}}renderBubbleContent(){switch(this.message.type){case"image":return d`<image-message-bubble .message="${this.message}" .kind="${this.kind}"></image-message-bubble>`;case"file":return d`<file-message-bubble .message="${this.message}" .kind="${this.kind}"></file-message-bubble>`;default:return d`<text-message-bubble .message="${this.message}" .kind="${this.kind}"></text-message-bubble>`}}render(){if(this.message.senderType===z.system)return d`<system-message-bubble .message="${this.message}"></system-message-bubble>`;const e=this.message.createdAt?new Date(this.message.createdAt):this.message.time?new Date(this.message.time):null;return d`${this.renderBubbleContent()} ${this.showTimestamp&&e?d`<div class="timestamp ${this.kind}">${this.formatTimestamp(e.toISOString())} ${"sent"===this.kind?d`<span class="status-icon ${this.message.status===v.Read?"read":""}">${this.renderStatusIcon()}</span>`:""}</div>`:""}`}};e([h({type:String})],W.prototype,"kind",void 0),e([h({type:Object})],W.prototype,"message",void 0),e([h({type:Boolean})],W.prototype,"showTimestamp",void 0),W=e([t("message-bubble")],W);let ee=class DateBanner extends l{constructor(){super(...arguments),this.date=""}static{this.styles=[g,n`:host{display:block;margin-bottom:var(--size-2)}.date-banner{display:flex;align-items:center;justify-content:center;position:relative}.date-text{background-color:var(--color-gray-light);color:var(--color-gray-darker);font-family:var(--font-body);font-size:var(--text-xs);line-height:var(--text-xs--line-height);font-weight:var(--font-weight-medium);padding:var(--size-1) var(--size-2);border-radius:var(--border-radius-2xl);white-space:nowrap}`]}formatDate(e){const t=M().replace("_","-"),s=new Date(e),o=new Date,i=new Date(o);i.setDate(i.getDate()-1);const r=new Date(s.getFullYear(),s.getMonth(),s.getDate()),n=new Date(o.getFullYear(),o.getMonth(),o.getDate()),l=new Date(i.getFullYear(),i.getMonth(),i.getDate());return r.getTime()===n.getTime()?a("Hoy"):r.getTime()===l.getTime()?a("Ayer"):s.toLocaleDateString(t,{dateStyle:"medium"})}render(){return d`<div class="date-banner"><span class="date-text">${this.formatDate(this.date)}</span></div>`}};function te(e){return e.createdAt?new Date(e.createdAt):e.time?new Date(e.time):new Date}e([h({type:String})],ee.prototype,"date",void 0),ee=e([i(),t("date-banner")],ee);let se=class MessagesList extends l{constructor(){super(...arguments),this.messages=[]}static{this.styles=[g,n`:host{display:block;width:100%;height:100%;overflow-y:auto;overflow-x:hidden}.messages-container{display:flex;flex-direction:column;padding:var(--size-4);gap:var(--size-1);background-color:var(--color-white);padding-bottom:var(--size-4)}.message-wrapper{display:flex;width:100%}.message-wrapper.received{justify-content:flex-start}.message-wrapper.sent{justify-content:flex-end}.message-wrapper.system{justify-content:center}message-bubble{max-width:70%}`]}scrollToBottom(){requestAnimationFrame(()=>{const e=this.messagesContainerEnd;e&&e.scrollIntoView({behavior:"instant",block:"end"})})}shouldShowMessageTimestamp(e,t){if(e.senderType===z.system)return!1;if(!t)return!0;if(t.senderType!==e.senderType)return!0;if(t.senderType===z.ordinary&&e.senderType===z.ordinary&&t.fromUserHash!==e.fromUserHash)return!0;return(te(t).getTime()-te(e).getTime())/6e4>1}groupMessagesByDate(e){const t=[];let s=null;return e.forEach((o,i)=>{const a=te(o),r=a?.toDateString();r!==s&&(t.push({type:"date",data:a.toDateString()}),s=r??null);const n=e[i+1],l=this.shouldShowMessageTimestamp(o,n);t.push({type:"message",data:o,showTimestamp:l})}),t}firstUpdated(){this.scrollToBottom()}willUpdate(e){e.has("messages")&&this.scrollToBottom()}render(){const e=this.groupMessagesByDate(this.messages),t=e.map((t,s)=>{if("date"===t.type)return d`<date-banner .date="${t.data}"></date-banner>`;const o=this.professionalHash!==t.data.fromUserHash,i=t.data.senderType===z.system?"system":o?"sent":"received";return d`<div class="message-wrapper ${i}"><message-bubble .message="${t.data}" .kind="${i}" .showTimestamp="${t.showTimestamp||"date"===e[s+1]?.type}"></message-bubble></div>`});return d`<div class="messages-container">${t}<div class="messages-container-end"></div></div>`}};e([h({type:Array})],se.prototype,"messages",void 0),e([h({type:String})],se.prototype,"professionalHash",void 0),e([x(".messages-container-end")],se.prototype,"messagesContainerEnd",void 0),se=e([t("messages-list")],se);let oe=class MessageBubbleSkeleton extends l{constructor(){super(...arguments),this.variant="patient",this.height="md",this.showTimestamp=!0}static{this.styles=[n`:host{display:block}.message-bubble{padding:var(--size-4);border-radius:var(--border-radius-lg);margin-bottom:var(--size-1);position:relative;overflow:hidden}.message-bubble.doctor{background-color:var(--color-gray-light);border-bottom-left-radius:0}.message-bubble.patient{background-color:var(--color-background-primary-light);border-bottom-right-radius:0}:host([height=sm]) .message-bubble{height:var(--size-8)}:host([height=md]) .message-bubble{height:var(--size-12)}`]}render(){return d`<div class="message-bubble ${this.variant}"></div>${this.showTimestamp?d`<div class="timestamp-skeleton ${this.variant}"></div>`:""}`}};e([h({type:String})],oe.prototype,"variant",void 0),e([h({type:String})],oe.prototype,"height",void 0),e([h({type:Boolean})],oe.prototype,"showTimestamp",void 0),oe=e([t("message-bubble-skeleton")],oe);let ie=class MessagesSkeleton extends l{constructor(){super(...arguments),this.messageCount=6}static{this.styles=[g,n`:host{display:block;width:100%;height:100%;overflow:hidden}.messages-container{display:flex;flex-direction:column;padding:var(--size-4);gap:var(--size-3);max-width:100%;height:100%;background-color:var(--color-white)}.message-wrapper{display:flex;width:100%}.message-wrapper.doctor{justify-content:flex-start}.message-wrapper.patient{justify-content:flex-end}message-bubble-skeleton{max-width:85%;min-width:60%;width:100%}`]}getSkeletonHeight(e){const t=["sm","md","sm","md","sm","md"];return t[e%t.length]}getSkeletonVariant(e){const t=["doctor","patient","doctor","doctor","patient","doctor","patient"];return t[e%t.length]}renderSkeletonMessages(){return Array.from({length:this.messageCount},(e,t)=>{const s=this.getSkeletonVariant(t),o=this.getSkeletonHeight(t);return d`<div class="message-wrapper ${s}"><message-bubble-skeleton variant="${s}" height="${o}" ?showTimestamp="${t===this.messageCount-1||Math.random()>.7}"></message-bubble-skeleton></div>`})}render(){return d`<div class="messages-container">${this.renderSkeletonMessages()}</div>`}};e([h({type:Number})],ie.prototype,"messageCount",void 0),ie=e([t("messages-skeleton")],ie);var ae=class{constructor(e,t){this.host=e,this.listeners=[],this.host.addController(this),this.socketContext=new S(this.host,{context:j,subscribe:!0,callback:e=>{if(e&&(this.socket=e,t?.listeners)){this.listeners=t.listeners;for(const e of this.listeners)this.socket?.on(e.eventName,e.callback)}}})}hostConnected(){}hostDisconnected(){for(const e of this.listeners)this.socket?.off(e.eventName,e.callback)}};function re(e,t){return{queryKey:["rooms",t.roomId],queryFn:()=>e.rooms.getRoomMessages(t),staleTime:0}}class OptimisticUpdatesController{constructor(e){this.host=e,this.queryClientContext=new S(this.host,{context:P,subscribe:!0,callback:e=>{e&&(this.queryClient=e)}}),this.host.addController(this)}hostConnected(){}appendMessageToRoom(e,t){const s=re(u,{roomId:t}).queryKey;this.queryClient?.setQueriesData({queryKey:s,exact:!0},t=>[...t??[],e])}deleteMessage(e,t){if(!this.queryClient)return;const s=re(u,{roomId:t}).queryKey;this.queryClient.setQueryData(s,t=>(t??[]).map(t=>t.messageId===e?{...t,deletedAt:(new Date).toISOString(),string:a("Este mensaje fue eliminado")}:t))}updateMessageStatus({messageId:e,status:t,roomId:s}){if(!this.queryClient)return;const o=re(u,{roomId:s}).queryKey;this.queryClient.setQueryData(o,s=>(s??[]).map(s=>s.messageId===e?{...s,status:t}:s))}}let ne=class ChatRoomMessages extends l{constructor(){super(...arguments),this.getRoomMessagesQuery=new b(this,()=>re(u,{roomId:this.roomId})),this.optimisticUpdatesController=new OptimisticUpdatesController(this),this.onMessageReceived=e=>{if(e.roomId!==this.roomId)return;const t=function(e){const t={roomId:"string"==typeof e.roomId?Number.parseInt(e.roomId,10):e.roomId,messageId:e.messageId,status:e.status,senderType:e.senderType,fromUserHash:e.fromUserHash,time:e.time,createdAt:e.time?new Date(e.time).toISOString():null,deletedAt:null};switch(e.type){case"string":return{...t,type:"string",string:e.string,auto:e.auto?1:0,attachment:null};case"image":return{...t,type:"image",string:e.fileName||"",auto:0,attachment:{file_name:e.fileName,file_size:e.fileSize,url:e.imageUrl,type:"uncategorized",meta:{duration:0},signed_url:e.imageUrl}};case"file":return{...t,type:"file",string:e.fileName||"",auto:0,attachment:{file_name:e.fileName,file_size:e.fileSize,url:e.fileUrl,type:"uncategorized",meta:{duration:0},signed_url:e.fileUrl}};default:return{...t,type:"string",string:"",auto:0,attachment:null}}}(e);this.optimisticUpdatesController.appendMessageToRoom(t,t.roomId),t.roomId===this.roomId&&e.fromUserHash===this.professionalHash&&this._socketController.socket?.emit(q.messageStatus,e.messageId,this.roomId,v.Read)},this.onMessageDeleted=e=>{e.room_id===this.roomId&&this.optimisticUpdatesController.deleteMessage(e.message_id,e.room_id)},this.onMessageStatusUpdated=e=>{e.roomId===this.roomId&&this.optimisticUpdatesController.updateMessageStatus({messageId:e.messageId,status:e.status,roomId:e.roomId})},this._socketController=new ae(this,{listeners:[{eventName:q.message,callback:this.onMessageReceived},{eventName:q.message_deleted,callback:this.onMessageDeleted},{eventName:q.messageStatus,callback:this.onMessageStatusUpdated}]})}static{this.styles=[g,n`:host{display:block;width:100%;height:100%}`]}render(){return this.getRoomMessagesQuery.render({pending:()=>d`<messages-skeleton messageCount="8"></messages-skeleton>`,complete:e=>d`<messages-list .messages="${e}" .professionalHash="${this.professionalHash}"></messages-list>`})}};e([h({type:Number})],ne.prototype,"roomId",void 0),e([h({type:String})],ne.prototype,"professionalHash",void 0),ne=e([t("chat-room-messages")],ne);var le=class{constructor(e){this.string=e.string,this.roomId=e.roomId,this.messageId=e.messageId,this.type=e.type,this.fileName=e.fileName,this.autoMessage=e.autoMessage,this.senderType=e.senderType,this.attachmentType=e.attachmentType,this.consultationId=e.consultationId,this.consultationType=e.consultationType}toSocketMessage(){return[q.message,this.string,this.roomId,this.messageId,this.type,this.fileName,this.autoMessage,this.senderType,this.attachmentType,this.consultationId,this.consultationType]}},de=class extends le{constructor(e){super({roomId:e.roomId,messageId:e.messageId,string:e.string,type:"string",fileName:null,autoMessage:!1,senderType:z.ordinary,attachmentType:"uncategorized",consultationId:e.consultationId,consultationType:e.consultationType})}},ce=class extends le{constructor(e){super({roomId:e.roomId,messageId:e.messageId,string:e.base64Attachment,fileName:e.fileName,type:e.type,autoMessage:!1,senderType:z.ordinary,attachmentType:"uncategorized",consultationId:e.consultationId,consultationType:e.consultationType})}};async function he(e){return await Promise.all(e.map(async e=>{const t=await function(e){return new Promise((t,s)=>{const o=new FileReader;o.onload=()=>{const i=o.result.split(",")[1];i?t(i):s(new Error(`Invalid data URL format for file: ${e.name}`))},o.onerror=()=>{s(new Error(`Failed to read file: ${e.name}`))},o.readAsDataURL(e)})}(e);return{name:e.name,size:e.size,type:e.type,base64:t}}))}const me=n`:host{display:block;position:absolute;bottom:0;padding:var(--size-2) var(--size-2);background:#fff}.footer-container{display:flex;align-items:center;gap:var(--size-1);max-width:100%}.input-container{flex:1;position:relative;display:flex;align-items:center;border:1px solid var(--color-neutrals-border-disabled);border-radius:var(--border-radius-2xl);padding:0 var(--size-1);overflow:hidden}.input-container:focus-within{border-color:var(--color-primary)}.message-input{flex:1;border:none;outline:0;background:0 0;font-family:var(--font-body);font-size:var(--text-base);font-size:var(--text-sm);line-height:var(--text-sm--line-height);color:var(--color-neutrals-text-default);padding-left:var(--sp-2)}.message-input::placeholder{color:var(--color-neutrals-text-medium)}.attachment-icon{width:var(--size-5);height:var(--size-5);color:var(--color-primary)}.send-icon{width:var(--size-5);height:var(--size-5);color:var(--color-primary)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.send-button{color:var(--color-neutrals-link-disabled);background:0 0;border:none;padding:var(--size-2);border-radius:var(--border-radius-md);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background-color .2s ease}.send-button:hover:not(.disabled){background:var(--color-primary-light)}.send-button:active:not(.disabled){background-color:var(--color-neutrals-background-active)}.send-button.disabled{cursor:not-allowed;opacity:.4}.send-button.disabled .send-icon{color:var(--color-neutrals-text-disabled)}`;let pe=class ChatRoomFooter extends l{constructor(){super(...arguments),this.isTyping=!1,this.typingTimeoutId=null,this.inputValue="",this.socketController=new ae(this)}static{this.styles=[me]}handleInputChange(e){const t=e.target;this.inputValue=t.value,this.isTyping||(this.socketController.socket?.emit(q.typing,this.roomId),this.isTyping=!0),this.typingTimeoutId&&clearTimeout(this.typingTimeoutId),this.typingTimeoutId=setTimeout(()=>{this.isTyping&&(this.socketController.socket?.emit(q.stop_typing,this.roomId),this.isTyping=!1)},1500)}handleKeyDown(e){"Enter"!==e.key||e.shiftKey||(e.preventDefault(),this.handleSendMessage())}async handleAttachment(e){const t=e.target.files;if(!t||0===t.length)return;const s=t.item(0);if(s)try{const e=(await he([s]))[0];if(!e)return void $.error("Error converting file to base64");const t=e?.type.includes("image")?"image":"file",o=crypto.randomUUID(),i=s.name,a=new ce({type:t,base64Attachment:e.base64,fileName:i,roomId:this.roomId,messageId:o,consultationId:this.consultationId,consultationType:this.consultationType});this.socketController.socket?.emit(...a.toSocketMessage())}catch(e){$.error("Error converting files to base64:",e)}}handleAttachmentClick(){this.attachmentInput.click()}handleSendMessage(){const e=this.inputValue.trim();if(!e)return;const t=crypto.randomUUID();this.isTyping&&(this.socketController.socket?.emit(q.stop_typing,this.roomId),this.isTyping=!1,this.typingTimeoutId&&clearTimeout(this.typingTimeoutId));const s=new de({messageId:t,string:e,roomId:this.roomId,consultationId:this.consultationId,consultationType:this.consultationType});this.socketController.socket?.emit(...s.toSocketMessage()),this.inputValue=""}disconnectedCallback(){this.isTyping&&(this.socketController.socket?.emit(q.stop_typing,this.roomId),this.typingTimeoutId&&clearTimeout(this.typingTimeoutId))}render(){const e=this.inputValue.trim().length>0;return d`<div class="footer-container"><div class="input-container"><input class="message-input" type="text" placeholder="${a("Escribe aquí...")}" .value="${this.inputValue}" @input="${this.handleInputChange}" @keydown="${this.handleKeyDown}"><div><input class="attachment-input sr-only" type="file" accept="image/jpeg,image/jpg,image/png,image/gif,image/bmp,image/tiff,application/pdf,text/*,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-powerpoint,application/vnd.openxmlformats-officedocument.presentationml.presentation,audio/*,video/*" @change="${this.handleAttachment}"><mq-button variant="ghost" size="icon-sm" @click="${this.handleAttachmentClick}" title="${a("Adjuntar archivo")}">${d`<svg class="attachment-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"/></svg>`}</mq-button></div></div><button class="send-button ${e?"":"disabled"}" @click="${this.handleSendMessage}" ?disabled="${!e}" title="${a("Enviar mensaje")}">${d`<svg class="send-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 2L11 13"/><path d="M22 2L15 22L11 13L2 9L22 2z"/></svg>`}</button></div>`}};e([o({context:H})],pe.prototype,"consultationId",void 0),e([o({context:N})],pe.prototype,"consultationType",void 0),e([h({type:Number})],pe.prototype,"roomId",void 0),e([m()],pe.prototype,"inputValue",void 0),e([x(".attachment-input")],pe.prototype,"attachmentInput",void 0),pe=e([t("chat-room-footer")],pe);const ge=e=>({all_week:!0,monday:1===e,tuesday:2===e,wednesday:3===e,thursday:4===e,friday:5===e,saturday:6===e,sunday:7===e,working_week:e>=1&&e<=5,weekend:0===e||6===e});function ue(e,t){const s=ge(6===e?0:e+1);return t.some(e=>{const t=e.days_of_week;return!0===s[t]})}let ve=class AvailabilitySection extends l{constructor(){super(...arguments),this.gaps=[],this.selectedDay=function(){const e=(new Date).getDay();return 0===e?6:e-1}()}static{this.styles=n`:host{display:flex;flex-direction:column;gap:var(--size-3)}.availability-header{font-family:var(--font-body);font-size:var(--text-lg);line-height:var(--text-lg--line-height);font-weight:var(--font-weight-normal);color:var(--color-primary);text-align:center;margin:0;margin-bottom:var(--size-4) 0}.availability-days{display:flex;flex-direction:row;justify-content:center;gap:var(--size-1);overflow-x:auto;padding-bottom:var(--size-4)}.availability-button{outline:0;border:1px solid var(--color-gray-medium);background:0 0;color:var(--color-gray-medium);cursor:pointer;height:var(--size-9);width:var(--size-10);border-radius:var(--border-radius-sm);text-transform:capitalize;font-size:var(--text-xs);line-height:var(--text-xs--line-height);font-weight:var(--font-weight-medium)}.availability-button:hover{background-color:color-mix(in srgb,var(--color-gray-light) 50%,transparent)}.availability-button:focus{background-color:color-mix(in srgb,var(--color-gray-light) 50%,transparent)}.availability-button.active{background:var(--color-primary);color:var(--color-white);border:none}.availability-button:disabled{opacity:.5;cursor:not-allowed;background-color:var(--color-gray-light)}.time-title{font-family:var(--font-body);font-size:var(--text-xs);line-height:var(--text-xs--line-height);font-weight:var(--font-weight-medium);color:var(--color-gray-dark);margin:0;margin-bottom:var(--size-1)}.time-entries{display:flex;flex-direction:column;gap:var(--size-1);margin-bottom:var(--size-6)}.time-entry{font-family:var(--font-body);font-size:var(--text-xs);line-height:var(--text-xs--line-height);font-weight:var(--font-weight-normal);color:var(--color-gray-medium);margin:0}`}updated(e){e.has("gaps")&&(void 0===this.selectedDay||ue(this.selectedDay,this.gaps)||(this.selectedDay=void 0))}render(){const e=[{shortLabel:a("Lu"),label:a("Lunes"),key:"monday",disabled:!ue(0,this.gaps)},{shortLabel:a("Ma"),label:a("Martes"),key:"tuesday",disabled:!ue(1,this.gaps)},{shortLabel:a("Mi"),label:a("Miércoles"),key:"wednesday",disabled:!ue(2,this.gaps)},{shortLabel:a("Ju"),label:a("Jueves"),key:"thursday",disabled:!ue(3,this.gaps)},{shortLabel:a("Vi"),label:a("Viernes"),key:"friday",disabled:!ue(4,this.gaps)},{shortLabel:a("Sa"),label:a("Sábado"),key:"saturday",disabled:!ue(5,this.gaps)},{shortLabel:a("Do"),label:a("Domingo"),key:"sunday",disabled:!ue(6,this.gaps)}];return d`<h2 class="availability-header">${a("Disponibilidad")}</h2><div class="availability-days">${e.map((e,t)=>d`<button type="button" class="availability-button ${_({active:this.selectedDay===t&&!e.disabled})}" ?disabled="${e.disabled}" @click="${()=>{e.disabled||(this.selectedDay=t)}}">${e.shortLabel}</button>`)}</div>${void 0===this.selectedDay||e[this.selectedDay]?.disabled?"":(()=>{const t=function(e,t){const s=ge(6===e?0:e+1);return t.filter(e=>{const t=e.days_of_week;return!0===s[t]}).map(e=>({from_time:e.from_time,to_time:e.to_time}))}(this.selectedDay,this.gaps);return d`<div class="availability-time"><p class="time-title">${e[this.selectedDay]?.label}</p><div class="time-entries">${t.length>0?t.map(e=>d`<p class="time-entry">${a("De")} ${e.from_time} ${a("a")} ${e.to_time}</p>`):d`<p class="time-entry">${a("No hay horarios disponibles")}</p>`}</div></div>`})()}`}};e([h({type:Array})],ve.prototype,"gaps",void 0),e([m()],ve.prototype,"selectedDay",void 0),ve=e([i(),t("availability-section")],ve);const ye=n`:host{display:flex;flex-direction:column;height:100%;overflow-y:auto;background-color:var(--color-white)}.profile-container{padding:var(--size-6);display:flex;flex-direction:column}.profile-header{display:flex;flex-direction:column;align-items:center;text-align:center;padding-bottom:var(--size-6);border-bottom:1px solid var(--color-gray-medium);margin-bottom:var(--size-6)}.profile-avatar{margin-bottom:var(--size-2)}.profile-name{font-family:var(--font-body);font-size:var(--text-lg);line-height:var(--text-lg--line-height);font-weight:var(--font-weight-medium);color:var(--color-text-primary);margin:var(--size-4) 0}.profile-specialty{font-family:var(--font-body);font-size:var(--text-xs);line-height:var(--text-xs--line-height);font-weight:var(--font-weight-medium);color:var(--color-text-icons--secondary);margin:0;margin-bottom:var(--size-2);text-transform:uppercase}.profile-collegiate{font-family:var(--font-body);font-size:var(--text-xs);line-height:var(--text-xs--line-height);color:var(--color-gray-medium);text-transform:uppercase;margin:0}.description-header{font-family:var(--font-body);font-size:var(--text-sm);line-height:var(--text-sm--line-height);font-weight:var(--font-weight-medium);color:var(--color-primary);margin:0;margin-bottom:var(--size-3)}.description-text{font-family:var(--font-body);font-size:var(--text-sm);line-height:var(--text-sm--line-height);font-weight:var(--font-weight-normal);color:var(--color-foreground);margin:0}`;let be=class ChatRoomProfile extends l{constructor(){super(...arguments),this.getProfessionalQuery=new b(this,()=>f(u,{hash:this.professionalHash}))}static{this.styles=[g,ye]}renderProfile(e){return d`<div class="profile-container"><div class="profile-header"><mq-avatar class="profile-avatar" src="${e.avatar||""}" fallback="${e.name}" alt="${e.name}'s profile picture" size="xl"></mq-avatar><div><h1 class="profile-name">${e.name}</h1>${e.title?d`<p class="profile-specialty">${e.title}</p>`:""} ${e.collegiate_number?d`<p class="profile-collegiate">${a(r`Nº COL. ${e.collegiate_number}`)}</p>`:""}</div></div>${e.chat_schedule&&e.chat_schedule.gaps.length>0?d`<availability-section .gaps="${e.chat_schedule.gaps}"></availability-section>`:c} ${e.description||e.overview?d`<div><h2 class="description-header">${a("Descripción")}</h2><p class="description-text">${e.description||e.overview}</p></div>`:""}</div>`}render(){return this.getProfessionalQuery.render({pending:()=>d``,complete:e=>this.renderProfile(e)})}};e([h({type:String})],be.prototype,"professionalHash",void 0),be=e([i(),t("chat-room-profile")],be);const fe=n`.root{display:flex;flex-direction:column;height:100%;overflow:hidden}chat-room-header{flex-shrink:0}chat-room-messages{flex:1;overflow-y:auto;overflow-x:hidden}chat-room-footer{position:sticky;bottom:0;left:0;right:0;flex-shrink:0}`;let we=class MqChatRoom extends l{constructor(){super(...arguments),this.consultationId=void 0,this.consultationType=void 0,this.readonly=!1,this.hideCloseButton=!1,this.view="chat",this.socketController=new ae(this),this.readAllMessagesMutation=new A(this,{mutationFn:()=>u.professionals.readAllMessages({roomId:this.roomId}),onSuccess:()=>{this.queryClientContext?.invalidateQueries({queryKey:C(u,{roomId:this.roomId}).queryKey})}})}static{this.styles=[g,fe]}willUpdate(e){e.has("apiKey")&&this.apiKey&&u.setApiKey(this.apiKey),e.has("token")&&u.setAuthToken(this.token),e.has("roomId")&&(this.socketController.socket?.emit(q.joinRoom,this.roomId),this.readAllMessagesMutation.run(void 0))}render(){return d`<div class="root"><chat-room-header .professionalHash="${this.professionalHash}" .view="${this.view}" .hideCloseButton="${this.hideCloseButton}" @mq-chat-room-profile="${()=>{this.view="profile"}}" @goto-chat="${()=>{this.view="chat"}}"></chat-room-header>${"chat"===this.view?d`<chat-room-messages .roomId="${this.roomId}" .professionalHash="${this.professionalHash}"></chat-room-messages>${this.readonly?c:d`<chat-room-footer .roomId="${this.roomId}"></chat-room-footer>`}`:d`<chat-room-profile .professionalHash="${this.professionalHash}" @mq-chat-room-chat="${()=>{this.view="chat"}}"></chat-room-profile>`}</div>`}};e([s({context:E}),h({type:String,attribute:"api-key"})],we.prototype,"apiKey",void 0),e([s({context:R}),h({type:String,attribute:"token"})],we.prototype,"token",void 0),e([s({context:B}),h({type:String,attribute:"professional-hash"})],we.prototype,"professionalHash",void 0),e([s({context:U}),h({type:Number,attribute:"room-id"})],we.prototype,"roomId",void 0),e([s({context:H}),h({type:String,attribute:"consultation-id"})],we.prototype,"consultationId",void 0),e([s({context:N}),h({type:String,attribute:"consultation-type"})],we.prototype,"consultationType",void 0),e([h({type:Boolean,reflect:!0})],we.prototype,"readonly",void 0),e([h({type:Boolean,attribute:"hide-close-button"})],we.prototype,"hideCloseButton",void 0),e([m()],we.prototype,"view",void 0),e([o({context:P,subscribe:!0})],we.prototype,"queryClientContext",void 0),we=e([i(),t("mq-chat-room")],we);export{we as MqChatRoom,MqChatRoomCloseEvent,MqChatRoomProfileEvent};
|
|
1
|
+
import{_ as e,t}from"./chunks/custom-element-DA9Fxvxd.js";import{e as s}from"./chunks/provide-D2fnEhT2.js";import{c as o}from"./chunks/consume-CovVqBjI.js";import{l as i}from"./chunks/localized-decorator-BlOuLhym.js";import{m as a,s as r}from"./chunks/runtime-Bg1WXVCx.js";import{i as n,a as l,x as d,E as c}from"./chunks/lit-element-DiWJYFwC.js";import{n as h}from"./chunks/property-scuRaFcM.js";import{r as m}from"./chunks/state-LQivXIgA.js";import{n as p}from"./chunks/create-context-DqP79qjF.js";import{tokens as g}from"./theme.js";import{a as u,M as v}from"./chunks/api-chat-client-1Vz6ZOwp.js";import{xIcon as y}from"./ui/icons/x-icon.js";import"./ui/mq-avatar.js";import"./ui/mq-button.js";import"./ui/mq-skeleton.js";import{Q as b}from"./chunks/query-controller-BlO1Ax65.js";import{g as f}from"./chunks/chunk-YMQSBQHL-De_r7BNk.js";import{o as w}from"./chunks/if-defined-BYeVdwgd.js";import{chevronLeftIcon as k}from"./ui/icons/chevron-left-icon.js";import{e as x}from"./chunks/query-CeeutdfT.js";import{l as $}from"./chunks/chunk-4FFT6DC2-CVWibomC.js";import{DownloadFileEvent as I}from"./events.js";import{S as z,g as C}from"./chunks/chunk-GZF3YFSX-DM-GTqxg.js";import{checkDoubleIcon as T}from"./ui/icons/check-double-icon.js";import{checkIcon as D}from"./ui/icons/check-icon.js";import{getLocale as M}from"./i18n.js";import{S as j,a as q}from"./chunks/chunk-YTQUGGS3-DmCGIoFy.js";import{s as S}from"./chunks/context-consumer-ESdICVAb.js";import{Q as P}from"./chunks/chunk-RCFIJTXZ-C6Ir0-sM.js";import{e as _}from"./chunks/class-map-Co76I6aw.js";import{M as A}from"./chunks/mutation-controller-CR2qcqhH.js";import"./chunks/context-provider--AKuwfs9.js";import"./chunks/context-request-event-Dfydf1ub.js";import"./chunks/external-CJj32K_p.js";import"./chunks/parseISO-Dj3qSTG8.js";import"./chunks/format-CRFiCNHw.js";import"./chunks/isBefore-CPpTogxo.js";import"./env.js";import"./ui/icons/types.js";import"./chunks/directive-2EDmOukv.js";import"./chunks/style-map-CIdqdn7C.js";import"./chunks/query-Cjvi4_dT.js";const E=p("apiKey"),R=p("token"),B=p("professionalHash"),U=p("roomId"),H=p("consultationId"),N=p("consultationType");class MqChatRoomCloseEvent extends Event{static{this.eventName="mq-chat-room-close"}constructor(){super(MqChatRoomCloseEvent.eventName,{bubbles:!0,composed:!0})}}class MqChatRoomProfileEvent extends Event{static{this.eventName="mq-chat-room-profile"}constructor(){super(MqChatRoomProfileEvent.eventName,{bubbles:!0,composed:!0})}}const L=n`header{padding:var(--size-3) var(--size-4);background-color:var(--color-background-primary);display:flex;justify-content:space-between;gap:var(--size-1)}.left-side{display:flex;flex:1;min-width:0;align-items:center;gap:var(--size-3)}.left-side mq-avatar{flex-shrink:0}.info{min-width:0}.ghost-btn{text-align:left;background:0 0;border:none;padding:0;cursor:pointer}.right-side{display:flex;align-items:center}.name{font-family:var(--font-body);font-size:var(--text-sm);line-height:var(--text-sm--line-height);font-weight:var(--font-weight-bold);margin:0;color:var(--color-background);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.specialty{font-family:var(--font-body);font-size:var(--text-sm);line-height:var(--text-sm--line-height);font-weight:var(--font-weight-normal);margin:0;color:var(--color-white);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.name-skeleton{margin-bottom:var(--size-1)}.profile-title{font-family:var(--font-body);font-size:var(--text-lg);line-height:var(--text-lg--line-height);font-weight:var(--font-weight-medium);margin:0;color:var(--color-white)}`;let K=class ChatRoomHeader extends l{constructor(){super(...arguments),this.hideCloseButton=!1,this.getProfessionalQuery=new b(this,()=>f(u,{hash:this.professionalHash}))}static{this.styles=L}handleClose(){this.dispatchEvent(new MqChatRoomCloseEvent)}handleClickProfile(){this.dispatchEvent(new MqChatRoomProfileEvent)}renderProfile(){return d`<div class="left-side"><mq-button type="button" size="icon-md" variant="ghost-inverted" @click="${()=>{this.dispatchEvent(new CustomEvent("goto-chat",{bubbles:!0,composed:!0}))}}">${k({size:24})}</mq-button><p class="profile-title">${a("Perfil de profesional")}</p></div>`}renderChat(){return d`${this.getProfessionalQuery.render({complete:e=>d`<button type="button" class="left-side ghost-btn" @click="${this.handleClickProfile}"><mq-avatar src="${w(e.avatar??void 0)}" alt="User Avatar" fallback="John Doe" size="sm"></mq-avatar><div class="info"><p class="name">${e.name}</p><p class="specialty">${e.title}</p></div></button>`,pending:()=>d`<div class="left-side"><mq-skeleton width="45px" height="45px" border-radius="full"></mq-skeleton><div><mq-skeleton class="name-skeleton" height="14px" width="120px"></mq-skeleton><mq-skeleton height="14px" width="100px"></mq-skeleton></div></div>`})}`}render(){return d`<header>${"profile"===this.view?this.renderProfile():this.renderChat()}<div class="right-side">${this.hideCloseButton?c:d`<mq-button type="button" size="icon-md" variant="ghost-inverted" @click="${this.handleClose}">${y({size:24})}</mq-button>`}</div></header>`}};e([h({type:String})],K.prototype,"professionalHash",void 0),e([h({type:Boolean})],K.prototype,"hideCloseButton",void 0),e([h({type:String})],K.prototype,"view",void 0),K=e([i(),t("chat-room-header")],K);const F=/(https?:\/\/[^\s,;:!)\]}\]]+|www\.[^\s,;:!)\]}\]]+|[a-zA-Z0-9][-a-zA-Z0-9]*(?:\.[a-zA-Z0-9][-a-zA-Z0-9]*)+(?:\/[^\s,;:!)\]}\]]*|(?:\?|#|&)[^\s,;:!)\]}\]]*)?)/gi;function O(e){return e.split(F).map((e,t)=>{if(t%2==1){const t=e.startsWith("http")?e:`https://${e}`;return d`<a href="${t}" target="_blank" rel="noopener noreferrer" class="message-link">${e}</a>`}return e})}let Q=class TextMessageBubble extends l{static{this.styles=[n`:host{display:block}.message-bubble{padding:var(--size-2_5) var(--size-4);border-radius:var(--border-radius-lg);word-wrap:break-word;font-family:var(--font-body);font-size:var(--text-sm);line-height:var(--text-sm--line-height);font-weight:var(--font-weight-normal)}.message-bubble.received{background-color:var(--chat-received-message-background);color:var(--chat-received-message-foreground);border-bottom-left-radius:0}.message-bubble.sent{background-color:var(--chat-sent-message-background);color:var(--chat-sent-message-foreground);border-bottom-right-radius:0}.message-content{white-space:pre-wrap}.message-paragraph{margin:0 0 var(--size-3) 0}.message-paragraph:last-child{margin-bottom:0}.message-bubble.received .message-content a.message-link,.message-bubble.sent .message-content a.message-link{color:var(--color-primary-link-default);text-decoration:underline}.message-bubble.received .message-content a.message-link:hover,.message-bubble.sent .message-content a.message-link:hover{opacity:.8}`]}formatMessageContent(e){const t=e.split("\n\n").filter(e=>e.trim());if(t.length<=1)return d`<div class="message-content">${O(e)}</div>`;const s=t.map(e=>d`<div class="message-paragraph">${O(e.trim())}</div>`);return d`<div class="message-content">${s}</div>`}render(){return d`<div class="message-bubble ${this.kind}">${this.formatMessageContent(this.message.string)}</div>`}};e([h({type:Object})],Q.prototype,"message",void 0),e([h({type:String})],Q.prototype,"kind",void 0),Q=e([t("text-message-bubble")],Q);const V=n`:host{display:block}.message-bubble{padding:var(--size-2);border-radius:var(--border-radius-lg);font-size:var(--text-sm);line-height:var(--text-sm--line-height);font-weight:var(--font-weight-normal);overflow:hidden}.message-bubble.received{background-color:var(--chat-received-message-background);border-bottom-left-radius:0}.message-bubble.sent{background-color:var(--chat-sent-message-background);border-bottom-right-radius:0}.image-content{display:block;width:229px;height:229px;object-fit:cover;border-radius:var(--border-radius-md)}.image-placeholder{display:flex;align-items:center;justify-content:center;width:100%;max-width:300px;height:200px;background-color:var(--color-gray-light);border-radius:var(--border-radius-md);color:var(--chat-sent-message-foreground);font-size:var(--text-sm)}.image-content{cursor:pointer;transition:opacity .2s ease}.image-content:hover{opacity:.9}.preview-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:var(--dialog-underlay);display:flex;align-items:center;justify-content:center;z-index:1000;cursor:pointer;opacity:0;transition:opacity var(--dialog-transition-duration) ease}.preview-overlay.open{opacity:1}.preview-image{position:fixed;z-index:1000;inset:var(--mq-safe-top,0) var(--mq-safe-right,0) var(--mq-safe-bottom,0) var(--mq-safe-left,0);max-width:calc(100% - var(--mq-safe-left,4px) - var(--mq-safe-right,4px));max-height:calc(100% - var(--mq-safe-top,4px) - var(--mq-safe-bottom,4px));margin:auto;object-fit:contain;cursor:default;box-shadow:var(--dialog-shadow);transform:scale(.95);transition:transform var(--dialog-transition-duration) ease}.preview-overlay.open .preview-image{transform:scale(1)}.preview-close{z-index:1001;display:inline-flex;align-items:center;justify-content:center;height:var(--size-10);width:var(--size-10);position:absolute;top:var(--mq-safe-top,4px);right:var(--mq-safe-right,4px);background:rgba(255,255,255,.3);border:none;color:var(--color-neutrals-text-default);font-size:var(--text-xl);padding:var(--size-2) var(--size-3);border-radius:var(--border-radius-md);cursor:pointer;transition:background var(--dialog-transition-duration) ease}.preview-close:hover{background:var(--dialog-close-hover-bg)}`;let Y=class ImageMessageBubble extends l{constructor(){super(...arguments),this.showPreview=!1,this.isPreviewRendered=!1,this.isPreviewActive=!1,this.closeTimer=null}static{this.styles=V}handleImageError(e){const t=e.target;t.style.display="none";const s=t.nextElementSibling;s&&(s.style.display="flex")}handleImageLoad(e){const t=e.target.nextElementSibling;t&&(t.style.display="none")}handleImageClick(){this.showPreview=!0,this.isPreviewRendered=!0,this.updateComplete.then(()=>{requestAnimationFrame(()=>{this.isPreviewActive=!0})})}handleImageKeyDown(e){"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),this.handleImageClick())}handleClosePreview(e){e&&e.stopPropagation(),this.isPreviewActive=!1,this.closeTimer&&window.clearTimeout(this.closeTimer),this.closeTimer=window.setTimeout(()=>{this.isPreviewRendered=!1,this.showPreview=!1,this.closeTimer=null},200)}handleOverlayClick(e){e.target===e.currentTarget&&this.handleClosePreview()}handleOverlayKeyDown(e){"Enter"!==e.key&&" "!==e.key||e.target===e.currentTarget&&(e.preventDefault(),this.handleClosePreview())}handleKeyDown(e){"Escape"===e.key&&this.showPreview&&(e.preventDefault(),this.handleClosePreview())}handlePreviewImageKeyDown(e){e.stopPropagation()}connectedCallback(){super.connectedCallback(),document.addEventListener("keydown",this.handleKeyDown.bind(this))}disconnectedCallback(){super.disconnectedCallback(),document.removeEventListener("keydown",this.handleKeyDown.bind(this)),this.closeTimer&&(window.clearTimeout(this.closeTimer),this.closeTimer=null)}render(){const e=this.message.attachment.signed_url??this.message.attachment.url;return d`<div class="message-bubble ${this.kind}"><img class="image-content" src="${e}" width="229" height="229" alt="Shared attachment" @error="${this.handleImageError}" @load="${this.handleImageLoad}" @click="${this.handleImageClick}" @keydown="${this.handleImageKeyDown}" tabindex="0"><div class="image-placeholder" style="display:none">Image unavailable</div></div>${this.showPreview&&this.isPreviewRendered?d`<div class="preview-overlay ${this.isPreviewActive?"open":""}" @click="${this.handleOverlayClick}" @keydown="${this.handleOverlayKeyDown}" tabindex="0"><button class="preview-close" @click="${this.handleClosePreview}" aria-label="Close preview">${y({size:24})}</button> <img class="preview-image" src="${e}" alt="Shared attachment preview" @click="${e=>e.stopPropagation()}" @keydown="${this.handlePreviewImageKeyDown}" tabindex="0"></div>`:""}`}};e([h({type:Object})],Y.prototype,"message",void 0),e([h({type:String})],Y.prototype,"kind",void 0),e([o({context:R})],Y.prototype,"token",void 0),e([m()],Y.prototype,"showPreview",void 0),e([m()],Y.prototype,"isPreviewRendered",void 0),e([m()],Y.prototype,"isPreviewActive",void 0),Y=e([t("image-message-bubble")],Y);const Z=n`:host{background-color:var(--chat-system-message-background);color:var(--chat-system-message-foreground);display:block;padding:var(--size-2_5) var(--size-4);border-radius:var(--border-radius-lg);font-family:var(--font-body);font-size:var(--text-xs);line-height:var(--text-xs--line-height);font-weight:var(--font-weight-normal)}a.message-link{color:var(--color-primary-link-default);text-decoration:underline}a.message-link:hover{opacity:.8}`;let J=class SystemMessageBubble extends l{static{this.styles=Z}render(){return d`<div class="system-message-bubble">${O(this.message.string)}</div>`}};e([h({type:Object})],J.prototype,"message",void 0),J=e([t("system-message-bubble")],J);const G=n`:host{display:block}.message-bubble{display:inline-block;padding:var(--size-2_5) var(--size-4);border-radius:var(--border-radius-lg);word-wrap:break-word;font-family:var(--font-body);font-size:var(--text-sm);line-height:var(--text-sm--line-height);font-weight:var(--font-weight-normal);text-decoration:underline;color:var(--color-primary-link-default);border:none;cursor:pointer;text-align:left}.message-bubble:hover:not(:disabled){opacity:.8}.message-bubble:disabled{opacity:.5;cursor:not-allowed}.message-bubble.received{background-color:var(--chat-received-message-background);border-bottom-left-radius:0}.message-bubble.sent{background-color:var(--chat-sent-message-background);border-bottom-right-radius:0}.message-content{white-space:pre-wrap}.message-paragraph{margin:0 0 var(--size-3) 0}.message-paragraph:last-child{margin-bottom:0}`;let X=class FileMessageBubble extends l{constructor(){super(...arguments),this.isDownloading=!1}static{this.styles=G}formatMessageContent(e){const t=e.split("\n\n").filter(e=>e.trim());if(t.length<=1)return d`<div class="message-content">${e}</div>`;const s=t.map(e=>d`<div class="message-paragraph">${e.trim()}</div>`);return d`<div class="message-content">${s}</div>`}async handleDownload(){if(this.isDownloading)return;const e=this.message.attachment.url;try{this.isDownloading=!0;const t=await fetch(e,{headers:{Authorization:`Bearer ${this.token}`}});if(!t.ok)throw new Error(`Failed to fetch file: ${t.statusText}`);const s=await t.blob(),o=new FileReader;o.onloadend=()=>{const e=o.result,t=new I({url:e,filename:this.message.attachment.file_name});this.dispatchEvent(t),this.isDownloading=!1},o.onerror=()=>{$.error("Error reading file as data URL"),this.isDownloading=!1},o.readAsDataURL(s)}catch(e){$.error("Error downloading file:",e),this.isDownloading=!1}}render(){return d`<button type="button" @click="${this.handleDownload}" class="message-bubble ${this.kind}" ?disabled="${this.isDownloading}">${this.formatMessageContent(this.message.attachment.file_name)}</button>`}};e([h({type:Object})],X.prototype,"message",void 0),e([h({type:String})],X.prototype,"kind",void 0),e([o({context:R})],X.prototype,"token",void 0),e([m()],X.prototype,"isDownloading",void 0),X=e([t("file-message-bubble")],X);let W=class MessageBubble extends l{constructor(){super(...arguments),this.showTimestamp=!0}static{this.styles=[n`:host{display:block}.timestamp{font-family:var(--font-body);font-size:var(--text-xs);color:var(--color-gray-medium);font-weight:var(--font-weight-normal);text-align:left;display:flex;align-items:center;gap:var(--size-1)}.timestamp.sent{text-align:right;justify-content:flex-end}.status-icon{width:12px;height:12px}.status-icon.read{color:var(--color-primary)}`]}formatTimestamp(e){if(!e)return"";try{const t=new Date(e);return new Intl.DateTimeFormat(void 0,{hour:"2-digit",minute:"2-digit",hour12:!1}).format(t)}catch{return e}}renderStatusIcon(){switch(this.message.status){case v.Sent:return D({size:12,color:"currentColor"});case v.Received:return T({size:12,color:"currentColor"});case v.Read:return T({size:12,color:"currentColor",className:"read"});default:return null}}renderBubbleContent(){switch(this.message.type){case"image":return d`<image-message-bubble .message="${this.message}" .kind="${this.kind}"></image-message-bubble>`;case"file":return d`<file-message-bubble .message="${this.message}" .kind="${this.kind}"></file-message-bubble>`;default:return d`<text-message-bubble .message="${this.message}" .kind="${this.kind}"></text-message-bubble>`}}render(){if(this.message.senderType===z.system)return d`<system-message-bubble .message="${this.message}"></system-message-bubble>`;const e=this.message.createdAt?new Date(this.message.createdAt):this.message.time?new Date(this.message.time):null;return d`${this.renderBubbleContent()} ${this.showTimestamp&&e?d`<div class="timestamp ${this.kind}">${this.formatTimestamp(e.toISOString())} ${"sent"===this.kind?d`<span class="status-icon ${this.message.status===v.Read?"read":""}">${this.renderStatusIcon()}</span>`:""}</div>`:""}`}};e([h({type:String})],W.prototype,"kind",void 0),e([h({type:Object})],W.prototype,"message",void 0),e([h({type:Boolean})],W.prototype,"showTimestamp",void 0),W=e([t("message-bubble")],W);let ee=class DateBanner extends l{constructor(){super(...arguments),this.date=""}static{this.styles=[g,n`:host{display:block;margin-bottom:var(--size-2)}.date-banner{display:flex;align-items:center;justify-content:center;position:relative}.date-text{background-color:var(--color-gray-light);color:var(--color-gray-darker);font-family:var(--font-body);font-size:var(--text-xs);line-height:var(--text-xs--line-height);font-weight:var(--font-weight-medium);padding:var(--size-1) var(--size-2);border-radius:var(--border-radius-2xl);white-space:nowrap}`]}formatDate(e){const t=M().replace("_","-"),s=new Date(e),o=new Date,i=new Date(o);i.setDate(i.getDate()-1);const r=new Date(s.getFullYear(),s.getMonth(),s.getDate()),n=new Date(o.getFullYear(),o.getMonth(),o.getDate()),l=new Date(i.getFullYear(),i.getMonth(),i.getDate());return r.getTime()===n.getTime()?a("Hoy"):r.getTime()===l.getTime()?a("Ayer"):s.toLocaleDateString(t,{dateStyle:"medium"})}render(){return d`<div class="date-banner"><span class="date-text">${this.formatDate(this.date)}</span></div>`}};function te(e){return e.createdAt?new Date(e.createdAt):e.time?new Date(e.time):new Date}e([h({type:String})],ee.prototype,"date",void 0),ee=e([i(),t("date-banner")],ee);let se=class MessagesList extends l{constructor(){super(...arguments),this.messages=[]}static{this.styles=[g,n`:host{display:block;width:100%;height:100%;overflow-y:auto;overflow-x:hidden}.messages-container{display:flex;flex-direction:column;padding:var(--size-4);gap:var(--size-1);background-color:var(--color-white);padding-bottom:var(--size-4)}.message-wrapper{display:flex;width:100%}.message-wrapper.received{justify-content:flex-start}.message-wrapper.sent{justify-content:flex-end}.message-wrapper.system{justify-content:center}message-bubble{max-width:70%}`]}scrollToBottom(){requestAnimationFrame(()=>{const e=this.messagesContainerEnd;e&&e.scrollIntoView({behavior:"instant",block:"end"})})}shouldShowMessageTimestamp(e,t){if(e.senderType===z.system)return!1;if(!t)return!0;if(t.senderType!==e.senderType)return!0;if(t.senderType===z.ordinary&&e.senderType===z.ordinary&&t.fromUserHash!==e.fromUserHash)return!0;return(te(t).getTime()-te(e).getTime())/6e4>1}groupMessagesByDate(e){const t=[];let s=null;return e.forEach((o,i)=>{const a=te(o),r=a?.toDateString();r!==s&&(t.push({type:"date",data:a.toDateString()}),s=r??null);const n=e[i+1],l=this.shouldShowMessageTimestamp(o,n);t.push({type:"message",data:o,showTimestamp:l})}),t}firstUpdated(){this.scrollToBottom()}willUpdate(e){e.has("messages")&&this.scrollToBottom()}render(){const e=this.groupMessagesByDate(this.messages),t=e.map((t,s)=>{if("date"===t.type)return d`<date-banner .date="${t.data}"></date-banner>`;const o=this.professionalHash!==t.data.fromUserHash,i=t.data.senderType===z.system?"system":o?"sent":"received";return d`<div class="message-wrapper ${i}"><message-bubble .message="${t.data}" .kind="${i}" .showTimestamp="${t.showTimestamp||"date"===e[s+1]?.type}"></message-bubble></div>`});return d`<div class="messages-container">${t}<div class="messages-container-end"></div></div>`}};e([h({type:Array})],se.prototype,"messages",void 0),e([h({type:String})],se.prototype,"professionalHash",void 0),e([x(".messages-container-end")],se.prototype,"messagesContainerEnd",void 0),se=e([t("messages-list")],se);let oe=class MessageBubbleSkeleton extends l{constructor(){super(...arguments),this.variant="patient",this.height="md",this.showTimestamp=!0}static{this.styles=[n`:host{display:block}.message-bubble{padding:var(--size-4);border-radius:var(--border-radius-lg);margin-bottom:var(--size-1);position:relative;overflow:hidden}.message-bubble.doctor{background-color:var(--color-gray-light);border-bottom-left-radius:0}.message-bubble.patient{background-color:var(--color-background-primary-light);border-bottom-right-radius:0}:host([height=sm]) .message-bubble{height:var(--size-8)}:host([height=md]) .message-bubble{height:var(--size-12)}`]}render(){return d`<div class="message-bubble ${this.variant}"></div>${this.showTimestamp?d`<div class="timestamp-skeleton ${this.variant}"></div>`:""}`}};e([h({type:String})],oe.prototype,"variant",void 0),e([h({type:String})],oe.prototype,"height",void 0),e([h({type:Boolean})],oe.prototype,"showTimestamp",void 0),oe=e([t("message-bubble-skeleton")],oe);let ie=class MessagesSkeleton extends l{constructor(){super(...arguments),this.messageCount=6}static{this.styles=[g,n`:host{display:block;width:100%;height:100%;overflow:hidden}.messages-container{display:flex;flex-direction:column;padding:var(--size-4);gap:var(--size-3);max-width:100%;height:100%;background-color:var(--color-white)}.message-wrapper{display:flex;width:100%}.message-wrapper.doctor{justify-content:flex-start}.message-wrapper.patient{justify-content:flex-end}message-bubble-skeleton{max-width:85%;min-width:60%;width:100%}`]}getSkeletonHeight(e){const t=["sm","md","sm","md","sm","md"];return t[e%t.length]}getSkeletonVariant(e){const t=["doctor","patient","doctor","doctor","patient","doctor","patient"];return t[e%t.length]}renderSkeletonMessages(){return Array.from({length:this.messageCount},(e,t)=>{const s=this.getSkeletonVariant(t),o=this.getSkeletonHeight(t);return d`<div class="message-wrapper ${s}"><message-bubble-skeleton variant="${s}" height="${o}" ?showTimestamp="${t===this.messageCount-1||Math.random()>.7}"></message-bubble-skeleton></div>`})}render(){return d`<div class="messages-container">${this.renderSkeletonMessages()}</div>`}};e([h({type:Number})],ie.prototype,"messageCount",void 0),ie=e([t("messages-skeleton")],ie);var ae=class{constructor(e,t){this.host=e,this.listeners=[],this.host.addController(this),this.socketContext=new S(this.host,{context:j,subscribe:!0,callback:e=>{if(e&&(this.socket=e,t?.listeners)){this.listeners=t.listeners;for(const e of this.listeners)this.socket?.on(e.eventName,e.callback)}}})}hostConnected(){}hostDisconnected(){for(const e of this.listeners)this.socket?.off(e.eventName,e.callback)}};function re(e,t){return{queryKey:["rooms",t.roomId],queryFn:()=>e.rooms.getRoomMessages(t),staleTime:0}}class OptimisticUpdatesController{constructor(e){this.host=e,this.queryClientContext=new S(this.host,{context:P,subscribe:!0,callback:e=>{e&&(this.queryClient=e)}}),this.host.addController(this)}hostConnected(){}appendMessageToRoom(e,t){const s=re(u,{roomId:t}).queryKey;this.queryClient?.setQueriesData({queryKey:s,exact:!0},t=>[...t??[],e])}deleteMessage(e,t){if(!this.queryClient)return;const s=re(u,{roomId:t}).queryKey;this.queryClient.setQueryData(s,t=>(t??[]).map(t=>t.messageId===e?{...t,deletedAt:(new Date).toISOString(),string:a("Este mensaje fue eliminado")}:t))}updateMessageStatus({messageId:e,status:t,roomId:s}){if(!this.queryClient)return;const o=re(u,{roomId:s}).queryKey;this.queryClient.setQueryData(o,s=>(s??[]).map(s=>s.messageId===e?{...s,status:t}:s))}}let ne=class ChatRoomMessages extends l{constructor(){super(...arguments),this.getRoomMessagesQuery=new b(this,()=>re(u,{roomId:this.roomId})),this.optimisticUpdatesController=new OptimisticUpdatesController(this),this.onMessageReceived=e=>{if(e.roomId!==this.roomId)return;const t=function(e){const t={roomId:"string"==typeof e.roomId?Number.parseInt(e.roomId,10):e.roomId,messageId:e.messageId,status:e.status,senderType:e.senderType,fromUserHash:e.fromUserHash,time:e.time,createdAt:e.time?new Date(e.time).toISOString():null,deletedAt:null};switch(e.type){case"string":return{...t,type:"string",string:e.string,auto:e.auto?1:0,attachment:null};case"image":return{...t,type:"image",string:e.fileName||"",auto:0,attachment:{file_name:e.fileName,file_size:e.fileSize,url:e.imageUrl,type:"uncategorized",meta:{duration:0},signed_url:e.imageUrl}};case"file":return{...t,type:"file",string:e.fileName||"",auto:0,attachment:{file_name:e.fileName,file_size:e.fileSize,url:e.fileUrl,type:"uncategorized",meta:{duration:0},signed_url:e.fileUrl}};default:return{...t,type:"string",string:"",auto:0,attachment:null}}}(e);this.optimisticUpdatesController.appendMessageToRoom(t,t.roomId),t.roomId===this.roomId&&e.fromUserHash===this.professionalHash&&this._socketController.socket?.emit(q.messageStatus,e.messageId,this.roomId,v.Read)},this.onMessageDeleted=e=>{e.room_id===this.roomId&&this.optimisticUpdatesController.deleteMessage(e.message_id,e.room_id)},this.onMessageStatusUpdated=e=>{e.roomId===this.roomId&&this.optimisticUpdatesController.updateMessageStatus({messageId:e.messageId,status:e.status,roomId:e.roomId})},this._socketController=new ae(this,{listeners:[{eventName:q.message,callback:this.onMessageReceived},{eventName:q.message_deleted,callback:this.onMessageDeleted},{eventName:q.messageStatus,callback:this.onMessageStatusUpdated}]})}static{this.styles=[g,n`:host{display:block;width:100%;height:100%}`]}render(){return this.getRoomMessagesQuery.render({pending:()=>d`<messages-skeleton messageCount="8"></messages-skeleton>`,complete:e=>d`<messages-list .messages="${e}" .professionalHash="${this.professionalHash}"></messages-list>`})}};e([h({type:Number})],ne.prototype,"roomId",void 0),e([h({type:String})],ne.prototype,"professionalHash",void 0),ne=e([t("chat-room-messages")],ne);var le=class{constructor(e){this.string=e.string,this.roomId=e.roomId,this.messageId=e.messageId,this.type=e.type,this.fileName=e.fileName,this.autoMessage=e.autoMessage,this.senderType=e.senderType,this.attachmentType=e.attachmentType,this.consultationId=e.consultationId,this.consultationType=e.consultationType}toSocketMessage(){return[q.message,this.string,this.roomId,this.messageId,this.type,this.fileName,this.autoMessage,this.senderType,this.attachmentType,this.consultationId,this.consultationType]}},de=class extends le{constructor(e){super({roomId:e.roomId,messageId:e.messageId,string:e.string,type:"string",fileName:null,autoMessage:!1,senderType:z.ordinary,attachmentType:"uncategorized",consultationId:e.consultationId,consultationType:e.consultationType})}},ce=class extends le{constructor(e){super({roomId:e.roomId,messageId:e.messageId,string:e.base64Attachment,fileName:e.fileName,type:e.type,autoMessage:!1,senderType:z.ordinary,attachmentType:"uncategorized",consultationId:e.consultationId,consultationType:e.consultationType})}};async function he(e){return await Promise.all(e.map(async e=>{const t=await function(e){return new Promise((t,s)=>{const o=new FileReader;o.onload=()=>{const i=o.result.split(",")[1];i?t(i):s(new Error(`Invalid data URL format for file: ${e.name}`))},o.onerror=()=>{s(new Error(`Failed to read file: ${e.name}`))},o.readAsDataURL(e)})}(e);return{name:e.name,size:e.size,type:e.type,base64:t}}))}const me=n`:host{display:block;position:absolute;bottom:0;padding:var(--size-2) var(--size-2);background:#fff}.footer-container{display:flex;align-items:center;gap:var(--size-1);max-width:100%}.input-container{flex:1;position:relative;display:flex;align-items:center;border:1px solid var(--color-neutrals-border-disabled);border-radius:var(--border-radius-2xl);padding:0 var(--size-1);overflow:hidden}.input-container:focus-within{border-color:var(--color-primary)}.message-input{flex:1;border:none;outline:0;background:0 0;font-family:var(--font-body);font-size:var(--text-base);font-size:var(--text-sm);line-height:var(--text-sm--line-height);color:var(--color-neutrals-text-default);padding-left:var(--sp-2)}.message-input::placeholder{color:var(--color-neutrals-text-medium)}.attachment-icon{width:var(--size-5);height:var(--size-5);color:var(--color-primary)}.send-icon{width:var(--size-5);height:var(--size-5);color:var(--color-primary)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.send-button{color:var(--color-neutrals-link-disabled);background:0 0;border:none;padding:var(--size-2);border-radius:var(--border-radius-md);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background-color .2s ease}.send-button:hover:not(.disabled){background:var(--color-primary-light)}.send-button:active:not(.disabled){background-color:var(--color-neutrals-background-active)}.send-button.disabled{cursor:not-allowed;opacity:.4}.send-button.disabled .send-icon{color:var(--color-neutrals-text-disabled)}`;let pe=class ChatRoomFooter extends l{constructor(){super(...arguments),this.isTyping=!1,this.typingTimeoutId=null,this.inputValue="",this.socketController=new ae(this)}static{this.styles=[me]}handleInputChange(e){const t=e.target;this.inputValue=t.value,this.isTyping||(this.socketController.socket?.emit(q.typing,this.roomId),this.isTyping=!0),this.typingTimeoutId&&clearTimeout(this.typingTimeoutId),this.typingTimeoutId=setTimeout(()=>{this.isTyping&&(this.socketController.socket?.emit(q.stop_typing,this.roomId),this.isTyping=!1)},1500)}handleKeyDown(e){"Enter"!==e.key||e.shiftKey||(e.preventDefault(),this.handleSendMessage())}async handleAttachment(e){const t=e.target.files;if(!t||0===t.length)return;const s=t.item(0);if(s)try{const e=(await he([s]))[0];if(!e)return void $.error("Error converting file to base64");const t=e?.type.includes("image")?"image":"file",o=crypto.randomUUID(),i=s.name,a=new ce({type:t,base64Attachment:e.base64,fileName:i,roomId:this.roomId,messageId:o,consultationId:this.consultationId,consultationType:this.consultationType});this.socketController.socket?.emit(...a.toSocketMessage())}catch(e){$.error("Error converting files to base64:",e)}}handleAttachmentClick(){this.attachmentInput.click()}handleSendMessage(){const e=this.inputValue.trim();if(!e)return;const t=crypto.randomUUID();this.isTyping&&(this.socketController.socket?.emit(q.stop_typing,this.roomId),this.isTyping=!1,this.typingTimeoutId&&clearTimeout(this.typingTimeoutId));const s=new de({messageId:t,string:e,roomId:this.roomId,consultationId:this.consultationId,consultationType:this.consultationType});this.socketController.socket?.emit(...s.toSocketMessage()),this.inputValue=""}disconnectedCallback(){this.isTyping&&(this.socketController.socket?.emit(q.stop_typing,this.roomId),this.typingTimeoutId&&clearTimeout(this.typingTimeoutId))}render(){const e=this.inputValue.trim().length>0;return d`<div class="footer-container"><div class="input-container"><input class="message-input" type="text" placeholder="${a("Escribe aquí...")}" .value="${this.inputValue}" @input="${this.handleInputChange}" @keydown="${this.handleKeyDown}"><div><input class="attachment-input sr-only" type="file" accept="image/jpeg,image/jpg,image/png,image/gif,image/bmp,image/tiff,application/pdf,text/*,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-powerpoint,application/vnd.openxmlformats-officedocument.presentationml.presentation,audio/*,video/*" @change="${this.handleAttachment}"><mq-button variant="ghost" size="icon-sm" @click="${this.handleAttachmentClick}" title="${a("Adjuntar archivo")}">${d`<svg class="attachment-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"/></svg>`}</mq-button></div></div><button class="send-button ${e?"":"disabled"}" @click="${this.handleSendMessage}" ?disabled="${!e}" title="${a("Enviar mensaje")}">${d`<svg class="send-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 2L11 13"/><path d="M22 2L15 22L11 13L2 9L22 2z"/></svg>`}</button></div>`}};e([o({context:H})],pe.prototype,"consultationId",void 0),e([o({context:N})],pe.prototype,"consultationType",void 0),e([h({type:Number})],pe.prototype,"roomId",void 0),e([m()],pe.prototype,"inputValue",void 0),e([x(".attachment-input")],pe.prototype,"attachmentInput",void 0),pe=e([t("chat-room-footer")],pe);const ge=e=>({all_week:!0,monday:1===e,tuesday:2===e,wednesday:3===e,thursday:4===e,friday:5===e,saturday:6===e,sunday:7===e,working_week:e>=1&&e<=5,weekend:0===e||6===e});function ue(e,t){const s=ge(6===e?0:e+1);return t.some(e=>{const t=e.days_of_week;return!0===s[t]})}let ve=class AvailabilitySection extends l{constructor(){super(...arguments),this.gaps=[],this.selectedDay=function(){const e=(new Date).getDay();return 0===e?6:e-1}()}static{this.styles=n`:host{display:flex;flex-direction:column;gap:var(--size-3)}.availability-header{font-family:var(--font-body);font-size:var(--text-lg);line-height:var(--text-lg--line-height);font-weight:var(--font-weight-normal);color:var(--color-primary);text-align:center;margin:0;margin-bottom:var(--size-4) 0}.availability-days{display:flex;flex-direction:row;justify-content:center;gap:var(--size-1);overflow-x:auto;padding-bottom:var(--size-4)}.availability-button{outline:0;border:1px solid var(--color-gray-medium);background:0 0;color:var(--color-gray-medium);cursor:pointer;height:var(--size-9);width:var(--size-10);border-radius:var(--border-radius-sm);text-transform:capitalize;font-size:var(--text-xs);line-height:var(--text-xs--line-height);font-weight:var(--font-weight-medium)}.availability-button:hover{background-color:color-mix(in srgb,var(--color-gray-light) 50%,transparent)}.availability-button:focus{background-color:color-mix(in srgb,var(--color-gray-light) 50%,transparent)}.availability-button.active{background:var(--color-primary);color:var(--color-white);border:none}.availability-button:disabled{opacity:.5;cursor:not-allowed;background-color:var(--color-gray-light)}.time-title{font-family:var(--font-body);font-size:var(--text-xs);line-height:var(--text-xs--line-height);font-weight:var(--font-weight-medium);color:var(--color-gray-dark);margin:0;margin-bottom:var(--size-1)}.time-entries{display:flex;flex-direction:column;gap:var(--size-1);margin-bottom:var(--size-6)}.time-entry{font-family:var(--font-body);font-size:var(--text-xs);line-height:var(--text-xs--line-height);font-weight:var(--font-weight-normal);color:var(--color-gray-medium);margin:0}`}updated(e){e.has("gaps")&&(void 0===this.selectedDay||ue(this.selectedDay,this.gaps)||(this.selectedDay=void 0))}render(){const e=[{shortLabel:a("Lu"),label:a("Lunes"),key:"monday",disabled:!ue(0,this.gaps)},{shortLabel:a("Ma"),label:a("Martes"),key:"tuesday",disabled:!ue(1,this.gaps)},{shortLabel:a("Mi"),label:a("Miércoles"),key:"wednesday",disabled:!ue(2,this.gaps)},{shortLabel:a("Ju"),label:a("Jueves"),key:"thursday",disabled:!ue(3,this.gaps)},{shortLabel:a("Vi"),label:a("Viernes"),key:"friday",disabled:!ue(4,this.gaps)},{shortLabel:a("Sa"),label:a("Sábado"),key:"saturday",disabled:!ue(5,this.gaps)},{shortLabel:a("Do"),label:a("Domingo"),key:"sunday",disabled:!ue(6,this.gaps)}];return d`<h2 class="availability-header">${a("Disponibilidad")}</h2><div class="availability-days">${e.map((e,t)=>d`<button type="button" class="availability-button ${_({active:this.selectedDay===t&&!e.disabled})}" ?disabled="${e.disabled}" @click="${()=>{e.disabled||(this.selectedDay=t)}}">${e.shortLabel}</button>`)}</div>${void 0===this.selectedDay||e[this.selectedDay]?.disabled?"":(()=>{const t=function(e,t){const s=ge(6===e?0:e+1);return t.filter(e=>{const t=e.days_of_week;return!0===s[t]}).map(e=>({from_time:e.from_time,to_time:e.to_time}))}(this.selectedDay,this.gaps);return d`<div class="availability-time"><p class="time-title">${e[this.selectedDay]?.label}</p><div class="time-entries">${t.length>0?t.map(e=>d`<p class="time-entry">${a("De")} ${e.from_time} ${a("a")} ${e.to_time}</p>`):d`<p class="time-entry">${a("No hay horarios disponibles")}</p>`}</div></div>`})()}`}};e([h({type:Array})],ve.prototype,"gaps",void 0),e([m()],ve.prototype,"selectedDay",void 0),ve=e([i(),t("availability-section")],ve);const ye=n`:host{display:flex;flex-direction:column;height:100%;overflow-y:auto;background-color:var(--color-white)}.profile-container{padding:var(--size-6);display:flex;flex-direction:column}.profile-header{display:flex;flex-direction:column;align-items:center;text-align:center;padding-bottom:var(--size-6);border-bottom:1px solid var(--color-gray-medium);margin-bottom:var(--size-6)}.profile-avatar{margin-bottom:var(--size-2)}.profile-name{font-family:var(--font-body);font-size:var(--text-lg);line-height:var(--text-lg--line-height);font-weight:var(--font-weight-medium);color:var(--color-text-primary);margin:var(--size-4) 0}.profile-specialty{font-family:var(--font-body);font-size:var(--text-xs);line-height:var(--text-xs--line-height);font-weight:var(--font-weight-medium);color:var(--color-text-icons--secondary);margin:0;margin-bottom:var(--size-2);text-transform:uppercase}.profile-collegiate{font-family:var(--font-body);font-size:var(--text-xs);line-height:var(--text-xs--line-height);color:var(--color-gray-medium);text-transform:uppercase;margin:0}.description-header{font-family:var(--font-body);font-size:var(--text-sm);line-height:var(--text-sm--line-height);font-weight:var(--font-weight-medium);color:var(--color-primary);margin:0;margin-bottom:var(--size-3)}.description-text{font-family:var(--font-body);font-size:var(--text-sm);line-height:var(--text-sm--line-height);font-weight:var(--font-weight-normal);color:var(--color-foreground);margin:0}`;let be=class ChatRoomProfile extends l{constructor(){super(...arguments),this.getProfessionalQuery=new b(this,()=>f(u,{hash:this.professionalHash}))}static{this.styles=[g,ye]}renderProfile(e){return d`<div class="profile-container"><div class="profile-header"><mq-avatar class="profile-avatar" src="${e.avatar||""}" fallback="${e.name}" alt="${e.name}'s profile picture" size="xl"></mq-avatar><div><h1 class="profile-name">${e.name}</h1>${e.title?d`<p class="profile-specialty">${e.title}</p>`:""} ${e.collegiate_number?d`<p class="profile-collegiate">${a(r`Nº COL. ${e.collegiate_number}`)}</p>`:""}</div></div>${e.chat_schedule&&e.chat_schedule.gaps.length>0?d`<availability-section .gaps="${e.chat_schedule.gaps}"></availability-section>`:c} ${e.description||e.overview?d`<div><h2 class="description-header">${a("Descripción")}</h2><p class="description-text">${e.description||e.overview}</p></div>`:""}</div>`}render(){return this.getProfessionalQuery.render({pending:()=>d``,complete:e=>this.renderProfile(e)})}};e([h({type:String})],be.prototype,"professionalHash",void 0),be=e([i(),t("chat-room-profile")],be);const fe=n`.root{display:flex;flex-direction:column;height:100%;overflow:hidden}chat-room-header{flex-shrink:0}chat-room-messages{flex:1;overflow-y:auto;overflow-x:hidden}chat-room-footer{position:sticky;bottom:0;left:0;right:0;flex-shrink:0}`;let we=class MqChatRoom extends l{constructor(){super(...arguments),this.consultationId=void 0,this.consultationType=void 0,this.readonly=!1,this.hideCloseButton=!1,this.view="chat",this.socketController=new ae(this),this.readAllMessagesMutation=new A(this,{mutationFn:()=>u.professionals.readAllMessages({roomId:this.roomId}),onSuccess:()=>{this.queryClientContext?.invalidateQueries({queryKey:C(u,{roomId:this.roomId}).queryKey})}})}static{this.styles=[g,fe]}willUpdate(e){e.has("apiKey")&&this.apiKey&&u.setApiKey(this.apiKey),e.has("token")&&u.setAuthToken(this.token),e.has("roomId")&&(this.socketController.socket?.emit(q.joinRoom,this.roomId),this.readAllMessagesMutation.run(void 0))}render(){return d`<div class="root"><chat-room-header .professionalHash="${this.professionalHash}" .view="${this.view}" .hideCloseButton="${this.hideCloseButton}" @mq-chat-room-profile="${()=>{this.view="profile"}}" @goto-chat="${()=>{this.view="chat"}}"></chat-room-header>${"chat"===this.view?d`<chat-room-messages .roomId="${this.roomId}" .professionalHash="${this.professionalHash}"></chat-room-messages>${this.readonly?c:d`<chat-room-footer .roomId="${this.roomId}"></chat-room-footer>`}`:d`<chat-room-profile .professionalHash="${this.professionalHash}" @mq-chat-room-chat="${()=>{this.view="chat"}}"></chat-room-profile>`}</div>`}};e([s({context:E}),h({type:String,attribute:"api-key"})],we.prototype,"apiKey",void 0),e([s({context:R}),h({type:String,attribute:"token"})],we.prototype,"token",void 0),e([s({context:B}),h({type:String,attribute:"professional-hash"})],we.prototype,"professionalHash",void 0),e([s({context:U}),h({type:Number,attribute:"room-id"})],we.prototype,"roomId",void 0),e([s({context:H}),h({type:String,attribute:"consultation-id"})],we.prototype,"consultationId",void 0),e([s({context:N}),h({type:String,attribute:"consultation-type"})],we.prototype,"consultationType",void 0),e([h({type:Boolean,reflect:!0})],we.prototype,"readonly",void 0),e([h({type:Boolean,attribute:"hide-close-button"})],we.prototype,"hideCloseButton",void 0),e([m()],we.prototype,"view",void 0),e([o({context:P,subscribe:!0})],we.prototype,"queryClientContext",void 0),we=e([i(),t("mq-chat-room")],we);export{we as MqChatRoom,MqChatRoomCloseEvent,MqChatRoomProfileEvent};
|
package/dist/mq-checkout.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as t,t as e}from"./chunks/custom-element-DA9Fxvxd.js";import{m as s}from"./chunks/runtime-Bg1WXVCx.js";import{l as i}from"./chunks/localized-decorator-BlOuLhym.js";import{h as o}from"./chunks/task-Bj8p7kJX.js";import{a as n,P as r}from"./chunks/api-chat-client-
|
|
1
|
+
import{_ as t,t as e}from"./chunks/custom-element-DA9Fxvxd.js";import{m as s}from"./chunks/runtime-Bg1WXVCx.js";import{l as i}from"./chunks/localized-decorator-BlOuLhym.js";import{h as o}from"./chunks/task-Bj8p7kJX.js";import{a as n,P as r}from"./chunks/api-chat-client-1Vz6ZOwp.js";import{L as a}from"./chunks/login-token-task-BI-L2zSV.js";import{l as h}from"./chunks/chunk-4FFT6DC2-CVWibomC.js";import{i as d,a as l,x as c}from"./chunks/lit-element-DiWJYFwC.js";import{n as p}from"./chunks/property-scuRaFcM.js";import{r as m}from"./chunks/state-LQivXIgA.js";import{setEnv as u}from"./env.js";import{tokens as v}from"./theme.js";import{initLocalization as _,isValidLocale as f,setLocale as y}from"./i18n.js";import"./ui/mq-skeleton.js";import"./chunks/external-CJj32K_p.js";import"./chunks/parseISO-Dj3qSTG8.js";import"./chunks/format-CRFiCNHw.js";import"./chunks/isBefore-CPpTogxo.js";import"./chunks/style-map-CIdqdn7C.js";import"./chunks/directive-2EDmOukv.js";var g=class{constructor(t,e){this.host=t,this.options=e,this._deadline=0,this._timedOut=!1,this.host.addController(this)}get timedOut(){return this._timedOut}hostConnected(){const t=this.options.intervalMs??1e3,e=void 0!==this.options.startDelayMs?this.options.startDelayMs:t;this._deadline=Date.now()+this.options.timeoutMs,this._timedOut=!1,this._startTimeoutId=setTimeout(()=>{this._startTimeoutId=void 0,this._poll(),this._intervalId=setInterval(()=>{this._poll()},t)},e)}hostDisconnected(){this._stop()}stop(){this._stop()}async _poll(){if(Date.now()>=this._deadline)return this._stop(),this._timedOut=!0,this.host.requestUpdate(),void this.options.onTimeout?.();try{const t=await this.options.refetchFn();this.options.shouldComplete(t)&&(this._stop(),this.options.onComplete?.(t))}catch{}}_stop(){void 0!==this._intervalId&&(clearInterval(this._intervalId),this._intervalId=void 0),void 0!==this._startTimeoutId&&(clearTimeout(this._startTimeoutId),this._startTimeoutId=void 0)}};try{_()}catch{}const k=d`:host{height:100%;min-height:0;display:flex;flex-direction:column;flex:1}.payment-frame{position:relative;width:100%;min-width:0;display:flex;flex-direction:column;flex:1;min-height:0}.payment-frame iframe:not(.loaded){position:absolute;width:1px;height:1px;opacity:0;pointer-events:none;border:none}.payment-frame iframe.loaded{flex:none;display:block;width:100%;border:none;min-height:1050px}.state{display:flex;flex-direction:column;align-items:center;justify-content:center;flex:1;gap:var(--sp-4);padding:var(--sp-8);text-align:center}.state-title{font-family:var(--font-titles);font-size:var(--text-2xl);line-height:var(--text-2xl--line-height);font-weight:var(--font-weight-bold);color:var(--color-neutrals-text-default);margin:0}.state-message{font-family:var(--font-body);font-size:var(--text-base);line-height:var(--text-base--line-height);color:var(--color-neutrals-text-default);margin:0}`,E="mediquo:payment:retry",b="mediquo:payment:resize";class CheckoutSuccessEvent extends Event{static{this.eventName="payment-success"}constructor(t){super(CheckoutSuccessEvent.eventName,{bubbles:!0,composed:!0}),this.detail=t}}class CheckoutDeniedEvent extends Event{static{this.eventName="payment-denied"}constructor(t){super(CheckoutDeniedEvent.eventName,{bubbles:!0,composed:!0}),this.detail=t}}class CheckoutErrorEvent extends Event{static{this.eventName="payment-error"}constructor(t){super(CheckoutErrorEvent.eventName,{bubbles:!0,composed:!0}),this.detail=t}}class CheckoutRetryEvent extends Event{static{this.eventName="payment-retry"}constructor(){super(CheckoutRetryEvent.eventName,{bubbles:!0,composed:!0})}}let C=class MqCheckout extends l{constructor(){super(...arguments),this._iframeLoaded=!1,this._iframeHeight=null,this._sessionEpoch=0,this._currentSessionId=null,this._paymentOrigin=null,this._loginTokenTask=new a(this,n,{args:()=>[this.apiKey,this.token],onComplete:t=>{n.setAuthToken(t.access_token),this._sessionTask.run()},onError:()=>{this.dispatchEvent(new CheckoutErrorEvent({reason:"auth"}))}}),this._sessionTask=new o(this,{task:async()=>{if("function"!=typeof this.provideSession)throw new Error("mq-checkout: `provideSession` property is required");return this.provideSession()},args:()=>[this._sessionEpoch],autoRun:!1,onComplete:t=>{this._currentSessionId=t.sessionId,this._iframeLoaded=!1,this._iframeHeight=null;try{this._paymentOrigin=new URL(t.paymentUrl).origin}catch{this._paymentOrigin=null,h.warn(`mq-checkout: invalid paymentUrl "${t.paymentUrl}"`)}},onError:()=>{this.dispatchEvent(new CheckoutErrorEvent({reason:"session"}))}}),this._paymentPoll=new g(this,{startDelayMs:5e3,intervalMs:3e3,timeoutMs:6e5,refetchFn:async()=>{if(!this._currentSessionId)throw new Error("mq-checkout: session not ready");const t=await n.payments.getPaymentSession(this._currentSessionId);return t.status===r.Denied&&(this._paymentPoll.stop(),this.dispatchEvent(new CheckoutDeniedEvent({sessionId:this._currentSessionId}))),t},shouldComplete:t=>t.status===r.Paid,onComplete:t=>{this.dispatchEvent(new CheckoutSuccessEvent({sessionId:this._currentSessionId??"",reference:t.consultation_id}))},onTimeout:()=>{this.dispatchEvent(new CheckoutErrorEvent({reason:"timeout"}))}}),this._onMessage=t=>{if(!this._paymentOrigin||t.origin===this._paymentOrigin)switch(t.data?.type){case E:return this.dispatchEvent(new CheckoutRetryEvent),this._sessionEpoch+=1,void this._sessionTask.run();case b:return void("number"==typeof t.data.height&&(this._iframeHeight=t.data.height))}}}static{this.styles=[v,k]}get _timedOut(){return this._paymentPoll.timedOut}connectedCallback(){super.connectedCallback(),window.addEventListener("message",this._onMessage)}disconnectedCallback(){window.removeEventListener("message",this._onMessage),super.disconnectedCallback()}willUpdate(t){if(t.has("env")&&this.env&&u(this.env),t.has("apiKey")&&n.setApiKey(this.apiKey),t.has("locale")){const t=f(this.locale)?this.locale:"es_ES";y(t),n.setLanguage(t)}}_onIframeLoad(){this._iframeLoaded=!0}_renderState(t,e){return c`<div class="state"><p class="state-title">${t}</p>${e?c`<p class="state-message">${e}</p>`:null}</div>`}_renderLoading(){return c`<div class="payment-frame"><mq-skeleton width="100%" height="600px" border-radius="md" role="status" aria-live="polite" aria-label="${s("Cargando portal de pago")}"></mq-skeleton></div>`}_renderFrame(t){return c`<div class="payment-frame">${this._iframeLoaded?null:this._renderLoading()}<iframe class="${this._iframeLoaded?"loaded":""}" src="${t}" title="${s("Portal de pago")}" style="${null!==this._iframeHeight?`min-height: ${this._iframeHeight}px; height: ${this._iframeHeight}px;`:""}" @load="${this._onIframeLoad}"></iframe></div>`}render(){return this._timedOut?this._renderState(s("No hemos podido confirmar tu pago"),s("Ha ocurrido un problema al verificar el estado de tu pago. Por favor, contacta con soporte si el cargo se ha realizado.")):this._loginTokenTask.render({pending:()=>this._renderLoading(),error:()=>this._renderState(s("No hemos podido iniciar el pago"),s("Por favor, inténtalo de nuevo más tarde.")),complete:()=>this._sessionTask.render({initial:()=>this._renderLoading(),pending:()=>this._renderLoading(),error:()=>this._renderState(s("No hemos podido iniciar el pago"),s("Por favor, inténtalo de nuevo más tarde.")),complete:t=>this._renderFrame(t.paymentUrl)})})}};t([p({type:String,attribute:"env"})],C.prototype,"env",void 0),t([p({type:String,attribute:"api-key"})],C.prototype,"apiKey",void 0),t([p({type:String,attribute:"token"})],C.prototype,"token",void 0),t([p({type:String,attribute:"locale",reflect:!0})],C.prototype,"locale",void 0),t([p({attribute:!1})],C.prototype,"provideSession",void 0),t([m()],C.prototype,"_iframeLoaded",void 0),t([m()],C.prototype,"_iframeHeight",void 0),t([m()],C.prototype,"_sessionEpoch",void 0),C=t([i(),e("mq-checkout")],C);export{CheckoutDeniedEvent,CheckoutErrorEvent,CheckoutRetryEvent,CheckoutSuccessEvent,C as MqCheckout};
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import * as lit_html from 'lit-html';
|
|
2
|
+
import * as lit from 'lit';
|
|
3
|
+
import { LitElement, nothing, PropertyValues } from 'lit';
|
|
4
|
+
import { L as LoginTokenResponse } from './chunks/schemas.d-5LR6aN9I.js';
|
|
5
|
+
import { Env } from './env.js';
|
|
6
|
+
import './chunks/mq-layout-D8Mak16a.js';
|
|
7
|
+
import './ui/mq-skeleton.js';
|
|
8
|
+
import './ui/mq-avatar.js';
|
|
9
|
+
import './ui/mq-button.js';
|
|
10
|
+
import z from 'zod';
|
|
11
|
+
import './chunks/index-DNUbmrQl.js';
|
|
12
|
+
import './ui/mq-card.js';
|
|
13
|
+
import './chunks/appointment-card-skeleton-1c7552Ln.js';
|
|
14
|
+
export { MqAppointmentBookEvent, MqAppointmentJoinVideocallEvent, MqAppointmentRescheduleEvent, MqAppointmentViewDocumentationEvent, MqViewAppointmentsEvent, MqViewDocumentsEvent } from './events.js';
|
|
15
|
+
import './chunks/appointment-details-DpzdYLjq.js';
|
|
16
|
+
import './chunks/appointment.model.d-Dy50gMPg.js';
|
|
17
|
+
import './chunks/professional-overview-mO3tuMuH.js';
|
|
18
|
+
import './ui/mq-text-button.js';
|
|
19
|
+
import './chunks/mq-chat-room-DuG4RuIp.js';
|
|
20
|
+
import '@tanstack/query-core';
|
|
21
|
+
import './ui/mq-floating-bubble.js';
|
|
22
|
+
import './chunks/price.d-CwLosdAN.js';
|
|
23
|
+
import './ui/mq-dialog.js';
|
|
24
|
+
import './ui/mq-unread-badge.js';
|
|
25
|
+
|
|
26
|
+
declare class SupportChatBanner extends LitElement {
|
|
27
|
+
static styles: lit.CSSResult;
|
|
28
|
+
professionalHash?: string;
|
|
29
|
+
private _unreadCount;
|
|
30
|
+
private _professionalQuery;
|
|
31
|
+
connectedCallback(): void;
|
|
32
|
+
disconnectedCallback(): void;
|
|
33
|
+
private _onUnreadChange;
|
|
34
|
+
private get _hasUnread();
|
|
35
|
+
private _toggleSupportChat;
|
|
36
|
+
private _ctaIcon;
|
|
37
|
+
render(): lit_html.TemplateResult<1> | typeof nothing | null;
|
|
38
|
+
}
|
|
39
|
+
declare global {
|
|
40
|
+
interface HTMLElementTagNameMap {
|
|
41
|
+
"support-chat-banner": SupportChatBanner;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
declare const GetOrganizationSetupResponseSchema: z.ZodObject<{
|
|
46
|
+
primary_color: z.ZodNullable<z.ZodString>;
|
|
47
|
+
logo: z.ZodNullable<z.ZodString>;
|
|
48
|
+
favicon: z.ZodNullable<z.ZodString>;
|
|
49
|
+
support_professional: z.ZodOptional<z.ZodObject<{
|
|
50
|
+
hash: z.ZodNullable<z.ZodString>;
|
|
51
|
+
}, "strip", z.ZodTypeAny, {
|
|
52
|
+
hash: string | null;
|
|
53
|
+
}, {
|
|
54
|
+
hash: string | null;
|
|
55
|
+
}>>;
|
|
56
|
+
home: z.ZodObject<{
|
|
57
|
+
title: z.ZodNullable<z.ZodString>;
|
|
58
|
+
description: z.ZodNullable<z.ZodString>;
|
|
59
|
+
image_url: z.ZodNullable<z.ZodString>;
|
|
60
|
+
}, "strip", z.ZodTypeAny, {
|
|
61
|
+
description: string | null;
|
|
62
|
+
title: string | null;
|
|
63
|
+
image_url: string | null;
|
|
64
|
+
}, {
|
|
65
|
+
description: string | null;
|
|
66
|
+
title: string | null;
|
|
67
|
+
image_url: string | null;
|
|
68
|
+
}>;
|
|
69
|
+
appointments: z.ZodObject<{
|
|
70
|
+
reserve_conditions: z.ZodNullable<z.ZodString>;
|
|
71
|
+
seconds_before_start_to_refund_on_cancel: z.ZodNullable<z.ZodNumber>;
|
|
72
|
+
has_nps: z.ZodOptional<z.ZodBoolean>;
|
|
73
|
+
has_chat_in_appointment: z.ZodOptional<z.ZodBoolean>;
|
|
74
|
+
has_discount_coupons_show: z.ZodOptional<z.ZodBoolean>;
|
|
75
|
+
}, "strip", z.ZodTypeAny, {
|
|
76
|
+
reserve_conditions: string | null;
|
|
77
|
+
seconds_before_start_to_refund_on_cancel: number | null;
|
|
78
|
+
has_nps?: boolean | undefined;
|
|
79
|
+
has_chat_in_appointment?: boolean | undefined;
|
|
80
|
+
has_discount_coupons_show?: boolean | undefined;
|
|
81
|
+
}, {
|
|
82
|
+
reserve_conditions: string | null;
|
|
83
|
+
seconds_before_start_to_refund_on_cancel: number | null;
|
|
84
|
+
has_nps?: boolean | undefined;
|
|
85
|
+
has_chat_in_appointment?: boolean | undefined;
|
|
86
|
+
has_discount_coupons_show?: boolean | undefined;
|
|
87
|
+
}>;
|
|
88
|
+
legal_consent: z.ZodObject<{
|
|
89
|
+
terms_url: z.ZodNullable<z.ZodString>;
|
|
90
|
+
privacy_url: z.ZodNullable<z.ZodString>;
|
|
91
|
+
}, "strip", z.ZodTypeAny, {
|
|
92
|
+
terms_url: string | null;
|
|
93
|
+
privacy_url: string | null;
|
|
94
|
+
}, {
|
|
95
|
+
terms_url: string | null;
|
|
96
|
+
privacy_url: string | null;
|
|
97
|
+
}>;
|
|
98
|
+
}, "strip", z.ZodTypeAny, {
|
|
99
|
+
legal_consent: {
|
|
100
|
+
terms_url: string | null;
|
|
101
|
+
privacy_url: string | null;
|
|
102
|
+
};
|
|
103
|
+
primary_color: string | null;
|
|
104
|
+
logo: string | null;
|
|
105
|
+
favicon: string | null;
|
|
106
|
+
home: {
|
|
107
|
+
description: string | null;
|
|
108
|
+
title: string | null;
|
|
109
|
+
image_url: string | null;
|
|
110
|
+
};
|
|
111
|
+
appointments: {
|
|
112
|
+
reserve_conditions: string | null;
|
|
113
|
+
seconds_before_start_to_refund_on_cancel: number | null;
|
|
114
|
+
has_nps?: boolean | undefined;
|
|
115
|
+
has_chat_in_appointment?: boolean | undefined;
|
|
116
|
+
has_discount_coupons_show?: boolean | undefined;
|
|
117
|
+
};
|
|
118
|
+
support_professional?: {
|
|
119
|
+
hash: string | null;
|
|
120
|
+
} | undefined;
|
|
121
|
+
}, {
|
|
122
|
+
legal_consent: {
|
|
123
|
+
terms_url: string | null;
|
|
124
|
+
privacy_url: string | null;
|
|
125
|
+
};
|
|
126
|
+
primary_color: string | null;
|
|
127
|
+
logo: string | null;
|
|
128
|
+
favicon: string | null;
|
|
129
|
+
home: {
|
|
130
|
+
description: string | null;
|
|
131
|
+
title: string | null;
|
|
132
|
+
image_url: string | null;
|
|
133
|
+
};
|
|
134
|
+
appointments: {
|
|
135
|
+
reserve_conditions: string | null;
|
|
136
|
+
seconds_before_start_to_refund_on_cancel: number | null;
|
|
137
|
+
has_nps?: boolean | undefined;
|
|
138
|
+
has_chat_in_appointment?: boolean | undefined;
|
|
139
|
+
has_discount_coupons_show?: boolean | undefined;
|
|
140
|
+
};
|
|
141
|
+
support_professional?: {
|
|
142
|
+
hash: string | null;
|
|
143
|
+
} | undefined;
|
|
144
|
+
}>;
|
|
145
|
+
type GetOrganizationSetupResponse = z.infer<typeof GetOrganizationSetupResponseSchema>;
|
|
146
|
+
|
|
147
|
+
declare class TopBanner extends LitElement {
|
|
148
|
+
static styles: lit.CSSResult;
|
|
149
|
+
loginToken: LoginTokenResponse;
|
|
150
|
+
orgSetup: GetOrganizationSetupResponse;
|
|
151
|
+
private _handleBook;
|
|
152
|
+
private _handleViewAppointments;
|
|
153
|
+
render(): lit_html.TemplateResult<1>;
|
|
154
|
+
}
|
|
155
|
+
declare global {
|
|
156
|
+
interface HTMLElementTagNameMap {
|
|
157
|
+
"top-banner": TopBanner;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
declare class HomeEmptyState extends LitElement {
|
|
162
|
+
static styles: lit.CSSResult;
|
|
163
|
+
title: string;
|
|
164
|
+
description: string;
|
|
165
|
+
icon: "document" | "doctor";
|
|
166
|
+
render(): lit_html.TemplateResult<1>;
|
|
167
|
+
}
|
|
168
|
+
declare global {
|
|
169
|
+
interface HTMLElementTagNameMap {
|
|
170
|
+
"home-empty-state": HomeEmptyState;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
declare class RecentDocuments extends LitElement {
|
|
175
|
+
static styles: lit.CSSResult;
|
|
176
|
+
loginToken: LoginTokenResponse;
|
|
177
|
+
private getPatientDocumentsQuery;
|
|
178
|
+
private getOrganizationSpecialtiesQuery;
|
|
179
|
+
private renderDocuments;
|
|
180
|
+
render(): lit_html.TemplateResult<1>;
|
|
181
|
+
}
|
|
182
|
+
declare global {
|
|
183
|
+
interface HTMLElementTagNameMap {
|
|
184
|
+
"recent-documents": RecentDocuments;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
declare class NextAppointments extends LitElement {
|
|
189
|
+
static styles: lit.CSSResult;
|
|
190
|
+
private getAppointmentsQuery;
|
|
191
|
+
private renderAppointment;
|
|
192
|
+
render(): lit_html.TemplateResult<1>;
|
|
193
|
+
}
|
|
194
|
+
declare global {
|
|
195
|
+
interface HTMLElementTagNameMap {
|
|
196
|
+
"next-appointments": NextAppointments;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
declare class MqDashboard extends LitElement {
|
|
201
|
+
static styles: lit.CSSResult;
|
|
202
|
+
/** Mediquo API key. */
|
|
203
|
+
apiKey?: string;
|
|
204
|
+
/** Already-exchanged access token. */
|
|
205
|
+
token?: string;
|
|
206
|
+
/** Locale (e.g. "es_ES"). Optional; defaults to the host/build locale. */
|
|
207
|
+
locale?: string;
|
|
208
|
+
/** Environment override ("development" | "production"). Optional. */
|
|
209
|
+
env?: Env;
|
|
210
|
+
showMediquoBranding: boolean;
|
|
211
|
+
loginToken?: LoginTokenResponse;
|
|
212
|
+
private _trackedPageView;
|
|
213
|
+
private orgSetupQuery;
|
|
214
|
+
protected willUpdate(changed: PropertyValues<this>): void;
|
|
215
|
+
protected updated(): void;
|
|
216
|
+
render(): lit_html.TemplateResult<1>;
|
|
217
|
+
}
|
|
218
|
+
declare global {
|
|
219
|
+
interface HTMLElementTagNameMap {
|
|
220
|
+
"mq-dashboard": MqDashboard;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
export { MqDashboard };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getLocale as t,isValidLocale as e,setLocale as i,initLocalization as o}from"./i18n.js";import{_ as n,t as r}from"./chunks/custom-element-DA9Fxvxd.js";import{c as a}from"./chunks/consume-CovVqBjI.js";import{l as s}from"./chunks/localized-decorator-BlOuLhym.js";import{m as l}from"./chunks/runtime-Bg1WXVCx.js";import{Q as c}from"./chunks/query-controller-BlO1Ax65.js";import{l as p}from"./chunks/chunk-S5RWG6G2-DPesx3Od.js";import{g as d}from"./chunks/get-organization-setup-query-BMbuRi6v.js";import{t as h,m,v as u,r as g,i as v}from"./chunks/telemetry-client-BLJVs9me.js";import{i as f,a as b,E as x,x as w}from"./chunks/lit-element-DiWJYFwC.js";import{n as k}from"./chunks/property-scuRaFcM.js";import{setEnv as y}from"./env.js";import{a as C,c as j,d as $}from"./chunks/api-chat-client-1Vz6ZOwp.js";import"./chunks/mq-layout-CGcdxGMQ.js";import"./ui/mq-skeleton.js";import{g as q}from"./chunks/chunk-YMQSBQHL-De_r7BNk.js";import{r as z}from"./chunks/state-LQivXIgA.js";import{S as V,a as _,b as S}from"./chunks/index-BJYWtEmT.js";import{messageSquareIcon as H}from"./ui/icons/message-square-icon.js";import"./ui/mq-avatar.js";import"./ui/mq-button.js";import{o as M}from"./chunks/style-map-CIdqdn7C.js";import{MqAppointmentBookEvent as A,MqViewAppointmentsEvent as B,MqViewDocumentsEvent as Q}from"./events.js";export{MqAppointmentJoinVideocallEvent,MqAppointmentRescheduleEvent,MqAppointmentViewDocumentationEvent}from"./events.js";import{g as T,a as E}from"./chunks/i18n-formats-DYS91YEa.js";import{g as Z}from"./chunks/get-patient-documents-query-DIQH-TMM.js";import"./chunks/index-Bx8TWBsk.js";import"./ui/mq-card.js";import{g as D}from"./chunks/appointment-card-skeleton-hglMW7x6.js";import"./chunks/chunk-4FFT6DC2-CVWibomC.js";import"./chunks/external-CJj32K_p.js";import"./chunks/context-consumer-ESdICVAb.js";import"./chunks/context-request-event-Dfydf1ub.js";import"./chunks/chunk-RCFIJTXZ-C6Ir0-sM.js";import"./chunks/create-context-DqP79qjF.js";import"./chunks/query-Cjvi4_dT.js";import"./chunks/parseISO-Dj3qSTG8.js";import"./chunks/format-CRFiCNHw.js";import"./chunks/isBefore-CPpTogxo.js";import"./chunks/directive-2EDmOukv.js";import"./ui/icons/types.js";import"./chunks/class-map-Co76I6aw.js";import"./ui/icons/download-icon.js";import"./chunks/refund-cancel-policy-BQDnePq9.js";import"./chunks/chunk-GZF3YFSX-DM-GTqxg.js";import"./chunks/price-DIhNpS8n.js";import"./ui/icons/briefcase-icon.js";import"./ui/icons/calendar-icon.js";import"./ui/icons/clock-icon.js";import"./ui/icons/message-bubble-icon.js";import"./ui/icons/phone-icon.js";import"./chunks/professional-overview-CfjgnTw4.js";import"./ui/icons/chevron-down-icon.js";import"./chunks/if-defined-BYeVdwgd.js";import"./ui/mq-text-button.js";import"./mq-chat-room.js";import"./chunks/provide-D2fnEhT2.js";import"./chunks/context-provider--AKuwfs9.js";import"./theme.js";import"./ui/icons/x-icon.js";import"./ui/icons/chevron-left-icon.js";import"./chunks/query-CeeutdfT.js";import"./ui/icons/check-double-icon.js";import"./ui/icons/check-icon.js";import"./chunks/chunk-YTQUGGS3-DmCGIoFy.js";import"./chunks/mutation-controller-CR2qcqhH.js";import"./ui/mq-floating-bubble.js";import"./ui/mq-dialog.js";import"./ui/icons/video-icon.js";import"./ui/mq-unread-badge.js";import"./ui/mq-toast.js";const I=f`*{box-sizing:border-box}:host{display:block;--color-text-icons--success:#34c759}@keyframes banner-reveal{from{grid-template-rows:0fr}to{grid-template-rows:1fr}}.reveal{display:grid;grid-template-rows:1fr;animation:banner-reveal .4s cubic-bezier(.22,1,.36,1)}@media (prefers-reduced-motion:reduce){.reveal{animation:none}}.clip{min-height:0;overflow:hidden}.banner{position:relative;display:flex;align-items:center;gap:var(--sp-3);width:100%;padding:var(--sp-2) var(--sp-3);background:linear-gradient(105.4deg,color-mix(in srgb,var(--color-primary) 35%,#000) 0,var(--color-primary-dark,color-mix(in srgb,var(--color-primary) 70%,#000)) 30%,var(--color-primary) 65%,color-mix(in srgb,var(--color-primary) 70%,#fff) 100%);font-family:var(--font-body)}.avatar{position:relative;flex-shrink:0;width:var(--size-10);height:var(--size-10);--avatar-size:var(--size-10)}.avatar mq-avatar{width:var(--size-10);height:var(--size-10)}.online-dot{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%) translate(calc(var(--avatar-size) * .35355),calc(var(--avatar-size) * -.35355));width:var(--size-2_5);height:var(--size-2_5);border-radius:var(--border-radius-full);background-color:var(--color-gray-medium);border:2px solid var(--color-white)}.online-dot[data-presence=online]{background-color:var(--color-text-icons--success)}.online-dot[data-presence=absent]{background-color:var(--color-negative)}.mobile-info{display:flex;flex-direction:column;gap:var(--sp-1);min-width:0;flex:1}.mobile-title{margin:0;font-size:var(--text-xs);font-weight:var(--font-weight-semibold);line-height:normal;color:var(--color-white);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mobile-title .mobile-role{color:#9b90ae}.mobile-welcome{margin:0;font-size:var(--text-xs);font-weight:var(--font-weight-normal);line-height:normal;color:var(--color-white);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cta-overlay{position:absolute;inset:0;width:100%;height:100%;margin:0;padding:0;border:none;background:0 0;cursor:pointer;font:inherit;color:inherit;z-index:1}.cta-overlay:focus-visible{outline:2px solid var(--color-white);outline-offset:-3px}.cta-mobile{flex-shrink:0;display:inline-grid;place-items:center;width:var(--size-7);height:var(--size-7);color:var(--color-white)}.identity{display:none;flex-direction:column;gap:var(--sp-0_5);flex-shrink:0;min-width:0;max-width:180px}.role{margin:0;font-size:var(--text-xxs);line-height:14px;font-weight:var(--font-weight-bold);letter-spacing:.5px;text-transform:uppercase;color:#9b90ae;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.name{margin:0;font-size:15px;line-height:21px;font-weight:var(--font-weight-bold);color:var(--color-white);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.divider{display:none;flex-shrink:0;width:1px;height:var(--size-8);background-color:#9b90ae}.welcome{display:none;flex:1;min-width:0;margin:0;font-size:var(--text-sm);line-height:19.5px;color:var(--color-white);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cta-desktop{display:none;flex-shrink:0}.icon-wrap{position:relative;display:inline-grid;place-items:center}.unread-dot{position:absolute;top:-1px;right:-1px;width:6px;height:6px;border-radius:var(--border-radius-full);background-color:var(--color-negative)}@media (min-width:768px){.banner{gap:var(--sp-5);padding:var(--sp-4) var(--sp-10)}.avatar,.avatar mq-avatar{width:var(--size-12);height:var(--size-12)}.avatar{--avatar-size:var(--size-12)}.cta-mobile,.cta-overlay,.mobile-info{display:none}.identity{display:flex}.divider{display:block}.welcome{display:block}.cta-desktop{display:inline-block}}`;let U=class SupportChatBanner extends b{constructor(){super(...arguments),this._unreadCount=0,this._professionalQuery=new c(this,()=>q(C,{hash:this.professionalHash??""},{enabled:Boolean(this.professionalHash)})),this._onUnreadChange=t=>{this._unreadCount=t.count??0}}static{this.styles=I}connectedCallback(){super.connectedCallback(),window.addEventListener(V.eventName,this._onUnreadChange),window.dispatchEvent(new _)}disconnectedCallback(){super.disconnectedCallback(),window.removeEventListener(V.eventName,this._onUnreadChange)}get _hasUnread(){return this._unreadCount>0}_toggleSupportChat(){window.dispatchEvent(new S)}_ctaIcon(t=16){return w`<span class="icon-wrap">${H({size:t,color:"currentColor"})} ${this._hasUnread?w`<span class="unread-dot"></span>`:x}</span>`}render(){return this.professionalHash?this._professionalQuery.render({pending:()=>w``,error:()=>w``,complete:t=>{const e=t.title??l("Asesor comercial"),i=j(t);return w`<div class="reveal"><div class="clip"><div class="banner"><button class="cta-overlay" type="button" aria-label="${l("Iniciar chat con asesor comercial")}" @click="${this._toggleSupportChat}"></button> <span class="avatar"><mq-avatar .src="${t.avatar??void 0}" .fallback="${t.name}" .alt="${t.name}"></mq-avatar><span class="online-dot" data-presence="${i}"></span> </span><span class="mobile-info"><p class="mobile-title">${t.title?w`<span class="mobile-role">${t.title}</span> - ${t.name}`:t.name}</p><p class="mobile-welcome">${l("¿Cómo puedo ayudarte?")}</p></span><span class="cta-mobile" aria-hidden="true">${this._ctaIcon(28)} </span><span class="identity"><p class="role">${e}</p><p class="name">${t.name}</p></span><span class="divider" aria-hidden="true"></span><p class="welcome">${l("¿Cómo puedo ayudarte?")}</p><mq-button class="cta-desktop" variant="outline-inverted" size="md" @click="${this._toggleSupportChat}">${l("Chatea conmigo")} ${this._ctaIcon()}</mq-button></div></div></div>`}}):x}};n([k({type:String,attribute:"professional-hash"})],U.prototype,"professionalHash",void 0),n([z()],U.prototype,"_unreadCount",void 0),U=n([s(),r("support-chat-banner")],U);const L=f`:host{padding:var(--size-6) var(--size-4);border-radius:var(--border-radius-md);background-color:var(--color-top-banner-background,transparent);display:block}.banner-inner{display:grid;grid-template-columns:1fr;gap:var(--sp-3);align-items:stretch}.banner-inner:not(.single-column) .top-banner-image{order:-1}.banner-inner.single-column{grid-template-columns:1fr}.top-banner-info{margin:0;text-align:left;display:flex;flex-direction:column;gap:var(--size-4)}.top-banner-info h3{font-family:var(--font-titles);font-size:var(--text-lg);line-height:var(--text-lg--line-height);font-weight:var(--font-weight-bold);color:var(--color-neutrals-text-default);margin:0;margin-bottom:var(--size-2)}.top-banner-info p{font-family:var(--font-body);font-size:var(--text-sm);line-height:var(--text-sm--line-height);font-weight:var(--font-weight-normal);color:var(--color-neutrals-text-default);margin:0}.top-banner-actions{display:flex;flex-direction:column;gap:var(--size-2)}.top-banner-image{background-size:cover;background-position:center;background-repeat:no-repeat;border-radius:8px;min-width:151px;min-height:11rem;position:relative}@media (min-width:768px){:host{padding:var(--sp-6)}.banner-inner{gap:var(--sp-8)}.banner-inner:not(.single-column){grid-template-columns:1fr 1fr}.banner-inner:not(.single-column) .top-banner-image{order:0}.top-banner-image{border-radius:4px;min-height:0}.top-banner-info h3{font-size:var(--text-xl);line-height:var(--text-xl--line-height)}.top-banner-info p{font-size:var(--text-base);line-height:var(--text-base--line-height)}}@media (min-width:1024px){.top-banner-info{width:100%;max-width:364px;margin-left:auto;margin-right:auto}.top-banner-info h3{font-size:var(--text-2xl);line-height:var(--text-2xl--line-height)}}`;let P=class TopBanner extends b{static{this.styles=L}_handleBook(){h.track(m(this.loginToken.patient.hash)),this.dispatchEvent(new A)}_handleViewAppointments(){h.track(u(this.loginToken.patient.hash)),this.dispatchEvent(new B({tab:"next"}))}render(){const t=this.orgSetup.home.title||l("Cita con un especialista en menos de 72 horas"),e=this.orgSetup.home.description||l("Traumatología, ginecología, endocrinología, digestivo o psiquiatría"),i=this.orgSetup.home.image_url;return w`<div class="banner-inner ${i?"":"single-column"}"><div class="top-banner-info"><div>${t?w`<h3>${t}</h3>`:x} ${e?w`<p>${e}</p>`:x}</div><div class="top-banner-actions"><mq-button variant="primary" fullwidth @click="${this._handleBook}">${l("Pedir cita")}</mq-button><mq-button variant="outline" fullwidth @click="${this._handleViewAppointments}">${l("Ver todas mis citas")}</mq-button></div></div>${i?w`<div class="top-banner-image" style="${M({background:`linear-gradient(180deg, rgba(0, 0, 0, 0) 68.17%, rgba(0, 0, 0, 0.2) 100%), url('${i}') lightgray 50% / cover no-repeat`})}"></div>`:x}</div>`}};n([a({context:p})],P.prototype,"loginToken",void 0),n([k({attribute:!1})],P.prototype,"orgSetup",void 0),P=n([s(),r("top-banner")],P);const F=f`:host{border-radius:var(--border-radius-md);box-sizing:border-box;width:100%;display:flex;flex-direction:column;gap:var(--sp-4);padding:var(--sp-6);background-color:var(--color-card);border:1px solid var(--color-border);box-shadow:var(--shadow-sm);margin:0 auto}svg{flex-shrink:0;width:25px;height:auto}.title{font-family:var(--font-titles);font-size:var(--text-lg);line-height:var(--text-base--line-height);font-weight:var(--font-weight-bold);color:var(--color-neutrals-text-default);margin:0}.description{font-family:var(--font-body);font-size:var(--text-xs);line-height:var(--text-xs--line-height);font-weight:var(--font-weight-normal);color:var(--color-neutrals-text-default);margin:0}.content{display:flex;flex-direction:column;gap:var(--sp-4)}@media (min-width:768px){:host{align-items:start;flex-direction:row;gap:var(--sp-6)}svg{width:32px;height:auto}.description{font-size:var(--text-base);line-height:var(--text-base--line-height)}}`;let G=class HomeEmptyState extends b{constructor(){super(...arguments),this.title="",this.description="",this.icon="document"}static{this.styles=F}render(){return w`${"document"===this.icon?function({color:t="currentColor"}){return w`<svg width="32" height="40" viewBox="0 0 32 40" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M24 18H8V16H24V18ZM24 23H8V25H24V23ZM24 30H8V32H24V30ZM32 39V10C32 9.86867 31.9742 9.73862 31.9239 9.61728C31.8737 9.49594 31.8001 9.38568 31.7072 9.2928L22.7064 0.2952C22.5672 0.15435 22.3889 0.0585355 22.1947 0.0201668C22.0004 -0.018202 21.7991 0.00264228 21.6168 0.08C21.4342 0.155546 21.278 0.283605 21.1682 0.447954C21.0584 0.612303 20.9999 0.805545 21 1.0032V10C20.9999 10.1314 21.0257 10.2614 21.0759 10.3828C21.1261 10.5042 21.1998 10.6145 21.2927 10.7073C21.3855 10.8002 21.4958 10.8739 21.6172 10.9241C21.7386 10.9743 21.8686 11.0001 22 11H30V38H2V2H19V0H1C0.734784 0 0.480429 0.105357 0.292893 0.292893C0.105357 0.48043 0 0.734784 0 1V39C-4.20445e-08 39.1314 0.0258922 39.2615 0.0761969 39.3829C0.126502 39.5042 0.200233 39.6145 0.293176 39.7074C0.386119 39.8003 0.496453 39.8739 0.617871 39.9241C0.739289 39.9743 0.869411 40.0001 1.0008 40H31.0008C31.2659 39.9998 31.52 39.8943 31.7074 39.7068C31.8948 39.5193 32 39.2651 32 39ZM23 3.416L28.5856 9.0016H23V3.416Z" fill="${t}"/></svg>`}({color:"var(--color-primary)"}):function({color:t="currentColor"}){return w`<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M20 20.9512C22.2362 20.9487 24.38 20.057 25.9612 18.4717C27.5424 16.8864 28.4319 14.7371 28.4344 12.4952V8.45605C28.4344 6.21336 27.5458 4.06254 25.964 2.47672C24.3823 0.890903 22.2369 0 20 0C17.7631 0 15.6177 0.890903 14.036 2.47672C12.4542 4.06254 11.5656 6.21336 11.5656 8.45605V12.4952C11.5681 14.7371 12.4576 16.8864 14.0388 18.4717C15.62 20.057 17.7638 20.9487 20 20.9512ZM13.5656 8.45605C13.5656 6.74516 14.2435 5.10434 15.4502 3.89456C16.6569 2.68478 18.2935 2.00513 20 2.00513C21.7065 2.00513 23.3431 2.68478 24.5498 3.89456C25.7565 5.10434 26.4344 6.74516 26.4344 8.45605V12.4952C26.4344 14.2061 25.7565 15.8469 24.5498 17.0567C23.3431 18.2665 21.7065 18.9461 20 18.9461C18.2935 18.9461 16.6569 18.2665 15.4502 17.0567C14.2435 15.8469 13.5656 14.2061 13.5656 12.4952V8.45605ZM36.24 24.1386C33.9712 21.9859 30.8304 20.5414 27.156 19.9607C26.9367 19.9252 26.7119 19.964 26.517 20.0709C26.3222 20.1778 26.1684 20.3467 26.08 20.551C25.1576 22.6748 22.86 24.9623 20 24.9623C17.14 24.9623 14.8392 22.6756 13.92 20.551C13.8316 20.3474 13.6783 20.179 13.4842 20.0721C13.29 19.9653 13.066 19.9261 12.8472 19.9607C9.1696 20.5414 6.0288 21.9859 3.76 24.1386C1.3 26.4718 0 29.53 0 32.982V40H2V32.982C2 30.0946 3.084 27.5401 5.1344 25.5951C6.484 24.3118 8.2088 23.3197 10.2112 22.6524V29.0231H9.2272C8.42757 29.024 7.66093 29.3428 7.0955 29.9097C6.53008 30.4765 6.21205 31.2452 6.2112 32.0468V36.7974C6.21162 37.2613 6.39556 37.7061 6.72266 38.0341C7.04976 38.3622 7.49331 38.5468 7.956 38.5475H8.996V36.5424H8.2072V32.0468C8.20762 31.7768 8.3148 31.518 8.50525 31.327C8.69569 31.1361 8.95387 31.0287 9.2232 31.0282H13.2C13.467 31.0287 13.7229 31.1352 13.9117 31.3245C14.1005 31.5137 14.2068 31.7703 14.2072 32.038V36.5424H13V38.5475H14.484C14.9418 38.5471 15.3808 38.3646 15.7046 38.0401C16.0284 37.7156 16.2106 37.2756 16.2112 36.8167V32.038C16.2104 31.2387 15.8933 30.4723 15.3295 29.9071C14.7657 29.3419 14.0013 29.024 13.204 29.0231H12.2112V22.1166C12.2848 22.1006 12.3576 22.0837 12.432 22.0693C13.1066 23.3192 14.0396 24.4103 15.1688 25.2695C16.64 26.3795 18.3096 26.9666 20 26.9666C21.6904 26.9666 23.36 26.3795 24.8312 25.2695C25.6704 24.6323 26.4026 23.8647 27 22.9957V32.9636C26.3723 33.2245 25.8562 33.6985 25.5421 34.3025C25.2279 34.9066 25.1358 35.6022 25.2817 36.2675C25.4277 36.9329 25.8025 37.5255 26.3405 37.9416C26.8784 38.3578 27.5453 38.5709 28.2242 38.5437C28.9032 38.5164 29.5509 38.2506 30.054 37.7927C30.5571 37.3348 30.8835 36.7141 30.976 36.0392C31.0685 35.3643 30.9212 34.6783 30.5599 34.1013C30.1987 33.5243 29.6465 33.0932 29 32.8834V22.4118C31.3392 23.0679 33.3416 24.149 34.8656 25.5951C36.916 27.5393 38 30.0946 38 32.982V40H40V32.982C40 29.53 38.7 26.4718 36.24 24.1386ZM28.1056 36.5424C27.9287 36.5424 27.7558 36.4898 27.6087 36.3912C27.4616 36.2927 27.347 36.1527 27.2793 35.9888C27.2116 35.825 27.1939 35.6447 27.2284 35.4707C27.2629 35.2968 27.3481 35.137 27.4732 35.0116C27.5982 34.8862 27.7576 34.8008 27.9311 34.7662C28.1046 34.7316 28.2844 34.7493 28.4479 34.8172C28.6113 34.8851 28.751 35 28.8493 35.1475C28.9475 35.2949 29 35.4683 29 35.6457C28.9998 35.8834 28.9055 36.1114 28.7378 36.2795C28.5701 36.4476 28.3427 36.5421 28.1056 36.5424Z" fill="${t}"/></svg>`}({color:"var(--color-primary)"})}<div class="content"><p class="title">${this.title}</p><p class="description">${this.description}</p></div>`}};n([k({type:String})],G.prototype,"title",void 0),n([k({type:String})],G.prototype,"description",void 0),n([k({type:String})],G.prototype,"icon",void 0),G=n([s(),r("home-empty-state")],G);const K=f`:host{display:block;max-width:var(--content-max-width);margin:0 auto}.title{font-family:var(--font-titles);font-size:var(--text-2xl);line-height:var(--text-2xl--line-height);font-weight:var(--font-weight-bold);color:var(--color-neutrals-text-default);margin:0;margin-bottom:var(--sp-4)}.container{padding:var(--sp-6) var(--sp-4)}.documents-list{border-radius:var(--border-radius-md);padding:var(--sp-3);background-color:var(--color-muted);display:flex;flex-direction:column;gap:var(--sp-3);margin-bottom:var(--sp-6)}hr{width:100%;border:none;border-top:1px solid #e5e5e5;margin:0}.button-container{max-width:332px;margin:0 auto}`;let N=class RecentDocuments extends b{constructor(){super(...arguments),this.getPatientDocumentsQuery=new c(this,()=>Z(C,{patient_hash:this.loginToken.patient.hash,page:1,per_page:2})),this.getOrganizationSpecialtiesQuery=new c(this,()=>T(C))}static{this.styles=K}renderDocuments(){return this.getPatientDocumentsQuery.render({complete:e=>{const i=t();return 0===e.data.length?w`<home-empty-state icon="document" title="${l("No tienes documentación")}" description="${l("Aquí se mostrarán tus recetas e informes médicos. Consulta a tu profesional de salud para recibir documentación.")}"></home-empty-state>`:w`<mq-card class="container" roundness="md"><div class="documents-list">${e.data.map((t,o)=>{const n=this.getOrganizationSpecialtiesQuery.result?.data?.find(e=>e.id===t.professional.speciality_id),r=E(n?.code??"",i,n?.name);return w`<patient-document filename="${t.name}" kind="${t.document_type}" specialty="${r}" description="${t.name}" date="${t.created_at}" downloadUrl="${t.url}"></patient-document>${o<e.data.length-1?w`<hr>`:x}`})}</div><div class="button-container"><mq-button variant="primary" size="md" fullwidth @click="${()=>{h.track(g(this.loginToken.patient.hash)),this.dispatchEvent(new Q)}}">${l("Ver toda la documentación")}</mq-button></div></mq-card>`},pending:()=>w`<mq-card class="container" roundness="md"><div class="documents-list"><mq-skeleton height="57px"></mq-skeleton><hr><mq-skeleton height="57px"></mq-skeleton></div></mq-card>`})}render(){return w`<h2 class="title">${l("Documentación más reciente")}</h2>${this.renderDocuments()}`}};n([a({context:p})],N.prototype,"loginToken",void 0),N=n([s(),r("recent-documents")],N);const R=[$.pending,$.accepted],J=f`:host{display:block}.title{font-family:var(--font-titles);font-size:var(--text-2xl);line-height:var(--text-2xl--line-height);font-weight:var(--font-weight-bold);color:var(--color-neutrals-text-default);margin:0;margin-bottom:var(--sp-4)}.container{background-color:var(--color-neutrals-background-weak);padding:var(--sp-6) var(--sp-4)}.appointment-card{margin-bottom:var(--sp-6)}`;let O=class NextAppointments extends b{constructor(){super(...arguments),this.getAppointmentsQuery=new c(this,()=>D(C,{status:R,order:{field:"starts_at",direction:"asc"},page:1,per_page:1}))}static{this.styles=J}renderAppointment(){return this.getAppointmentsQuery.render({complete:t=>{const e=t.data?.[0];return e?w`<div class="appointment-card"><appointment-card .appointmentResource="${e}" .specialtyId="${e.speciality?.id}" variant="next" detailsVariant="default"></appointment-card></div>`:w`<home-empty-state icon="doctor" title="${l("No tienes próximas citas")}" description="${l("Cuando agendes una cita, aparecerá aquí para que puedas consultarla, modificarla o cancelarla.")}"></home-empty-state>`},pending:()=>w`<div class="appointment-card"><appointment-card-skeleton></appointment-card-skeleton></div>`})}render(){return w`<h2 class="title">${l("Próxima cita")}</h2>${this.renderAppointment()}`}};O=n([s(),r("next-appointments")],O);const Y=f`:host{display:flex;flex-direction:column;height:100%}.support-banner{display:block;flex-shrink:0;margin-bottom:var(--sp-4)}mq-layout{flex:1 1 auto;min-height:0}.banner-area{margin-top:calc(-1 * var(--sp-4));margin-left:calc(-1 * var(--sp-4));margin-right:calc(-1 * var(--sp-4))}.content{display:flex;flex-direction:column;padding-top:var(--sp-6);gap:var(--sp-6)}next-appointments{width:100%}recent-documents{width:100%}@media (min-width:768px){.banner-area{margin:0 auto}.content{flex-direction:row}next-appointments{width:50%}recent-documents{width:50%}}`;let X=class MqDashboard extends b{constructor(){super(...arguments),this.showMediquoBranding=!0,this._trackedPageView=!1,this.orgSetupQuery=new c(this,()=>d(C))}static{this.styles=Y}willUpdate(t){t.has("env")&&this.env&&y(this.env),t.has("apiKey")&&this.apiKey&&C.setApiKey(this.apiKey),t.has("token")&&this.token&&C.setAuthToken(this.token),t.has("locale")&&this.locale&&e(this.locale)&&(i(this.locale),C.setLanguage(this.locale))}updated(){!this._trackedPageView&&this.loginToken?.patient.hash&&(this._trackedPageView=!0,h.track(v(this.loginToken.patient.hash)))}render(){return w`${this.orgSetupQuery.render({pending:()=>w``,complete:t=>t.support_professional?.hash?w`<support-chat-banner class="support-banner" professional-hash="${t.support_professional.hash}"></support-chat-banner>`:w``})}<mq-layout background="transparent" variant="wide" .showMediquoBranding="${this.showMediquoBranding}">${this.orgSetupQuery.render({pending:()=>w`<mq-skeleton class="banner-area" width="100%" height="296px" border-radius="none"></mq-skeleton>`,complete:t=>w`<top-banner class="banner-area" .orgSetup="${t}"></top-banner>`})}<div class="content"><next-appointments></next-appointments><recent-documents></recent-documents></div></mq-layout>`}};n([k({type:String,attribute:"api-key"})],X.prototype,"apiKey",void 0),n([k({type:String,attribute:"token"})],X.prototype,"token",void 0),n([k({type:String,attribute:"locale"})],X.prototype,"locale",void 0),n([k({type:String,attribute:"env"})],X.prototype,"env",void 0),n([k({type:Boolean,attribute:"show-mediquo-branding"})],X.prototype,"showMediquoBranding",void 0),n([a({context:p})],X.prototype,"loginToken",void 0),X=n([s(),r("mq-dashboard")],X),o();export{A as MqAppointmentBookEvent,X as MqDashboard,B as MqViewAppointmentsEvent,Q as MqViewDocumentsEvent};
|
package/dist/mq-documents.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isValidLocale as t,setLocale as e,getLocale as
|
|
1
|
+
import{isValidLocale as t,setLocale as e,getLocale as i,initLocalization as n}from"./i18n.js";import{_ as r,t as s}from"./chunks/custom-element-DA9Fxvxd.js";import{m as a,s as o}from"./chunks/runtime-Bg1WXVCx.js";import{l as c}from"./chunks/localized-decorator-BlOuLhym.js";import{Q as p}from"./chunks/query-controller-BlO1Ax65.js";import{g as l,a as u}from"./chunks/i18n-formats-DYS91YEa.js";import{g as d}from"./chunks/get-patient-documents-query-DIQH-TMM.js";import{g as m}from"./chunks/get-patient-profile-query-B0tUDJmT.js";import{i as h,a as g,x as k,E as v}from"./chunks/lit-element-DiWJYFwC.js";import{n as f}from"./chunks/property-scuRaFcM.js";import{r as y}from"./chunks/state-LQivXIgA.js";import{setEnv as j}from"./env.js";import{a as b}from"./chunks/api-chat-client-1Vz6ZOwp.js";import{chevronLeftIcon as x}from"./ui/icons/chevron-left-icon.js";import{chevronRightIcon as P}from"./ui/icons/chevron-right-icon.js";import"./chunks/index-Bx8TWBsk.js";import"./ui/mq-skeleton.js";import"./chunks/chunk-4FFT6DC2-CVWibomC.js";import"./chunks/external-CJj32K_p.js";import"./chunks/chunk-RCFIJTXZ-C6Ir0-sM.js";import"./chunks/create-context-DqP79qjF.js";import"./chunks/context-consumer-ESdICVAb.js";import"./chunks/context-request-event-Dfydf1ub.js";import"./chunks/query-Cjvi4_dT.js";import"./chunks/parseISO-Dj3qSTG8.js";import"./chunks/format-CRFiCNHw.js";import"./chunks/isBefore-CPpTogxo.js";import"./chunks/if-defined-BYeVdwgd.js";import"./ui/icons/types.js";import"./ui/icons/download-icon.js";import"./ui/mq-button.js";import"./chunks/class-map-Co76I6aw.js";import"./chunks/directive-2EDmOukv.js";import"./events.js";import"./chunks/style-map-CIdqdn7C.js";const $=h`:host{display:block}.container{background-color:var(--color-card);padding:var(--sp-5) var(--sp-4);border-radius:var(--border-radius-md)}.documents-list{border-radius:var(--border-radius-md);background-color:var(--color-muted);padding:var(--sp-3);display:flex;flex-direction:column;gap:var(--sp-4)}.empty{font-family:var(--font-body);font-size:var(--text-sm);color:var(--color-neutrals-text-default);text-align:center;padding:var(--sp-6) var(--sp-4);margin:0}hr{width:100%;border:none;border-top:1px solid var(--color-border);margin:0}.pagination{display:flex;align-items:center;justify-content:center;gap:var(--sp-2_5);margin-top:var(--sp-4)}.pagination-text{font-family:var(--font-body);font-size:var(--text-sm);font-weight:var(--font-weight-normal);color:var(--color-neutrals-text-default);line-height:normal}.pagination-button{background:0 0;border:none;cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:var(--color-neutrals-text-default)}.pagination-button:disabled{opacity:0;cursor:not-allowed}.pagination-button:not(:disabled):hover{opacity:.7}@media (min-width:768px){.documents-list{padding:var(--sp-6)}}`;let q=class MqDocuments extends g{constructor(){super(...arguments),this.currentPage=1,this.getPatientProfileQuery=new p(this,()=>m(b)),this.getPatientDocumentsQuery=new p(this,()=>({...d(b,{patient_hash:this._patientHash,page:this.currentPage,per_page:6}),enabled:!!this._patientHash})),this.getOrganizationSpecialtiesQuery=new p(this,()=>l(b))}static{this.styles=$}willUpdate(i){i.has("env")&&this.env&&j(this.env),i.has("apiKey")&&this.apiKey&&b.setApiKey(this.apiKey),i.has("token")&&this.token&&b.setAuthToken(this.token),i.has("locale")&&this.locale&&t(this.locale)&&(e(this.locale),b.setLanguage(this.locale))}get _patientHash(){return this.getPatientProfileQuery.result?.data?.hash??""}handlePreviousPage(){this.currentPage>1&&(this.currentPage-=1)}handleNextPage(){const t=this.getPatientDocumentsQuery.result?.data?.meta?.last_page??1;this.currentPage<t&&(this.currentPage+=1)}renderDocuments(){return this.getPatientDocumentsQuery.render({complete:t=>{const e=i();return 0===t.data.length?k`<p class="empty">${a("Aquí se mostrarán tus recetas e informes médicos.")}</p>`:k`<div class="documents-list">${t.data.map((i,n)=>k`<patient-document filename="${i.name}" kind="${i.document_type}" specialty="${(()=>{const t=this.getOrganizationSpecialtiesQuery.result?.data?.find(t=>t.id===i.professional.speciality_id);return u(t?.code??"",e,t?.name)})()}" description="${i.name}" date="${i.created_at}" downloadUrl="${i.url}"></patient-document>${n<t.data.length-1?k`<hr>`:v}`)}</div>${this.renderPagination(t.meta)}`},pending:()=>k`<div class="documents-list"><mq-skeleton height="57px"></mq-skeleton><hr><mq-skeleton height="57px"></mq-skeleton><hr><mq-skeleton height="57px"></mq-skeleton></div>`})}renderPagination(t){const e=t.current_page>1,i=t.current_page<t.last_page;return k`<div class="pagination"><button class="pagination-button" @click="${this.handlePreviousPage}" ?disabled="${!e}" aria-label="${a("Página anterior")}">${x({size:24})}</button> <span class="pagination-text">${a(o`${t.current_page} de ${t.last_page}`)} </span><button class="pagination-button" @click="${this.handleNextPage}" ?disabled="${!i}" aria-label="${a("Página siguiente")}">${P({size:24})}</button></div>`}render(){return k`<div class="container">${this.renderDocuments()}</div>`}};r([f({type:String,attribute:"api-key"})],q.prototype,"apiKey",void 0),r([f({type:String,attribute:"token"})],q.prototype,"token",void 0),r([f({type:String,attribute:"locale"})],q.prototype,"locale",void 0),r([f({type:String,attribute:"env"})],q.prototype,"env",void 0),r([y()],q.prototype,"currentPage",void 0),q=r([c(),s("mq-documents")],q),n();export{q as MqDocuments};
|