@mediquo/elements 0.9.4 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/api-chat-client-BhxUWldC.js +1 -0
- package/dist/chunks/{apple-pay-outcomes-DyL3HLPm.js → apple-pay-outcomes-BU_PyQdT.js} +1 -1
- package/dist/chunks/ca_ES-DMretbb7.js +1 -0
- package/dist/chunks/de_DE-DUtzXD1z.js +1 -0
- package/dist/chunks/documentation-view-CEfoq9vD.js +1 -0
- package/dist/chunks/en_US-mxYf5Jqv.js +1 -0
- package/dist/chunks/{index-Dbbpnw8f.d.ts → index-Bv4Mk1Ch.d.ts} +1 -1
- package/dist/chunks/{index-CsoFYpTo.js → index-CYBd3XL2.js} +1 -1
- package/dist/chunks/{index-CFlNQLy2.d.ts → index-Cgni0Is9.d.ts} +1 -1
- package/dist/chunks/{index-DdkeWQrh.d.ts → index-D0njwg5o.d.ts} +1 -1
- package/dist/chunks/{index-DG95qEn3.js → index-DjD-3x4f.js} +1 -1
- package/dist/chunks/{index.d-XSe7Hy-Q.d.ts → index.d-DeJP_xib.d.ts} +13 -22
- package/dist/chunks/{mq-chat-room-jeDvIF1Z.d.ts → mq-chat-room-B3ant6md.d.ts} +1 -1
- package/dist/chunks/{mq-next-appointments-BIOkXfI7.js → mq-next-appointments-BdsRyXJB.js} +1 -1
- package/dist/chunks/{mq-recent-documents-DVhwoeLA.js → mq-recent-documents-CNweIX5U.js} +1 -1
- package/dist/chunks/{next-appointment-card-DBXsY3Sp.d.ts → next-appointment-card-CWz0tef1.d.ts} +2 -2
- package/dist/chunks/{next-appointment-card-DxNzffoM.js → next-appointment-card-KXLkEJDg.js} +1 -1
- package/dist/chunks/pt_PT-g8meEZVV.js +1 -0
- package/dist/env.js +1 -1
- package/dist/events.d.ts +3 -44
- package/dist/i18n.js +1 -1
- package/dist/mq-api-client-provider.d.ts +1 -1
- package/dist/mq-api-client-provider.js +1 -1
- package/dist/mq-apple-pay-checkout.d.ts +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.d.ts +4 -3
- package/dist/mq-appointment-documentation.js +1 -1
- package/dist/mq-chat-room.d.ts +2 -2
- package/dist/mq-chat-room.js +1 -1
- package/dist/mq-checkout.d.ts +1 -1
- package/dist/mq-checkout.js +1 -1
- package/dist/mq-dashboard.d.ts +5 -5
- package/dist/mq-dashboard.js +1 -1
- package/dist/mq-documents.d.ts +2 -2
- package/dist/mq-documents.js +1 -1
- package/dist/mq-google-pay-checkout.d.ts +1 -1
- package/dist/mq-google-pay-checkout.js +1 -1
- package/dist/mq-immediate-videocall-checkout.d.ts +1 -1
- package/dist/mq-immediate-videocall-checkout.js +1 -1
- package/dist/mq-my-appointments.d.ts +3 -3
- package/dist/mq-my-appointments.js +1 -1
- package/dist/mq-next-appointments.d.ts +3 -3
- package/dist/mq-next-appointments.js +1 -1
- package/dist/mq-payment-poller.d.ts +15 -23
- package/dist/mq-payment-poller.js +1 -1
- package/dist/mq-recent-documents.d.ts +2 -2
- package/dist/mq-recent-documents.js +1 -1
- package/dist/mq-schedule-success.d.ts +2 -2
- package/dist/mq-schedule-success.js +1 -1
- package/dist/mq-schedule.d.ts +2 -3
- package/dist/mq-schedule.js +1 -1
- package/dist/mq-support-chat.d.ts +3 -3
- package/dist/mq-support-chat.js +1 -1
- package/dist/mq-terms-and-conditions.d.ts +2 -2
- package/dist/mq-terms-and-conditions.js +1 -1
- package/dist/mq-videocall.d.ts +3 -3
- package/dist/mq-videocall.js +1 -1
- package/dist/react/mq-api-client-provider.d.ts +1 -1
- package/dist/react/mq-api-client-provider.js +1 -1
- package/dist/react/mq-apple-pay-checkout.d.ts +1 -1
- package/dist/react/mq-apple-pay-checkout.js +1 -1
- package/dist/react/mq-appointment-checkout.d.ts +1 -1
- package/dist/react/mq-appointment-checkout.js +1 -1
- package/dist/react/mq-appointment-documentation.d.ts +4 -3
- package/dist/react/mq-appointment-documentation.js +1 -1
- package/dist/react/mq-chat-room.d.ts +2 -2
- package/dist/react/mq-chat-room.js +1 -1
- package/dist/react/mq-checkout.d.ts +1 -1
- package/dist/react/mq-checkout.js +1 -1
- package/dist/react/mq-dashboard.d.ts +4 -4
- package/dist/react/mq-dashboard.js +1 -1
- package/dist/react/mq-documents-page.d.ts +2 -2
- package/dist/react/mq-documents-page.js +1 -1
- package/dist/react/mq-documents.d.ts +2 -2
- package/dist/react/mq-documents.js +1 -1
- package/dist/react/mq-google-pay-checkout.d.ts +1 -1
- package/dist/react/mq-google-pay-checkout.js +1 -1
- package/dist/react/mq-immediate-videocall-checkout.d.ts +1 -1
- package/dist/react/mq-immediate-videocall-checkout.js +1 -1
- package/dist/react/mq-my-appointments.d.ts +3 -3
- package/dist/react/mq-my-appointments.js +1 -1
- package/dist/react/mq-next-appointments.d.ts +3 -3
- package/dist/react/mq-next-appointments.js +1 -1
- package/dist/react/mq-payment-poller.d.ts +6 -13
- package/dist/react/mq-payment-poller.js +1 -1
- package/dist/react/mq-recent-documents.d.ts +2 -2
- package/dist/react/mq-recent-documents.js +1 -1
- package/dist/react/mq-schedule-success.d.ts +2 -2
- package/dist/react/mq-schedule-success.js +1 -1
- package/dist/react/mq-schedule.d.ts +1 -1
- package/dist/react/mq-schedule.js +1 -1
- package/dist/react/mq-support-chat.d.ts +2 -2
- package/dist/react/mq-support-chat.js +1 -1
- package/dist/react/mq-terms-and-conditions.d.ts +2 -2
- package/dist/react/mq-terms-and-conditions.js +1 -1
- package/dist/react/mq-videocall.d.ts +3 -3
- package/dist/react/mq-videocall.js +1 -1
- package/package.json +1 -1
- package/dist/chunks/api-chat-client-5LVJAeLW.js +0 -1
- package/dist/chunks/ca_ES-OHfUU0MP.js +0 -1
- package/dist/chunks/de_DE-BTPGM932.js +0 -1
- package/dist/chunks/documentation-view-Dly6o3Fz.js +0 -1
- package/dist/chunks/en_US-C2zY9QiH.js +0 -1
- package/dist/chunks/pt_PT-DUs_Ox73.js +0 -1
package/dist/mq-chat-room.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e,c as t}from"./chunks/custom-element-D2ziPxYE.js";import{e as s}from"./chunks/provide-BwI4DDGF.js";import{c as i}from"./chunks/consume-CovVqBjI.js";import{l as o}from"./chunks/localized-decorator-BlOuLhym.js";import{m as a,s as r}from"./chunks/runtime-Bg1WXVCx.js";import{A as n}from"./chunks/api-client-context-V1UAGtKW.js";import{i as l,a as d,x as c,E as h}from"./chunks/lit-element-DiWJYFwC.js";import{n as m}from"./chunks/property-scuRaFcM.js";import{r as p}from"./chunks/state-LQivXIgA.js";import{n as g}from"./chunks/create-context-DqP79qjF.js";import{tokens as u}from"./theme.js";import{xIcon as v}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 y}from"./chunks/chunk-BUV4MGML-CkhBbfUu.js";import{o as f}from"./chunks/if-defined-BYeVdwgd.js";import{chevronLeftIcon as w}from"./ui/icons/chevron-left-icon.js";import{e as k}from"./chunks/query-CeeutdfT.js";import{l as x}from"./chunks/chunk-4FFT6DC2-CVWibomC.js";import{DownloadFileEvent as C}from"./events.js";import{M as $,c as I,n as z}from"./chunks/api-chat-client-5LVJAeLW.js";import{S as T,g as D}from"./chunks/chunk-Y4EKUX25-QqMl3eiq.js";import{checkDoubleIcon as M}from"./ui/icons/check-double-icon.js";import{checkIcon as j}from"./ui/icons/check-icon.js";import{getLocale as q}from"./i18n.js";import{S,a as P}from"./chunks/chunk-YTQUGGS3-DmCGIoFy.js";import{s as A}from"./chunks/context-consumer-ESdICVAb.js";import{s as _}from"./chunks/chunk-6CCJWPGL-TiaqZaPV.js";import{Q as E}from"./chunks/chunk-RCFIJTXZ-C6Ir0-sM.js";import{e as R}from"./chunks/class-map-Co76I6aw.js";import{M as U}from"./chunks/mutation-controller-CR2qcqhH.js";import"./chunks/context-request-event-Dfydf1ub.js";import"./ui/icons/types.js";import"./chunks/directive-2EDmOukv.js";import"./chunks/style-map-CIdqdn7C.js";import"./chunks/query-Cjvi4_dT.js";import"./chunks/chunk-2TKJJNS7-BGwxtEg7.js";import"./chunks/parseISO-Dj3qSTG8.js";import"./chunks/format-CRFiCNHw.js";import"./chunks/external-CJj32K_p.js";import"./chunks/isBefore-CPpTogxo.js";import"./env.js";const B=g("apiKey"),N=g("token"),H=g("professionalHash"),L=g("roomId"),K=g("consultationId"),F=g("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 O=l`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 Q=class ChatRoomHeader extends d{constructor(){super(...arguments),this.hideCloseButton=!1,this.getProfessionalQuery=new b(this,()=>y(this.apiClient,{hash:this.professionalHash}))}static{this.styles=O}handleClose(){this.dispatchEvent(new MqChatRoomCloseEvent)}handleClickProfile(){this.dispatchEvent(new MqChatRoomProfileEvent)}renderProfile(){return c`<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}))}}">${w({size:24})}</mq-button><p class="profile-title">${a("Perfil de profesional")}</p></div>`}renderChat(){return c`${this.getProfessionalQuery.render({complete:e=>c`<button type="button" class="left-side ghost-btn" @click="${this.handleClickProfile}"><mq-avatar src="${f(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:()=>c`<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 c`<header>${"profile"===this.view?this.renderProfile():this.renderChat()}<div class="right-side">${this.hideCloseButton?h:c`<mq-button type="button" size="icon-md" variant="ghost-inverted" @click="${this.handleClose}">${v({size:24})}</mq-button>`}</div></header>`}};e([i({context:n,subscribe:!0})],Q.prototype,"apiClient",void 0),e([m({type:String})],Q.prototype,"professionalHash",void 0),e([m({type:Boolean})],Q.prototype,"hideCloseButton",void 0),e([m({type:String})],Q.prototype,"view",void 0),Q=e([o(),t("chat-room-header")],Q);const V=/(https?:\/\/[^\s,;:!)\]}\]]+|www\.[^\s,;:!)\]}\]]+|[a-zA-Z0-9][-a-zA-Z0-9]*(?:\.[a-zA-Z0-9][-a-zA-Z0-9]*)+(?:\/[^\s,;:!)\]}\]]*|(?:\?|#|&)[^\s,;:!)\]}\]]*)?)/gi;function J(e){return e.split(V).map((e,t)=>{if(t%2==1){const t=e.startsWith("http")?e:`https://${e}`;return c`<a href="${t}" target="_blank" rel="noopener noreferrer" class="message-link">${e}</a>`}return e})}let Y=class TextMessageBubble extends d{static{this.styles=[l`: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 c`<div class="message-content">${J(e)}</div>`;const s=t.map(e=>c`<div class="message-paragraph">${J(e.trim())}</div>`);return c`<div class="message-content">${s}</div>`}render(){return c`<div class="message-bubble ${this.kind}">${this.formatMessageContent(this.message.string)}</div>`}};e([m({type:Object})],Y.prototype,"message",void 0),e([m({type:String})],Y.prototype,"kind",void 0),Y=e([t("text-message-bubble")],Y);const Z=l`: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 G=class ImageMessageBubble extends d{constructor(){super(...arguments),this.showPreview=!1,this.isPreviewRendered=!1,this.isPreviewActive=!1,this.closeTimer=null}static{this.styles=Z}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 c`<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?c`<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">${v({size:24})}</button> <img class="preview-image" src="${e}" alt="Shared attachment preview" @click="${e=>e.stopPropagation()}" @keydown="${this.handlePreviewImageKeyDown}" tabindex="0"></div>`:""}`}};e([m({type:Object})],G.prototype,"message",void 0),e([m({type:String})],G.prototype,"kind",void 0),e([i({context:N})],G.prototype,"token",void 0),e([p()],G.prototype,"showPreview",void 0),e([p()],G.prototype,"isPreviewRendered",void 0),e([p()],G.prototype,"isPreviewActive",void 0),G=e([t("image-message-bubble")],G);const W=l`: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 X=class SystemMessageBubble extends d{static{this.styles=W}render(){return c`<div class="system-message-bubble">${J(this.message.string)}</div>`}};e([m({type:Object})],X.prototype,"message",void 0),X=e([t("system-message-bubble")],X);const ee=l`: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 te=class FileMessageBubble extends d{constructor(){super(...arguments),this.isDownloading=!1}static{this.styles=ee}formatMessageContent(e){const t=e.split("\n\n").filter(e=>e.trim());if(t.length<=1)return c`<div class="message-content">${e}</div>`;const s=t.map(e=>c`<div class="message-paragraph">${e.trim()}</div>`);return c`<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(),i=new FileReader;i.onloadend=()=>{const e=i.result,t=new C({url:e,filename:this.message.attachment.file_name});this.dispatchEvent(t),this.isDownloading=!1},i.onerror=()=>{x.error("Error reading file as data URL"),this.isDownloading=!1},i.readAsDataURL(s)}catch(e){x.error("Error downloading file:",e),this.isDownloading=!1}}render(){return c`<button type="button" @click="${this.handleDownload}" class="message-bubble ${this.kind}" ?disabled="${this.isDownloading}">${this.formatMessageContent(this.message.attachment.file_name)}</button>`}};e([m({type:Object})],te.prototype,"message",void 0),e([m({type:String})],te.prototype,"kind",void 0),e([i({context:N})],te.prototype,"token",void 0),e([p()],te.prototype,"isDownloading",void 0),te=e([t("file-message-bubble")],te);let se=class MessageBubble extends d{constructor(){super(...arguments),this.showTimestamp=!0}static{this.styles=[l`: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 $.Sent:return j({size:12,color:"currentColor"});case $.Received:return M({size:12,color:"currentColor"});case $.Read:return M({size:12,color:"currentColor",className:"read"});default:return null}}renderBubbleContent(){switch(this.message.type){case"image":return c`<image-message-bubble .message="${this.message}" .kind="${this.kind}"></image-message-bubble>`;case"file":return c`<file-message-bubble .message="${this.message}" .kind="${this.kind}"></file-message-bubble>`;default:return c`<text-message-bubble .message="${this.message}" .kind="${this.kind}"></text-message-bubble>`}}render(){if(this.message.senderType===T.system)return c`<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 c`${this.renderBubbleContent()} ${this.showTimestamp&&e?c`<div class="timestamp ${this.kind}">${this.formatTimestamp(e.toISOString())} ${"sent"===this.kind?c`<span class="status-icon ${this.message.status===$.Read?"read":""}">${this.renderStatusIcon()}</span>`:""}</div>`:""}`}};e([m({type:String})],se.prototype,"kind",void 0),e([m({type:Object})],se.prototype,"message",void 0),e([m({type:Boolean})],se.prototype,"showTimestamp",void 0),se=e([t("message-bubble")],se);let ie=class DateBanner extends d{constructor(){super(...arguments),this.date=""}static{this.styles=[u,l`: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=q().replace("_","-"),s=new Date(e),i=new Date,o=new Date(i);o.setDate(o.getDate()-1);const r=new Date(s.getFullYear(),s.getMonth(),s.getDate()),n=new Date(i.getFullYear(),i.getMonth(),i.getDate()),l=new Date(o.getFullYear(),o.getMonth(),o.getDate());return r.getTime()===n.getTime()?a("Hoy"):r.getTime()===l.getTime()?a("Ayer"):s.toLocaleDateString(t,{dateStyle:"medium"})}render(){return c`<div class="date-banner"><span class="date-text">${this.formatDate(this.date)}</span></div>`}};function oe(e){return e.createdAt?new Date(e.createdAt):e.time?new Date(e.time):new Date}e([m({type:String})],ie.prototype,"date",void 0),ie=e([o(),t("date-banner")],ie);let ae=class MessagesList extends d{constructor(){super(...arguments),this.messages=[]}static{this.styles=[u,l`: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===T.system)return!1;if(!t)return!0;if(t.senderType!==e.senderType)return!0;if(t.senderType===T.ordinary&&e.senderType===T.ordinary&&t.fromUserHash!==e.fromUserHash)return!0;return(oe(t).getTime()-oe(e).getTime())/6e4>1}groupMessagesByDate(e){const t=[];let s=null;return e.forEach((i,o)=>{const a=oe(i),r=a?.toDateString();r!==s&&(t.push({type:"date",data:a.toDateString()}),s=r??null);const n=e[o+1],l=this.shouldShowMessageTimestamp(i,n);t.push({type:"message",data:i,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 c`<date-banner .date="${t.data}"></date-banner>`;const i=this.professionalHash!==t.data.fromUserHash,o=t.data.senderType===T.system?"system":i?"sent":"received";return c`<div class="message-wrapper ${o}"><message-bubble .message="${t.data}" .kind="${o}" .showTimestamp="${t.showTimestamp||"date"===e[s+1]?.type}"></message-bubble></div>`});return c`<div class="messages-container">${t}<div class="messages-container-end"></div></div>`}};e([m({type:Array})],ae.prototype,"messages",void 0),e([m({type:String})],ae.prototype,"professionalHash",void 0),e([k(".messages-container-end")],ae.prototype,"messagesContainerEnd",void 0),ae=e([t("messages-list")],ae);let re=class MessageBubbleSkeleton extends d{constructor(){super(...arguments),this.variant="patient",this.height="md",this.showTimestamp=!0}static{this.styles=[l`: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 c`<div class="message-bubble ${this.variant}"></div>${this.showTimestamp?c`<div class="timestamp-skeleton ${this.variant}"></div>`:""}`}};e([m({type:String})],re.prototype,"variant",void 0),e([m({type:String})],re.prototype,"height",void 0),e([m({type:Boolean})],re.prototype,"showTimestamp",void 0),re=e([t("message-bubble-skeleton")],re);let ne=class MessagesSkeleton extends d{constructor(){super(...arguments),this.messageCount=6}static{this.styles=[u,l`: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),i=this.getSkeletonHeight(t);return c`<div class="message-wrapper ${s}"><message-bubble-skeleton variant="${s}" height="${i}" ?showTimestamp="${t===this.messageCount-1||Math.random()>.7}"></message-bubble-skeleton></div>`})}render(){return c`<div class="messages-container">${this.renderSkeletonMessages()}</div>`}};e([m({type:Number})],ne.prototype,"messageCount",void 0),ne=e([t("messages-skeleton")],ne);var le=class{constructor(e,t){this.host=e,this.listeners=[],this.host.addController(this),this.socketContext=new A(this.host,{context:S,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 de(e,t){return{queryKey:_(e,"rooms",t.roomId),queryFn:()=>e.rooms.getRoomMessages(t),staleTime:0}}class OptimisticUpdatesController{constructor(e){this.host=e,this.apiClientContext=new A(this.host,{context:n,subscribe:!0,callback:e=>{this.apiClient=e}}),this.queryClientContext=new A(this.host,{context:E,subscribe:!0,callback:e=>{e&&(this.queryClient=e)}}),this.host.addController(this)}hostConnected(){}appendMessageToRoom(e,t){if(!this.apiClient)return;const s=de(this.apiClient,{roomId:t}).queryKey;this.queryClient?.setQueriesData({queryKey:s,exact:!0},t=>[...t??[],e])}deleteMessage(e,t){if(!this.queryClient||!this.apiClient)return;const s=de(this.apiClient,{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||!this.apiClient)return;const i=de(this.apiClient,{roomId:s}).queryKey;this.queryClient.setQueryData(i,s=>(s??[]).map(s=>s.messageId===e?{...s,status:t}:s))}}let ce=class ChatRoomMessages extends d{constructor(){super(...arguments),this.getRoomMessagesQuery=new b(this,()=>de(this.apiClient,{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(P.messageStatus,e.messageId,this.roomId,$.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 le(this,{listeners:[{eventName:P.message,callback:this.onMessageReceived},{eventName:P.message_deleted,callback:this.onMessageDeleted},{eventName:P.messageStatus,callback:this.onMessageStatusUpdated}]})}static{this.styles=[u,l`:host{display:block;width:100%;height:100%}`]}render(){return this.getRoomMessagesQuery.render({pending:()=>c`<messages-skeleton messageCount="8"></messages-skeleton>`,complete:e=>c`<messages-list .messages="${e}" .professionalHash="${this.professionalHash}"></messages-list>`})}};e([i({context:n,subscribe:!0})],ce.prototype,"apiClient",void 0),e([m({type:Number})],ce.prototype,"roomId",void 0),e([m({type:String})],ce.prototype,"professionalHash",void 0),ce=e([t("chat-room-messages")],ce);var he=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[P.message,this.string,this.roomId,this.messageId,this.type,this.fileName,this.autoMessage,this.senderType,this.attachmentType,this.consultationId,this.consultationType]}},me=class extends he{constructor(e){super({roomId:e.roomId,messageId:e.messageId,string:e.string,type:"string",fileName:null,autoMessage:!1,senderType:T.ordinary,attachmentType:"uncategorized",consultationId:e.consultationId,consultationType:e.consultationType})}},pe=class extends he{constructor(e){super({roomId:e.roomId,messageId:e.messageId,string:e.base64Attachment,fileName:e.fileName,type:e.type,autoMessage:!1,senderType:T.ordinary,attachmentType:"uncategorized",consultationId:e.consultationId,consultationType:e.consultationType})}};async function ge(e){return await Promise.all(e.map(async e=>{const t=await function(e){return new Promise((t,s)=>{const i=new FileReader;i.onload=()=>{const o=i.result.split(",")[1];o?t(o):s(new Error(`Invalid data URL format for file: ${e.name}`))},i.onerror=()=>{s(new Error(`Failed to read file: ${e.name}`))},i.readAsDataURL(e)})}(e);return{name:e.name,size:e.size,type:e.type,base64:t}}))}const ue=l`: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 ve=class ChatRoomFooter extends d{constructor(){super(...arguments),this.isTyping=!1,this.typingTimeoutId=null,this.inputValue="",this.socketController=new le(this)}static{this.styles=[ue]}handleInputChange(e){const t=e.target;this.inputValue=t.value,this.isTyping||(this.socketController.socket?.emit(P.typing,this.roomId),this.isTyping=!0),this.typingTimeoutId&&clearTimeout(this.typingTimeoutId),this.typingTimeoutId=setTimeout(()=>{this.isTyping&&(this.socketController.socket?.emit(P.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 ge([s]))[0];if(!e)return void x.error("Error converting file to base64");const t=e?.type.includes("image")?"image":"file",i=crypto.randomUUID(),o=s.name,a=new pe({type:t,base64Attachment:e.base64,fileName:o,roomId:this.roomId,messageId:i,consultationId:this.consultationId,consultationType:this.consultationType});this.socketController.socket?.emit(...a.toSocketMessage())}catch(e){x.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(P.stop_typing,this.roomId),this.isTyping=!1,this.typingTimeoutId&&clearTimeout(this.typingTimeoutId));const s=new me({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(P.stop_typing,this.roomId),this.typingTimeoutId&&clearTimeout(this.typingTimeoutId))}render(){const e=this.inputValue.trim().length>0;return c`<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")}">${c`<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")}">${c`<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([i({context:K})],ve.prototype,"consultationId",void 0),e([i({context:F})],ve.prototype,"consultationType",void 0),e([m({type:Number})],ve.prototype,"roomId",void 0),e([p()],ve.prototype,"inputValue",void 0),e([k(".attachment-input")],ve.prototype,"attachmentInput",void 0),ve=e([t("chat-room-footer")],ve);const be=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 ye(e,t){const s=be(6===e?0:e+1);return t.some(e=>{const t=e.days_of_week;return!0===s[t]})}let fe=class AvailabilitySection extends d{constructor(){super(...arguments),this.gaps=[],this.selectedDay=function(){const e=(new Date).getDay();return 0===e?6:e-1}()}static{this.styles=l`: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||ye(this.selectedDay,this.gaps)||(this.selectedDay=void 0))}render(){const e=[{shortLabel:a("Lu"),label:a("Lunes"),key:"monday",disabled:!ye(0,this.gaps)},{shortLabel:a("Ma"),label:a("Martes"),key:"tuesday",disabled:!ye(1,this.gaps)},{shortLabel:a("Mi"),label:a("Miércoles"),key:"wednesday",disabled:!ye(2,this.gaps)},{shortLabel:a("Ju"),label:a("Jueves"),key:"thursday",disabled:!ye(3,this.gaps)},{shortLabel:a("Vi"),label:a("Viernes"),key:"friday",disabled:!ye(4,this.gaps)},{shortLabel:a("Sa"),label:a("Sábado"),key:"saturday",disabled:!ye(5,this.gaps)},{shortLabel:a("Do"),label:a("Domingo"),key:"sunday",disabled:!ye(6,this.gaps)}];return c`<h2 class="availability-header">${a("Disponibilidad")}</h2><div class="availability-days">${e.map((e,t)=>c`<button type="button" class="availability-button ${R({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=be(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 c`<div class="availability-time"><p class="time-title">${e[this.selectedDay]?.label}</p><div class="time-entries">${t.length>0?t.map(e=>c`<p class="time-entry">${a("De")} ${e.from_time} ${a("a")} ${e.to_time}</p>`):c`<p class="time-entry">${a("No hay horarios disponibles")}</p>`}</div></div>`})()}`}};e([m({type:Array})],fe.prototype,"gaps",void 0),e([p()],fe.prototype,"selectedDay",void 0),fe=e([o(),t("availability-section")],fe);const we=l`: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 ke=class ChatRoomProfile extends d{constructor(){super(...arguments),this.getProfessionalQuery=new b(this,()=>y(this.apiClient,{hash:this.professionalHash}))}static{this.styles=[u,we]}renderProfile(e){return c`<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?c`<p class="profile-specialty">${e.title}</p>`:""} ${e.collegiate_number?c`<p class="profile-collegiate">${a(r`Nº COL. ${e.collegiate_number}`)}</p>`:""}</div></div>${e.chat_schedule&&e.chat_schedule.gaps.length>0?c`<availability-section .gaps="${e.chat_schedule.gaps}"></availability-section>`:h} ${e.description||e.overview?c`<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:()=>c``,complete:e=>this.renderProfile(e)})}};e([i({context:n,subscribe:!0})],ke.prototype,"apiClient",void 0),e([m({type:String})],ke.prototype,"professionalHash",void 0),ke=e([o(),t("chat-room-profile")],ke);const xe=l`.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 Ce=class MqChatRoom extends d{constructor(){super(...arguments),this.consultationId=void 0,this.consultationType=void 0,this.readonly=!1,this.hideCloseButton=!1,this.view="chat",this.socketController=new le(this),this.readAllMessagesMutation=new U(this,{mutationFn:()=>this.apiClient.professionals.readAllMessages({roomId:this.roomId}),onSuccess:()=>{this.queryClientContext?.invalidateQueries({queryKey:D(this.apiClient,{roomId:this.roomId}).queryKey})}}),this.apiClient=I()}static{this.styles=[u,xe]}willUpdate(e){const t=z(e,{apiKey:this.apiKey,token:this.token},this.inheritedApiClient);t&&(this.apiClient=t),e.has("roomId")&&(this.socketController.socket?.emit(P.joinRoom,this.roomId),this.readAllMessagesMutation.run(void 0))}render(){return c`<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?c`<chat-room-messages .roomId="${this.roomId}" .professionalHash="${this.professionalHash}"></chat-room-messages>${this.readonly?h:c`<chat-room-footer .roomId="${this.roomId}"></chat-room-footer>`}`:c`<chat-room-profile .professionalHash="${this.professionalHash}" @mq-chat-room-chat="${()=>{this.view="chat"}}"></chat-room-profile>`}</div>`}};e([s({context:B}),m({type:String,attribute:"api-key"})],Ce.prototype,"apiKey",void 0),e([s({context:N}),m({type:String,attribute:"token"})],Ce.prototype,"token",void 0),e([s({context:H}),m({type:String,attribute:"professional-hash"})],Ce.prototype,"professionalHash",void 0),e([s({context:L}),m({type:Number,attribute:"room-id"})],Ce.prototype,"roomId",void 0),e([s({context:K}),m({type:String,attribute:"consultation-id"})],Ce.prototype,"consultationId",void 0),e([s({context:F}),m({type:String,attribute:"consultation-type"})],Ce.prototype,"consultationType",void 0),e([m({type:Boolean,reflect:!0})],Ce.prototype,"readonly",void 0),e([m({type:Boolean,attribute:"hide-close-button"})],Ce.prototype,"hideCloseButton",void 0),e([p()],Ce.prototype,"view",void 0),e([i({context:E,subscribe:!0})],Ce.prototype,"queryClientContext",void 0),e([i({context:n,subscribe:!0}),p()],Ce.prototype,"inheritedApiClient",void 0),e([s({context:n}),p()],Ce.prototype,"apiClient",void 0),Ce=e([o(),t("mq-chat-room")],Ce);export{Ce as MqChatRoom,MqChatRoomCloseEvent,MqChatRoomProfileEvent};
|
|
1
|
+
import{_ as e,c as t}from"./chunks/custom-element-D2ziPxYE.js";import{e as s}from"./chunks/provide-BwI4DDGF.js";import{c as i}from"./chunks/consume-CovVqBjI.js";import{l as o}from"./chunks/localized-decorator-BlOuLhym.js";import{m as a,s as r}from"./chunks/runtime-Bg1WXVCx.js";import{A as n}from"./chunks/api-client-context-V1UAGtKW.js";import{i as l,a as d,x as c,E as h}from"./chunks/lit-element-DiWJYFwC.js";import{n as m}from"./chunks/property-scuRaFcM.js";import{r as p}from"./chunks/state-LQivXIgA.js";import{n as g}from"./chunks/create-context-DqP79qjF.js";import{tokens as u}from"./theme.js";import{xIcon as v}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 y}from"./chunks/chunk-BUV4MGML-CkhBbfUu.js";import{o as f}from"./chunks/if-defined-BYeVdwgd.js";import{chevronLeftIcon as w}from"./ui/icons/chevron-left-icon.js";import{e as k}from"./chunks/query-CeeutdfT.js";import{l as x}from"./chunks/chunk-4FFT6DC2-CVWibomC.js";import{DownloadFileEvent as C}from"./events.js";import{M as $,c as I,n as z}from"./chunks/api-chat-client-BhxUWldC.js";import{S as T,g as D}from"./chunks/chunk-Y4EKUX25-QqMl3eiq.js";import{checkDoubleIcon as M}from"./ui/icons/check-double-icon.js";import{checkIcon as j}from"./ui/icons/check-icon.js";import{getLocale as q}from"./i18n.js";import{S,a as P}from"./chunks/chunk-YTQUGGS3-DmCGIoFy.js";import{s as A}from"./chunks/context-consumer-ESdICVAb.js";import{s as _}from"./chunks/chunk-6CCJWPGL-TiaqZaPV.js";import{Q as E}from"./chunks/chunk-RCFIJTXZ-C6Ir0-sM.js";import{e as R}from"./chunks/class-map-Co76I6aw.js";import{M as U}from"./chunks/mutation-controller-CR2qcqhH.js";import"./chunks/context-request-event-Dfydf1ub.js";import"./ui/icons/types.js";import"./chunks/directive-2EDmOukv.js";import"./chunks/style-map-CIdqdn7C.js";import"./chunks/query-Cjvi4_dT.js";import"./chunks/chunk-2TKJJNS7-BGwxtEg7.js";import"./chunks/parseISO-Dj3qSTG8.js";import"./chunks/format-CRFiCNHw.js";import"./chunks/external-CJj32K_p.js";import"./chunks/isBefore-CPpTogxo.js";import"./env.js";const B=g("apiKey"),N=g("token"),H=g("professionalHash"),L=g("roomId"),K=g("consultationId"),F=g("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 O=l`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 Q=class ChatRoomHeader extends d{constructor(){super(...arguments),this.hideCloseButton=!1,this.getProfessionalQuery=new b(this,()=>y(this.apiClient,{hash:this.professionalHash}))}static{this.styles=O}handleClose(){this.dispatchEvent(new MqChatRoomCloseEvent)}handleClickProfile(){this.dispatchEvent(new MqChatRoomProfileEvent)}renderProfile(){return c`<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}))}}">${w({size:24})}</mq-button><p class="profile-title">${a("Perfil de profesional")}</p></div>`}renderChat(){return c`${this.getProfessionalQuery.render({complete:e=>c`<button type="button" class="left-side ghost-btn" @click="${this.handleClickProfile}"><mq-avatar src="${f(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:()=>c`<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 c`<header>${"profile"===this.view?this.renderProfile():this.renderChat()}<div class="right-side">${this.hideCloseButton?h:c`<mq-button type="button" size="icon-md" variant="ghost-inverted" @click="${this.handleClose}">${v({size:24})}</mq-button>`}</div></header>`}};e([i({context:n,subscribe:!0})],Q.prototype,"apiClient",void 0),e([m({type:String})],Q.prototype,"professionalHash",void 0),e([m({type:Boolean})],Q.prototype,"hideCloseButton",void 0),e([m({type:String})],Q.prototype,"view",void 0),Q=e([o(),t("chat-room-header")],Q);const V=/(https?:\/\/[^\s,;:!)\]}\]]+|www\.[^\s,;:!)\]}\]]+|[a-zA-Z0-9][-a-zA-Z0-9]*(?:\.[a-zA-Z0-9][-a-zA-Z0-9]*)+(?:\/[^\s,;:!)\]}\]]*|(?:\?|#|&)[^\s,;:!)\]}\]]*)?)/gi;function J(e){return e.split(V).map((e,t)=>{if(t%2==1){const t=e.startsWith("http")?e:`https://${e}`;return c`<a href="${t}" target="_blank" rel="noopener noreferrer" class="message-link">${e}</a>`}return e})}let Y=class TextMessageBubble extends d{static{this.styles=[l`: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 c`<div class="message-content">${J(e)}</div>`;const s=t.map(e=>c`<div class="message-paragraph">${J(e.trim())}</div>`);return c`<div class="message-content">${s}</div>`}render(){return c`<div class="message-bubble ${this.kind}">${this.formatMessageContent(this.message.string)}</div>`}};e([m({type:Object})],Y.prototype,"message",void 0),e([m({type:String})],Y.prototype,"kind",void 0),Y=e([t("text-message-bubble")],Y);const Z=l`: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 G=class ImageMessageBubble extends d{constructor(){super(...arguments),this.showPreview=!1,this.isPreviewRendered=!1,this.isPreviewActive=!1,this.closeTimer=null}static{this.styles=Z}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 c`<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?c`<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">${v({size:24})}</button> <img class="preview-image" src="${e}" alt="Shared attachment preview" @click="${e=>e.stopPropagation()}" @keydown="${this.handlePreviewImageKeyDown}" tabindex="0"></div>`:""}`}};e([m({type:Object})],G.prototype,"message",void 0),e([m({type:String})],G.prototype,"kind",void 0),e([i({context:N})],G.prototype,"token",void 0),e([p()],G.prototype,"showPreview",void 0),e([p()],G.prototype,"isPreviewRendered",void 0),e([p()],G.prototype,"isPreviewActive",void 0),G=e([t("image-message-bubble")],G);const W=l`: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 X=class SystemMessageBubble extends d{static{this.styles=W}render(){return c`<div class="system-message-bubble">${J(this.message.string)}</div>`}};e([m({type:Object})],X.prototype,"message",void 0),X=e([t("system-message-bubble")],X);const ee=l`: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 te=class FileMessageBubble extends d{constructor(){super(...arguments),this.isDownloading=!1}static{this.styles=ee}formatMessageContent(e){const t=e.split("\n\n").filter(e=>e.trim());if(t.length<=1)return c`<div class="message-content">${e}</div>`;const s=t.map(e=>c`<div class="message-paragraph">${e.trim()}</div>`);return c`<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(),i=new FileReader;i.onloadend=()=>{const e=i.result,t=new C({url:e,filename:this.message.attachment.file_name});this.dispatchEvent(t),this.isDownloading=!1},i.onerror=()=>{x.error("Error reading file as data URL"),this.isDownloading=!1},i.readAsDataURL(s)}catch(e){x.error("Error downloading file:",e),this.isDownloading=!1}}render(){return c`<button type="button" @click="${this.handleDownload}" class="message-bubble ${this.kind}" ?disabled="${this.isDownloading}">${this.formatMessageContent(this.message.attachment.file_name)}</button>`}};e([m({type:Object})],te.prototype,"message",void 0),e([m({type:String})],te.prototype,"kind",void 0),e([i({context:N})],te.prototype,"token",void 0),e([p()],te.prototype,"isDownloading",void 0),te=e([t("file-message-bubble")],te);let se=class MessageBubble extends d{constructor(){super(...arguments),this.showTimestamp=!0}static{this.styles=[l`: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 $.Sent:return j({size:12,color:"currentColor"});case $.Received:return M({size:12,color:"currentColor"});case $.Read:return M({size:12,color:"currentColor",className:"read"});default:return null}}renderBubbleContent(){switch(this.message.type){case"image":return c`<image-message-bubble .message="${this.message}" .kind="${this.kind}"></image-message-bubble>`;case"file":return c`<file-message-bubble .message="${this.message}" .kind="${this.kind}"></file-message-bubble>`;default:return c`<text-message-bubble .message="${this.message}" .kind="${this.kind}"></text-message-bubble>`}}render(){if(this.message.senderType===T.system)return c`<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 c`${this.renderBubbleContent()} ${this.showTimestamp&&e?c`<div class="timestamp ${this.kind}">${this.formatTimestamp(e.toISOString())} ${"sent"===this.kind?c`<span class="status-icon ${this.message.status===$.Read?"read":""}">${this.renderStatusIcon()}</span>`:""}</div>`:""}`}};e([m({type:String})],se.prototype,"kind",void 0),e([m({type:Object})],se.prototype,"message",void 0),e([m({type:Boolean})],se.prototype,"showTimestamp",void 0),se=e([t("message-bubble")],se);let ie=class DateBanner extends d{constructor(){super(...arguments),this.date=""}static{this.styles=[u,l`: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=q().replace("_","-"),s=new Date(e),i=new Date,o=new Date(i);o.setDate(o.getDate()-1);const r=new Date(s.getFullYear(),s.getMonth(),s.getDate()),n=new Date(i.getFullYear(),i.getMonth(),i.getDate()),l=new Date(o.getFullYear(),o.getMonth(),o.getDate());return r.getTime()===n.getTime()?a("Hoy"):r.getTime()===l.getTime()?a("Ayer"):s.toLocaleDateString(t,{dateStyle:"medium"})}render(){return c`<div class="date-banner"><span class="date-text">${this.formatDate(this.date)}</span></div>`}};function oe(e){return e.createdAt?new Date(e.createdAt):e.time?new Date(e.time):new Date}e([m({type:String})],ie.prototype,"date",void 0),ie=e([o(),t("date-banner")],ie);let ae=class MessagesList extends d{constructor(){super(...arguments),this.messages=[]}static{this.styles=[u,l`: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===T.system)return!1;if(!t)return!0;if(t.senderType!==e.senderType)return!0;if(t.senderType===T.ordinary&&e.senderType===T.ordinary&&t.fromUserHash!==e.fromUserHash)return!0;return(oe(t).getTime()-oe(e).getTime())/6e4>1}groupMessagesByDate(e){const t=[];let s=null;return e.forEach((i,o)=>{const a=oe(i),r=a?.toDateString();r!==s&&(t.push({type:"date",data:a.toDateString()}),s=r??null);const n=e[o+1],l=this.shouldShowMessageTimestamp(i,n);t.push({type:"message",data:i,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 c`<date-banner .date="${t.data}"></date-banner>`;const i=this.professionalHash!==t.data.fromUserHash,o=t.data.senderType===T.system?"system":i?"sent":"received";return c`<div class="message-wrapper ${o}"><message-bubble .message="${t.data}" .kind="${o}" .showTimestamp="${t.showTimestamp||"date"===e[s+1]?.type}"></message-bubble></div>`});return c`<div class="messages-container">${t}<div class="messages-container-end"></div></div>`}};e([m({type:Array})],ae.prototype,"messages",void 0),e([m({type:String})],ae.prototype,"professionalHash",void 0),e([k(".messages-container-end")],ae.prototype,"messagesContainerEnd",void 0),ae=e([t("messages-list")],ae);let re=class MessageBubbleSkeleton extends d{constructor(){super(...arguments),this.variant="patient",this.height="md",this.showTimestamp=!0}static{this.styles=[l`: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 c`<div class="message-bubble ${this.variant}"></div>${this.showTimestamp?c`<div class="timestamp-skeleton ${this.variant}"></div>`:""}`}};e([m({type:String})],re.prototype,"variant",void 0),e([m({type:String})],re.prototype,"height",void 0),e([m({type:Boolean})],re.prototype,"showTimestamp",void 0),re=e([t("message-bubble-skeleton")],re);let ne=class MessagesSkeleton extends d{constructor(){super(...arguments),this.messageCount=6}static{this.styles=[u,l`: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),i=this.getSkeletonHeight(t);return c`<div class="message-wrapper ${s}"><message-bubble-skeleton variant="${s}" height="${i}" ?showTimestamp="${t===this.messageCount-1||Math.random()>.7}"></message-bubble-skeleton></div>`})}render(){return c`<div class="messages-container">${this.renderSkeletonMessages()}</div>`}};e([m({type:Number})],ne.prototype,"messageCount",void 0),ne=e([t("messages-skeleton")],ne);var le=class{constructor(e,t){this.host=e,this.listeners=[],this.host.addController(this),this.socketContext=new A(this.host,{context:S,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 de(e,t){return{queryKey:_(e,"rooms",t.roomId),queryFn:()=>e.rooms.getRoomMessages(t),staleTime:0}}class OptimisticUpdatesController{constructor(e){this.host=e,this.apiClientContext=new A(this.host,{context:n,subscribe:!0,callback:e=>{this.apiClient=e}}),this.queryClientContext=new A(this.host,{context:E,subscribe:!0,callback:e=>{e&&(this.queryClient=e)}}),this.host.addController(this)}hostConnected(){}appendMessageToRoom(e,t){if(!this.apiClient)return;const s=de(this.apiClient,{roomId:t}).queryKey;this.queryClient?.setQueriesData({queryKey:s,exact:!0},t=>[...t??[],e])}deleteMessage(e,t){if(!this.queryClient||!this.apiClient)return;const s=de(this.apiClient,{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||!this.apiClient)return;const i=de(this.apiClient,{roomId:s}).queryKey;this.queryClient.setQueryData(i,s=>(s??[]).map(s=>s.messageId===e?{...s,status:t}:s))}}let ce=class ChatRoomMessages extends d{constructor(){super(...arguments),this.getRoomMessagesQuery=new b(this,()=>de(this.apiClient,{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(P.messageStatus,e.messageId,this.roomId,$.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 le(this,{listeners:[{eventName:P.message,callback:this.onMessageReceived},{eventName:P.message_deleted,callback:this.onMessageDeleted},{eventName:P.messageStatus,callback:this.onMessageStatusUpdated}]})}static{this.styles=[u,l`:host{display:block;width:100%;height:100%}`]}render(){return this.getRoomMessagesQuery.render({pending:()=>c`<messages-skeleton messageCount="8"></messages-skeleton>`,complete:e=>c`<messages-list .messages="${e}" .professionalHash="${this.professionalHash}"></messages-list>`})}};e([i({context:n,subscribe:!0})],ce.prototype,"apiClient",void 0),e([m({type:Number})],ce.prototype,"roomId",void 0),e([m({type:String})],ce.prototype,"professionalHash",void 0),ce=e([t("chat-room-messages")],ce);var he=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[P.message,this.string,this.roomId,this.messageId,this.type,this.fileName,this.autoMessage,this.senderType,this.attachmentType,this.consultationId,this.consultationType]}},me=class extends he{constructor(e){super({roomId:e.roomId,messageId:e.messageId,string:e.string,type:"string",fileName:null,autoMessage:!1,senderType:T.ordinary,attachmentType:"uncategorized",consultationId:e.consultationId,consultationType:e.consultationType})}},pe=class extends he{constructor(e){super({roomId:e.roomId,messageId:e.messageId,string:e.base64Attachment,fileName:e.fileName,type:e.type,autoMessage:!1,senderType:T.ordinary,attachmentType:"uncategorized",consultationId:e.consultationId,consultationType:e.consultationType})}};async function ge(e){return await Promise.all(e.map(async e=>{const t=await function(e){return new Promise((t,s)=>{const i=new FileReader;i.onload=()=>{const o=i.result.split(",")[1];o?t(o):s(new Error(`Invalid data URL format for file: ${e.name}`))},i.onerror=()=>{s(new Error(`Failed to read file: ${e.name}`))},i.readAsDataURL(e)})}(e);return{name:e.name,size:e.size,type:e.type,base64:t}}))}const ue=l`: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 ve=class ChatRoomFooter extends d{constructor(){super(...arguments),this.isTyping=!1,this.typingTimeoutId=null,this.inputValue="",this.socketController=new le(this)}static{this.styles=[ue]}handleInputChange(e){const t=e.target;this.inputValue=t.value,this.isTyping||(this.socketController.socket?.emit(P.typing,this.roomId),this.isTyping=!0),this.typingTimeoutId&&clearTimeout(this.typingTimeoutId),this.typingTimeoutId=setTimeout(()=>{this.isTyping&&(this.socketController.socket?.emit(P.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 ge([s]))[0];if(!e)return void x.error("Error converting file to base64");const t=e?.type.includes("image")?"image":"file",i=crypto.randomUUID(),o=s.name,a=new pe({type:t,base64Attachment:e.base64,fileName:o,roomId:this.roomId,messageId:i,consultationId:this.consultationId,consultationType:this.consultationType});this.socketController.socket?.emit(...a.toSocketMessage())}catch(e){x.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(P.stop_typing,this.roomId),this.isTyping=!1,this.typingTimeoutId&&clearTimeout(this.typingTimeoutId));const s=new me({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(P.stop_typing,this.roomId),this.typingTimeoutId&&clearTimeout(this.typingTimeoutId))}render(){const e=this.inputValue.trim().length>0;return c`<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")}">${c`<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")}">${c`<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([i({context:K})],ve.prototype,"consultationId",void 0),e([i({context:F})],ve.prototype,"consultationType",void 0),e([m({type:Number})],ve.prototype,"roomId",void 0),e([p()],ve.prototype,"inputValue",void 0),e([k(".attachment-input")],ve.prototype,"attachmentInput",void 0),ve=e([t("chat-room-footer")],ve);const be=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 ye(e,t){const s=be(6===e?0:e+1);return t.some(e=>{const t=e.days_of_week;return!0===s[t]})}let fe=class AvailabilitySection extends d{constructor(){super(...arguments),this.gaps=[],this.selectedDay=function(){const e=(new Date).getDay();return 0===e?6:e-1}()}static{this.styles=l`: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||ye(this.selectedDay,this.gaps)||(this.selectedDay=void 0))}render(){const e=[{shortLabel:a("Lu"),label:a("Lunes"),key:"monday",disabled:!ye(0,this.gaps)},{shortLabel:a("Ma"),label:a("Martes"),key:"tuesday",disabled:!ye(1,this.gaps)},{shortLabel:a("Mi"),label:a("Miércoles"),key:"wednesday",disabled:!ye(2,this.gaps)},{shortLabel:a("Ju"),label:a("Jueves"),key:"thursday",disabled:!ye(3,this.gaps)},{shortLabel:a("Vi"),label:a("Viernes"),key:"friday",disabled:!ye(4,this.gaps)},{shortLabel:a("Sa"),label:a("Sábado"),key:"saturday",disabled:!ye(5,this.gaps)},{shortLabel:a("Do"),label:a("Domingo"),key:"sunday",disabled:!ye(6,this.gaps)}];return c`<h2 class="availability-header">${a("Disponibilidad")}</h2><div class="availability-days">${e.map((e,t)=>c`<button type="button" class="availability-button ${R({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=be(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 c`<div class="availability-time"><p class="time-title">${e[this.selectedDay]?.label}</p><div class="time-entries">${t.length>0?t.map(e=>c`<p class="time-entry">${a("De")} ${e.from_time} ${a("a")} ${e.to_time}</p>`):c`<p class="time-entry">${a("No hay horarios disponibles")}</p>`}</div></div>`})()}`}};e([m({type:Array})],fe.prototype,"gaps",void 0),e([p()],fe.prototype,"selectedDay",void 0),fe=e([o(),t("availability-section")],fe);const we=l`: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 ke=class ChatRoomProfile extends d{constructor(){super(...arguments),this.getProfessionalQuery=new b(this,()=>y(this.apiClient,{hash:this.professionalHash}))}static{this.styles=[u,we]}renderProfile(e){return c`<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?c`<p class="profile-specialty">${e.title}</p>`:""} ${e.collegiate_number?c`<p class="profile-collegiate">${a(r`Nº COL. ${e.collegiate_number}`)}</p>`:""}</div></div>${e.chat_schedule&&e.chat_schedule.gaps.length>0?c`<availability-section .gaps="${e.chat_schedule.gaps}"></availability-section>`:h} ${e.description||e.overview?c`<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:()=>c``,complete:e=>this.renderProfile(e)})}};e([i({context:n,subscribe:!0})],ke.prototype,"apiClient",void 0),e([m({type:String})],ke.prototype,"professionalHash",void 0),ke=e([o(),t("chat-room-profile")],ke);const xe=l`.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 Ce=class MqChatRoom extends d{constructor(){super(...arguments),this.consultationId=void 0,this.consultationType=void 0,this.readonly=!1,this.hideCloseButton=!1,this.view="chat",this.socketController=new le(this),this.readAllMessagesMutation=new U(this,{mutationFn:()=>this.apiClient.professionals.readAllMessages({roomId:this.roomId}),onSuccess:()=>{this.queryClientContext?.invalidateQueries({queryKey:D(this.apiClient,{roomId:this.roomId}).queryKey})}}),this.apiClient=I()}static{this.styles=[u,xe]}willUpdate(e){const t=z(e,{apiKey:this.apiKey,token:this.token},this.inheritedApiClient);t&&(this.apiClient=t),e.has("roomId")&&(this.socketController.socket?.emit(P.joinRoom,this.roomId),this.readAllMessagesMutation.run(void 0))}render(){return c`<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?c`<chat-room-messages .roomId="${this.roomId}" .professionalHash="${this.professionalHash}"></chat-room-messages>${this.readonly?h:c`<chat-room-footer .roomId="${this.roomId}"></chat-room-footer>`}`:c`<chat-room-profile .professionalHash="${this.professionalHash}" @mq-chat-room-chat="${()=>{this.view="chat"}}"></chat-room-profile>`}</div>`}};e([s({context:B}),m({type:String,attribute:"api-key"})],Ce.prototype,"apiKey",void 0),e([s({context:N}),m({type:String,attribute:"token"})],Ce.prototype,"token",void 0),e([s({context:H}),m({type:String,attribute:"professional-hash"})],Ce.prototype,"professionalHash",void 0),e([s({context:L}),m({type:Number,attribute:"room-id"})],Ce.prototype,"roomId",void 0),e([s({context:K}),m({type:String,attribute:"consultation-id"})],Ce.prototype,"consultationId",void 0),e([s({context:F}),m({type:String,attribute:"consultation-type"})],Ce.prototype,"consultationType",void 0),e([m({type:Boolean,reflect:!0})],Ce.prototype,"readonly",void 0),e([m({type:Boolean,attribute:"hide-close-button"})],Ce.prototype,"hideCloseButton",void 0),e([p()],Ce.prototype,"view",void 0),e([i({context:E,subscribe:!0})],Ce.prototype,"queryClientContext",void 0),e([i({context:n,subscribe:!0}),p()],Ce.prototype,"inheritedApiClient",void 0),e([s({context:n}),p()],Ce.prototype,"apiClient",void 0),Ce=e([o(),t("mq-chat-room")],Ce);export{Ce as MqChatRoom,MqChatRoomCloseEvent,MqChatRoomProfileEvent};
|
package/dist/mq-checkout.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as lit_html from 'lit-html';
|
|
2
2
|
import * as lit from 'lit';
|
|
3
3
|
import { LitElement, PropertyValues } from 'lit';
|
|
4
|
-
import { M as MediquoApiChatClient } from './chunks/index.d-
|
|
4
|
+
import { M as MediquoApiChatClient } from './chunks/index.d-DeJP_xib.js';
|
|
5
5
|
import { Env } from './env.js';
|
|
6
6
|
import { Locale } from './i18n.js';
|
|
7
7
|
import './ui/mq-skeleton.js';
|
package/dist/mq-checkout.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as t,c as e}from"./chunks/custom-element-D2ziPxYE.js";import{e as s}from"./chunks/provide-BwI4DDGF.js";import{c as i}from"./chunks/consume-CovVqBjI.js";import{m as o}from"./chunks/runtime-Bg1WXVCx.js";import{l as n}from"./chunks/localized-decorator-BlOuLhym.js";import{h as r}from"./chunks/task-Bj8p7kJX.js";import{c as a,P as h,n as c}from"./chunks/api-chat-client-
|
|
1
|
+
import{_ as t,c as e}from"./chunks/custom-element-D2ziPxYE.js";import{e as s}from"./chunks/provide-BwI4DDGF.js";import{c as i}from"./chunks/consume-CovVqBjI.js";import{m as o}from"./chunks/runtime-Bg1WXVCx.js";import{l as n}from"./chunks/localized-decorator-BlOuLhym.js";import{h as r}from"./chunks/task-Bj8p7kJX.js";import{c as a,P as h,n as c}from"./chunks/api-chat-client-BhxUWldC.js";import{A as d}from"./chunks/api-client-context-V1UAGtKW.js";import{L as l}from"./chunks/login-token-task-Yib__6a9.js";import{l as p}from"./chunks/chunk-4FFT6DC2-CVWibomC.js";import{i as m,a as u,x as v}from"./chunks/lit-element-DiWJYFwC.js";import{n as _}from"./chunks/property-scuRaFcM.js";import{r as f}from"./chunks/state-LQivXIgA.js";import{setEnv as k}from"./env.js";import{tokens as y}from"./theme.js";import{initLocalization as g,setLocale as E,isValidLocale as C}from"./i18n.js";import"./ui/mq-skeleton.js";import"./chunks/context-request-event-Dfydf1ub.js";import"./chunks/context-consumer-ESdICVAb.js";import"./chunks/chunk-2TKJJNS7-BGwxtEg7.js";import"./chunks/parseISO-Dj3qSTG8.js";import"./chunks/format-CRFiCNHw.js";import"./chunks/external-CJj32K_p.js";import"./chunks/isBefore-CPpTogxo.js";import"./chunks/create-context-DqP79qjF.js";import"./chunks/style-map-CIdqdn7C.js";import"./chunks/directive-2EDmOukv.js";var x=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{g()}catch{}const b=m`: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}`,w="mediquo:payment:retry",j="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 S=class MqCheckout extends u{constructor(){super(...arguments),this._iframeLoaded=!1,this._iframeHeight=null,this._sessionEpoch=0,this._currentSessionId=null,this._paymentOrigin=null,this.apiClient=a(),this._loginTokenTask=new l(this,()=>this.apiClient,{args:()=>[this.apiKey,this.token],onComplete:t=>{this._sessionToken=t.access_token,this.apiClient.setAuthToken(t.access_token),this._sessionTask.run()},onError:()=>{this.dispatchEvent(new CheckoutErrorEvent({reason:"auth"}))}}),this._sessionTask=new r(this,{task:async()=>{if("function"!=typeof this.provideSession)throw new Error("mq-checkout: `provideSession` property is required");return this.provideSession(this.apiClient)},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,p.warn(`mq-checkout: invalid paymentUrl "${t.paymentUrl}"`)}},onError:()=>{this.dispatchEvent(new CheckoutErrorEvent({reason:"session"}))}}),this._paymentPoll=new x(this,{startDelayMs:5e3,intervalMs:3e3,timeoutMs:6e5,refetchFn:async()=>{if(!this._currentSessionId)throw new Error("mq-checkout: session not ready");const t=await this.apiClient.payments.getPaymentSession(this._currentSessionId);return t.status===h.Denied&&(this._paymentPoll.stop(),this.dispatchEvent(new CheckoutDeniedEvent({sessionId:this._currentSessionId}))),t},shouldComplete:t=>t.status===h.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 w:return this.dispatchEvent(new CheckoutRetryEvent),this._sessionEpoch+=1,void this._sessionTask.run();case j:return void("number"==typeof t.data.height&&(this._iframeHeight=t.data.height))}}}static{this.styles=[y,b]}get _timedOut(){return this._paymentPoll.timedOut}connectedCallback(){super.connectedCallback(),window.addEventListener("message",this._onMessage)}disconnectedCallback(){window.removeEventListener("message",this._onMessage),super.disconnectedCallback()}willUpdate(t){t.has("env")&&this.env&&k(this.env),t.has("locale")&&E(C(this.locale)?this.locale:"es_ES");const e=c(t,{env:this.env,apiKey:this.apiKey,token:this._sessionToken,locale:C(this.locale)?this.locale:"es_ES"},this.inheritedApiClient);e&&(this.apiClient=e)}_onIframeLoad(){this._iframeLoaded=!0}_renderState(t,e){return v`<div class="state"><p class="state-title">${t}</p>${e?v`<p class="state-message">${e}</p>`:null}</div>`}_renderLoading(){return v`<div class="payment-frame"><mq-skeleton width="100%" height="600px" border-radius="md" role="status" aria-live="polite" aria-label="${o("Cargando portal de pago")}"></mq-skeleton></div>`}_renderFrame(t){return v`<div class="payment-frame">${this._iframeLoaded?null:this._renderLoading()}<iframe class="${this._iframeLoaded?"loaded":""}" src="${t}" title="${o("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(o("No hemos podido confirmar tu pago"),o("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(o("No hemos podido iniciar el pago"),o("Por favor, inténtalo de nuevo más tarde.")),complete:()=>this._sessionTask.render({initial:()=>this._renderLoading(),pending:()=>this._renderLoading(),error:()=>this._renderState(o("No hemos podido iniciar el pago"),o("Por favor, inténtalo de nuevo más tarde.")),complete:t=>this._renderFrame(t.paymentUrl)})})}};t([_({type:String,attribute:"env"})],S.prototype,"env",void 0),t([_({type:String,attribute:"api-key"})],S.prototype,"apiKey",void 0),t([_({type:String,attribute:"token"})],S.prototype,"token",void 0),t([_({type:String,attribute:"locale",reflect:!0})],S.prototype,"locale",void 0),t([_({attribute:!1})],S.prototype,"provideSession",void 0),t([f()],S.prototype,"_iframeLoaded",void 0),t([f()],S.prototype,"_iframeHeight",void 0),t([f()],S.prototype,"_sessionEpoch",void 0),t([i({context:d,subscribe:!0}),f()],S.prototype,"inheritedApiClient",void 0),t([s({context:d}),f()],S.prototype,"apiClient",void 0),S=t([n(),e("mq-checkout")],S);export{CheckoutDeniedEvent,CheckoutErrorEvent,CheckoutRetryEvent,CheckoutSuccessEvent,S as MqCheckout};
|
package/dist/mq-dashboard.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as lit_html from 'lit-html';
|
|
2
2
|
import * as lit from 'lit';
|
|
3
3
|
import { LitElement, nothing, PropertyValues } from 'lit';
|
|
4
|
-
import { M as MediquoApiChatClient, b as GetOrganizationSetupResponse } from './chunks/index.d-
|
|
4
|
+
import { M as MediquoApiChatClient, b as GetOrganizationSetupResponse } from './chunks/index.d-DeJP_xib.js';
|
|
5
5
|
import { L as LoginTokenResponse } from './chunks/schemas.d-b6_AekBb.js';
|
|
6
6
|
import { Env } from './env.js';
|
|
7
7
|
import './mq-next-appointments.js';
|
|
@@ -15,8 +15,8 @@ import 'axios';
|
|
|
15
15
|
import 'zod';
|
|
16
16
|
import './chunks/index-Nf3nZ9O3.js';
|
|
17
17
|
import './chunks/index-DTEtqjQF.js';
|
|
18
|
-
import './chunks/next-appointment-card-
|
|
19
|
-
import './chunks/mq-chat-room-
|
|
18
|
+
import './chunks/next-appointment-card-CWz0tef1.js';
|
|
19
|
+
import './chunks/mq-chat-room-B3ant6md.js';
|
|
20
20
|
import './chunks/appointment.model.d-BWwBLaEL.js';
|
|
21
21
|
import '@tanstack/query-core';
|
|
22
22
|
import './ui/mq-dialog.js';
|
|
@@ -25,7 +25,7 @@ import './chunks/professional-overview-mO3tuMuH.js';
|
|
|
25
25
|
import './ui/mq-text-button.js';
|
|
26
26
|
import './ui/mq-floating-bubble.js';
|
|
27
27
|
import './ui/mq-unread-badge.js';
|
|
28
|
-
import './chunks/index-
|
|
28
|
+
import './chunks/index-D0njwg5o.js';
|
|
29
29
|
import './chunks/document.model.d-DIzMiOmd.js';
|
|
30
30
|
|
|
31
31
|
declare class SupportChatBanner extends LitElement {
|
|
@@ -40,7 +40,7 @@ declare class SupportChatBanner extends LitElement {
|
|
|
40
40
|
private get _hasUnread();
|
|
41
41
|
private _toggleSupportChat;
|
|
42
42
|
private _ctaIcon;
|
|
43
|
-
render():
|
|
43
|
+
render(): lit_html.TemplateResult<1> | typeof nothing | null;
|
|
44
44
|
}
|
|
45
45
|
declare global {
|
|
46
46
|
interface HTMLElementTagNameMap {
|
package/dist/mq-dashboard.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isValidLocale as e,setLocale as t,initLocalization as i}from"./i18n.js";import{_ as o,c as n}from"./chunks/custom-element-D2ziPxYE.js";import{e as r}from"./chunks/provide-BwI4DDGF.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 p}from"./chunks/query-controller-BlO1Ax65.js";import{A as c}from"./chunks/api-client-context-V1UAGtKW.js";import{l as h}from"./chunks/chunk-S5RWG6G2-DPesx3Od.js";import{g as d}from"./chunks/get-organization-setup-query-Dr1cXnHl.js";import{t as m,m as u,v,h as g}from"./chunks/telemetry-client-DEIuDZfA.js";import{i as b,a as f,E as k,x}from"./chunks/lit-element-DiWJYFwC.js";import{n as w}from"./chunks/property-scuRaFcM.js";import{r as y}from"./chunks/state-LQivXIgA.js";import{setEnv as j}from"./env.js";import{g as q,c as z,n as $}from"./chunks/api-chat-client-5LVJAeLW.js";import"./chunks/mq-next-appointments-BIOkXfI7.js";import"./chunks/mq-recent-documents-DVhwoeLA.js";import"./chunks/mq-layout-BiE8gq23.js";import"./ui/mq-skeleton.js";import{g as C}from"./chunks/chunk-BUV4MGML-CkhBbfUu.js";import{S as _,a as S,b as B}from"./chunks/index-BJYWtEmT.js";import{messageSquareIcon as T}from"./ui/icons/message-square-icon.js";import"./ui/mq-avatar.js";import"./ui/mq-button.js";import{o as E}from"./chunks/style-map-CIdqdn7C.js";import{MqAppointmentBookEvent as M,MqViewAppointmentsEvent as A}from"./events.js";export{MqAppointmentJoinVideocallEvent,MqAppointmentRescheduleEvent,MqAppointmentViewDocumentationEvent,MqViewDocumentsEvent}from"./events.js";import"./chunks/chunk-4FFT6DC2-CVWibomC.js";import"./chunks/external-CJj32K_p.js";import"./chunks/context-request-event-Dfydf1ub.js";import"./chunks/context-consumer-ESdICVAb.js";import"./chunks/chunk-RCFIJTXZ-C6Ir0-sM.js";import"./chunks/create-context-DqP79qjF.js";import"./chunks/query-Cjvi4_dT.js";import"./chunks/chunk-6CCJWPGL-TiaqZaPV.js";import"./chunks/chunk-2TKJJNS7-BGwxtEg7.js";import"./chunks/parseISO-Dj3qSTG8.js";import"./chunks/format-CRFiCNHw.js";import"./chunks/isBefore-CPpTogxo.js";import"./chunks/next-appointment-card-DxNzffoM.js";import"./chunks/chunk-Y4EKUX25-QqMl3eiq.js";import"./chunks/refund-cancel-policy-QG_OE6g5.js";import"./ui/icons/calendar-icon.js";import"./chunks/if-defined-BYeVdwgd.js";import"./ui/icons/types.js";import"./ui/icons/dots-horizontal-icon.js";import"./ui/icons/message-bubble-icon.js";import"./ui/icons/phone-icon.js";import"./ui/icons/video-icon.js";import"./mq-chat-room.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/class-map-Co76I6aw.js";import"./chunks/directive-2EDmOukv.js";import"./chunks/mutation-controller-CR2qcqhH.js";import"./ui/mq-dialog.js";import"./chunks/price-DU3YLTpk.js";import"./chunks/professional-overview-B4E05rLd.js";import"./ui/icons/chevron-down-icon.js";import"./ui/mq-text-button.js";import"./ui/mq-floating-bubble.js";import"./ui/mq-unread-badge.js";import"./ui/mq-toast.js";import"./chunks/get-patient-profile-query-4AO6xvVn.js";import"./chunks/index-DEEAEB_4.js";import"./ui/icons/file-icon.js";import"./chunks/index-Bw-MbGKw.js";import"./ui/icons/arrow-right-icon.js";import"./chunks/index-DG95qEn3.js";import"./chunks/blob-to-base64-CUL1trde.js";import"./ui/icons/download-02-icon.js";const U=b`*{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 V=class SupportChatBanner extends f{constructor(){super(...arguments),this._unreadCount=0,this._professionalQuery=new p(this,()=>C(this.apiClient,{hash:this.professionalHash??""},{enabled:Boolean(this.professionalHash)})),this._onUnreadChange=e=>{this._unreadCount=e.count??0}}static{this.styles=U}connectedCallback(){super.connectedCallback(),window.addEventListener(_.eventName,this._onUnreadChange),window.dispatchEvent(new S)}disconnectedCallback(){super.disconnectedCallback(),window.removeEventListener(_.eventName,this._onUnreadChange)}get _hasUnread(){return this._unreadCount>0}_toggleSupportChat(){window.dispatchEvent(new B)}_ctaIcon(e=16){return x`<span class="icon-wrap">${T({size:e,color:"currentColor"})} ${this._hasUnread?x`<span class="unread-dot"></span>`:k}</span>`}render(){return this.professionalHash?this._professionalQuery.render({pending:()=>x``,error:()=>x``,complete:e=>{const t=e.title??l("Asesor comercial"),i=q(e);return x`<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="${e.avatar??void 0}" .fallback="${e.name}" .alt="${e.name}"></mq-avatar><span class="online-dot" data-presence="${i}"></span> </span><span class="mobile-info"><p class="mobile-title">${e.title?x`<span class="mobile-role">${e.title}</span> - ${e.name}`:e.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">${t}</p><p class="name">${e.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>`}}):k}};o([a({context:c,subscribe:!0})],V.prototype,"apiClient",void 0),o([w({type:String,attribute:"professional-hash"})],V.prototype,"professionalHash",void 0),o([y()],V.prototype,"_unreadCount",void 0),V=o([s(),n("support-chat-banner")],V);const Q=b`: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 G=class TopBanner extends f{static{this.styles=Q}_handleBook(){m.track(u(this.loginToken.patient.hash)),this.dispatchEvent(new M)}_handleViewAppointments(){m.track(v(this.loginToken.patient.hash)),this.dispatchEvent(new A({tab:"next"}))}render(){const e=this.orgSetup.home.title||l("Cita con un especialista en menos de 72 horas"),t=this.orgSetup.home.description||l("Traumatología, ginecología, endocrinología, digestivo o psiquiatría"),i=this.orgSetup.home.image_url;return x`<div class="banner-inner ${i?"":"single-column"}"><div class="top-banner-info"><div>${e?x`<h3>${e}</h3>`:k} ${t?x`<p>${t}</p>`:k}</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?x`<div class="top-banner-image" style="${E({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>`:k}</div>`}};o([a({context:h})],G.prototype,"loginToken",void 0),o([w({attribute:!1})],G.prototype,"orgSetup",void 0),G=o([s(),n("top-banner")],G);const I=b`: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)}mq-next-appointments{width:100%}mq-recent-documents{width:100%}@media (min-width:768px){.banner-area{margin:0 auto}.content{flex-direction:row}mq-next-appointments{width:50%}mq-recent-documents{width:50%}}`;let J=class MqDashboard extends f{constructor(){super(...arguments),this.showMediquoBranding=!0,this._trackedPageView=!1,this.orgSetupQuery=new p(this,()=>d(this.apiClient)),this.apiClient=z()}static{this.styles=I}willUpdate(i){i.has("env")&&this.env&&j(this.env),i.has("locale")&&this.locale&&e(this.locale)&&t(this.locale);const o=$(i,{env:this.env,apiKey:this.apiKey,token:this.token,locale:this.locale},this.inheritedApiClient);o&&(this.apiClient=o)}updated(){!this._trackedPageView&&this.loginToken?.patient.hash&&(this._trackedPageView=!0,m.track(g(this.loginToken.patient.hash)))}render(){return x`${this.orgSetupQuery.render({pending:()=>x``,complete:e=>e.support_professional?.hash?x`<support-chat-banner class="support-banner" professional-hash="${e.support_professional.hash}"></support-chat-banner>`:x``})}<mq-layout background="transparent" variant="wide" .showMediquoBranding="${this.showMediquoBranding}">${this.orgSetupQuery.render({pending:()=>x`<mq-skeleton class="banner-area" width="100%" height="296px" border-radius="none"></mq-skeleton>`,complete:e=>x`<top-banner class="banner-area" .orgSetup="${e}"></top-banner>`})}<div class="content"><mq-next-appointments></mq-next-appointments><mq-recent-documents></mq-recent-documents></div></mq-layout>`}};o([w({type:String,attribute:"api-key"})],J.prototype,"apiKey",void 0),o([w({type:String,attribute:"token"})],J.prototype,"token",void 0),o([w({type:String,attribute:"locale"})],J.prototype,"locale",void 0),o([w({type:String,attribute:"env"})],J.prototype,"env",void 0),o([w({type:Boolean,attribute:"show-mediquo-branding"})],J.prototype,"showMediquoBranding",void 0),o([a({context:h})],J.prototype,"loginToken",void 0),o([a({context:c,subscribe:!0}),y()],J.prototype,"inheritedApiClient",void 0),o([r({context:c}),y()],J.prototype,"apiClient",void 0),J=o([s(),n("mq-dashboard")],J),i();export{M as MqAppointmentBookEvent,J as MqDashboard,A as MqViewAppointmentsEvent};
|
|
1
|
+
import{isValidLocale as e,setLocale as t,initLocalization as i}from"./i18n.js";import{_ as o,c as n}from"./chunks/custom-element-D2ziPxYE.js";import{e as r}from"./chunks/provide-BwI4DDGF.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 p}from"./chunks/query-controller-BlO1Ax65.js";import{A as c}from"./chunks/api-client-context-V1UAGtKW.js";import{l as h}from"./chunks/chunk-S5RWG6G2-DPesx3Od.js";import{g as d}from"./chunks/get-organization-setup-query-Dr1cXnHl.js";import{t as m,m as u,v,h as g}from"./chunks/telemetry-client-DEIuDZfA.js";import{i as b,a as f,E as k,x}from"./chunks/lit-element-DiWJYFwC.js";import{n as w}from"./chunks/property-scuRaFcM.js";import{r as y}from"./chunks/state-LQivXIgA.js";import{setEnv as j}from"./env.js";import{g as q,c as z,n as $}from"./chunks/api-chat-client-BhxUWldC.js";import"./chunks/mq-next-appointments-BdsRyXJB.js";import"./chunks/mq-recent-documents-CNweIX5U.js";import"./chunks/mq-layout-BiE8gq23.js";import"./ui/mq-skeleton.js";import{g as C}from"./chunks/chunk-BUV4MGML-CkhBbfUu.js";import{S as _,a as S,b as B}from"./chunks/index-BJYWtEmT.js";import{messageSquareIcon as T}from"./ui/icons/message-square-icon.js";import"./ui/mq-avatar.js";import"./ui/mq-button.js";import{o as E}from"./chunks/style-map-CIdqdn7C.js";import{MqAppointmentBookEvent as M,MqViewAppointmentsEvent as A}from"./events.js";export{MqAppointmentJoinVideocallEvent,MqAppointmentRescheduleEvent,MqAppointmentViewDocumentationEvent,MqViewDocumentsEvent}from"./events.js";import"./chunks/chunk-4FFT6DC2-CVWibomC.js";import"./chunks/external-CJj32K_p.js";import"./chunks/context-request-event-Dfydf1ub.js";import"./chunks/context-consumer-ESdICVAb.js";import"./chunks/chunk-RCFIJTXZ-C6Ir0-sM.js";import"./chunks/create-context-DqP79qjF.js";import"./chunks/query-Cjvi4_dT.js";import"./chunks/chunk-6CCJWPGL-TiaqZaPV.js";import"./chunks/chunk-2TKJJNS7-BGwxtEg7.js";import"./chunks/parseISO-Dj3qSTG8.js";import"./chunks/format-CRFiCNHw.js";import"./chunks/isBefore-CPpTogxo.js";import"./chunks/next-appointment-card-KXLkEJDg.js";import"./chunks/chunk-Y4EKUX25-QqMl3eiq.js";import"./chunks/refund-cancel-policy-QG_OE6g5.js";import"./ui/icons/calendar-icon.js";import"./chunks/if-defined-BYeVdwgd.js";import"./ui/icons/types.js";import"./ui/icons/dots-horizontal-icon.js";import"./ui/icons/message-bubble-icon.js";import"./ui/icons/phone-icon.js";import"./ui/icons/video-icon.js";import"./mq-chat-room.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/class-map-Co76I6aw.js";import"./chunks/directive-2EDmOukv.js";import"./chunks/mutation-controller-CR2qcqhH.js";import"./ui/mq-dialog.js";import"./chunks/price-DU3YLTpk.js";import"./chunks/professional-overview-B4E05rLd.js";import"./ui/icons/chevron-down-icon.js";import"./ui/mq-text-button.js";import"./ui/mq-floating-bubble.js";import"./ui/mq-unread-badge.js";import"./ui/mq-toast.js";import"./chunks/get-patient-profile-query-4AO6xvVn.js";import"./chunks/index-DEEAEB_4.js";import"./ui/icons/file-icon.js";import"./chunks/index-Bw-MbGKw.js";import"./ui/icons/arrow-right-icon.js";import"./chunks/index-DjD-3x4f.js";import"./chunks/blob-to-base64-CUL1trde.js";import"./ui/icons/download-02-icon.js";const U=b`*{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 V=class SupportChatBanner extends f{constructor(){super(...arguments),this._unreadCount=0,this._professionalQuery=new p(this,()=>C(this.apiClient,{hash:this.professionalHash??""},{enabled:Boolean(this.professionalHash)})),this._onUnreadChange=e=>{this._unreadCount=e.count??0}}static{this.styles=U}connectedCallback(){super.connectedCallback(),window.addEventListener(_.eventName,this._onUnreadChange),window.dispatchEvent(new S)}disconnectedCallback(){super.disconnectedCallback(),window.removeEventListener(_.eventName,this._onUnreadChange)}get _hasUnread(){return this._unreadCount>0}_toggleSupportChat(){window.dispatchEvent(new B)}_ctaIcon(e=16){return x`<span class="icon-wrap">${T({size:e,color:"currentColor"})} ${this._hasUnread?x`<span class="unread-dot"></span>`:k}</span>`}render(){return this.professionalHash?this._professionalQuery.render({pending:()=>x``,error:()=>x``,complete:e=>{const t=e.title??l("Asesor comercial"),i=q(e);return x`<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="${e.avatar??void 0}" .fallback="${e.name}" .alt="${e.name}"></mq-avatar><span class="online-dot" data-presence="${i}"></span> </span><span class="mobile-info"><p class="mobile-title">${e.title?x`<span class="mobile-role">${e.title}</span> - ${e.name}`:e.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">${t}</p><p class="name">${e.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>`}}):k}};o([a({context:c,subscribe:!0})],V.prototype,"apiClient",void 0),o([w({type:String,attribute:"professional-hash"})],V.prototype,"professionalHash",void 0),o([y()],V.prototype,"_unreadCount",void 0),V=o([s(),n("support-chat-banner")],V);const Q=b`: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 G=class TopBanner extends f{static{this.styles=Q}_handleBook(){m.track(u(this.loginToken.patient.hash)),this.dispatchEvent(new M)}_handleViewAppointments(){m.track(v(this.loginToken.patient.hash)),this.dispatchEvent(new A({tab:"next"}))}render(){const e=this.orgSetup.home.title||l("Cita con un especialista en menos de 72 horas"),t=this.orgSetup.home.description||l("Traumatología, ginecología, endocrinología, digestivo o psiquiatría"),i=this.orgSetup.home.image_url;return x`<div class="banner-inner ${i?"":"single-column"}"><div class="top-banner-info"><div>${e?x`<h3>${e}</h3>`:k} ${t?x`<p>${t}</p>`:k}</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?x`<div class="top-banner-image" style="${E({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>`:k}</div>`}};o([a({context:h})],G.prototype,"loginToken",void 0),o([w({attribute:!1})],G.prototype,"orgSetup",void 0),G=o([s(),n("top-banner")],G);const I=b`: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)}mq-next-appointments{width:100%}mq-recent-documents{width:100%}@media (min-width:768px){.banner-area{margin:0 auto}.content{flex-direction:row}mq-next-appointments{width:50%}mq-recent-documents{width:50%}}`;let J=class MqDashboard extends f{constructor(){super(...arguments),this.showMediquoBranding=!0,this._trackedPageView=!1,this.orgSetupQuery=new p(this,()=>d(this.apiClient)),this.apiClient=z()}static{this.styles=I}willUpdate(i){i.has("env")&&this.env&&j(this.env),i.has("locale")&&this.locale&&e(this.locale)&&t(this.locale);const o=$(i,{env:this.env,apiKey:this.apiKey,token:this.token,locale:this.locale},this.inheritedApiClient);o&&(this.apiClient=o)}updated(){!this._trackedPageView&&this.loginToken?.patient.hash&&(this._trackedPageView=!0,m.track(g(this.loginToken.patient.hash)))}render(){return x`${this.orgSetupQuery.render({pending:()=>x``,complete:e=>e.support_professional?.hash?x`<support-chat-banner class="support-banner" professional-hash="${e.support_professional.hash}"></support-chat-banner>`:x``})}<mq-layout background="transparent" variant="wide" .showMediquoBranding="${this.showMediquoBranding}">${this.orgSetupQuery.render({pending:()=>x`<mq-skeleton class="banner-area" width="100%" height="296px" border-radius="none"></mq-skeleton>`,complete:e=>x`<top-banner class="banner-area" .orgSetup="${e}"></top-banner>`})}<div class="content"><mq-next-appointments></mq-next-appointments><mq-recent-documents></mq-recent-documents></div></mq-layout>`}};o([w({type:String,attribute:"api-key"})],J.prototype,"apiKey",void 0),o([w({type:String,attribute:"token"})],J.prototype,"token",void 0),o([w({type:String,attribute:"locale"})],J.prototype,"locale",void 0),o([w({type:String,attribute:"env"})],J.prototype,"env",void 0),o([w({type:Boolean,attribute:"show-mediquo-branding"})],J.prototype,"showMediquoBranding",void 0),o([a({context:h})],J.prototype,"loginToken",void 0),o([a({context:c,subscribe:!0}),y()],J.prototype,"inheritedApiClient",void 0),o([r({context:c}),y()],J.prototype,"apiClient",void 0),J=o([s(),n("mq-dashboard")],J),i();export{M as MqAppointmentBookEvent,J as MqDashboard,A as MqViewAppointmentsEvent};
|
package/dist/mq-documents.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as lit_html from 'lit-html';
|
|
2
2
|
import * as lit from 'lit';
|
|
3
3
|
import { LitElement, PropertyValues } from 'lit';
|
|
4
|
-
import { M as MediquoApiChatClient } from './chunks/index.d-
|
|
4
|
+
import { M as MediquoApiChatClient } from './chunks/index.d-DeJP_xib.js';
|
|
5
5
|
import { Env } from './env.js';
|
|
6
|
-
import './chunks/index-
|
|
6
|
+
import './chunks/index-D0njwg5o.js';
|
|
7
7
|
import './chunks/index-Nf3nZ9O3.js';
|
|
8
8
|
import 'axios';
|
|
9
9
|
import 'zod';
|
package/dist/mq-documents.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isValidLocale as t,setLocale as e,getLocale as i,initLocalization as n}from"./i18n.js";import{_ as o,c as r}from"./chunks/custom-element-D2ziPxYE.js";import{e as s}from"./chunks/provide-BwI4DDGF.js";import{c as a}from"./chunks/consume-CovVqBjI.js";import{m as c,s as p}from"./chunks/runtime-Bg1WXVCx.js";import{l as u}from"./chunks/localized-decorator-BlOuLhym.js";import{Q as l}from"./chunks/query-controller-BlO1Ax65.js";import{A as m}from"./chunks/api-client-context-V1UAGtKW.js";import{g as d}from"./chunks/telemetry-client-DEIuDZfA.js";import{g as h,t as g}from"./chunks/index-
|
|
1
|
+
import{isValidLocale as t,setLocale as e,getLocale as i,initLocalization as n}from"./i18n.js";import{_ as o,c as r}from"./chunks/custom-element-D2ziPxYE.js";import{e as s}from"./chunks/provide-BwI4DDGF.js";import{c as a}from"./chunks/consume-CovVqBjI.js";import{m as c,s as p}from"./chunks/runtime-Bg1WXVCx.js";import{l as u}from"./chunks/localized-decorator-BlOuLhym.js";import{Q as l}from"./chunks/query-controller-BlO1Ax65.js";import{A as m}from"./chunks/api-client-context-V1UAGtKW.js";import{g as d}from"./chunks/telemetry-client-DEIuDZfA.js";import{g as h,t as g}from"./chunks/index-DjD-3x4f.js";import{g as y}from"./chunks/get-patient-profile-query-4AO6xvVn.js";import{i as k,a as v,x as f}from"./chunks/lit-element-DiWJYFwC.js";import{n as j}from"./chunks/property-scuRaFcM.js";import{r as b}from"./chunks/state-LQivXIgA.js";import{setEnv as P}from"./env.js";import{c as x,n as $}from"./chunks/api-chat-client-BhxUWldC.js";import{chevronLeftIcon as S}from"./ui/icons/chevron-left-icon.js";import{chevronRightIcon as q}from"./ui/icons/chevron-right-icon.js";import"./chunks/index-DEEAEB_4.js";import{o as _}from"./chunks/if-defined-BYeVdwgd.js";import"./chunks/chunk-4FFT6DC2-CVWibomC.js";import"./chunks/external-CJj32K_p.js";import"./chunks/context-request-event-Dfydf1ub.js";import"./chunks/context-consumer-ESdICVAb.js";import"./chunks/chunk-RCFIJTXZ-C6Ir0-sM.js";import"./chunks/create-context-DqP79qjF.js";import"./chunks/query-Cjvi4_dT.js";import"./chunks/chunk-6CCJWPGL-TiaqZaPV.js";import"./chunks/blob-to-base64-CUL1trde.js";import"./events.js";import"./ui/icons/download-02-icon.js";import"./ui/icons/types.js";import"./ui/mq-button.js";import"./chunks/class-map-Co76I6aw.js";import"./chunks/directive-2EDmOukv.js";import"./ui/mq-toast.js";import"./ui/mq-skeleton.js";import"./chunks/style-map-CIdqdn7C.js";import"./chunks/chunk-2TKJJNS7-BGwxtEg7.js";import"./chunks/parseISO-Dj3qSTG8.js";import"./chunks/format-CRFiCNHw.js";import"./chunks/isBefore-CPpTogxo.js";import"./ui/icons/calendar-icon.js";import"./ui/icons/file-icon.js";const w=k`:host{display:block}.container{background-color:var(--color-card,#fff);border:1px solid var(--color-border-subtle,#edecf1);padding:var(--mq-documents-padding,var(--sp-6));border-radius:var(--mq-documents-radius,12px)}.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}`;let C=class MqDocuments extends v{constructor(){super(...arguments),this.currentPage=1,this.apiClient=x(),this.getPatientProfileQuery=new l(this,()=>y(this.apiClient)),this.getPatientDocumentsQuery=new l(this,()=>({...h(this.apiClient,{patient_hash:this._patientHash,page:this.currentPage,per_page:6}),enabled:!!this._patientHash})),this.getOrganizationSpecialtiesQuery=new l(this,()=>d(this.apiClient))}static{this.styles=w}willUpdate(i){i.has("env")&&this.env&&P(this.env),i.has("locale")&&this.locale&&t(this.locale)&&e(this.locale);const n=$(i,{env:this.env,apiKey:this.apiKey,token:this.token,locale:this.locale},this.inheritedApiClient);n&&(this.apiClient=n)}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)}renderSkeleton(){return f`<document-list placeholders="${6}"></document-list>`}renderEmptyState(){return f`<widget-empty-state icon="document" heading="${c("No tienes documentación")}" description="${c("Aquí se mostrarán tus recetas e informes médicos.")}"></widget-empty-state>`}renderError(){return f`<widget-empty-state icon="document" heading="${c("No hemos podido cargar tu documentación")}" description="${c("Vuelve a intentarlo en unos minutos.")}"></widget-empty-state>`}renderDocuments(){return this.getPatientDocumentsQuery.render({complete:t=>0===t.data.length?this.renderEmptyState():f`<document-list .documents="${g(t.data,this.getOrganizationSpecialtiesQuery.result?.data,i())}" patientHash="${this._patientHash}"></document-list>${this.renderPagination(t.meta)}`,initial:()=>this.getPatientProfileQuery.result?.isError?this.renderError():this.renderSkeleton(),pending:()=>this.renderSkeleton(),error:()=>this.renderError()})}renderPagination(t){const e=t.current_page>1,i=t.current_page<t.last_page;return f`<div class="pagination"><button class="pagination-button" @click="${this.handlePreviousPage}" ?disabled="${!e}" aria-label="${c("Página anterior")}">${S({size:24})}</button> <span class="pagination-text">${c(p`${t.current_page} de ${t.last_page}`)} </span><button class="pagination-button" @click="${this.handleNextPage}" ?disabled="${!i}" aria-label="${c("Página siguiente")}">${q({size:24})}</button></div>`}render(){return f`<div class="container">${this.renderDocuments()}</div>`}};o([j({type:String,attribute:"api-key"})],C.prototype,"apiKey",void 0),o([j({type:String,attribute:"token"})],C.prototype,"token",void 0),o([j({type:String,attribute:"locale"})],C.prototype,"locale",void 0),o([j({type:String,attribute:"env"})],C.prototype,"env",void 0),o([b()],C.prototype,"currentPage",void 0),o([a({context:m,subscribe:!0}),b()],C.prototype,"inheritedApiClient",void 0),o([s({context:m}),b()],C.prototype,"apiClient",void 0),C=o([u(),r("mq-documents")],C);const Q=k`:host{display:block}.container{display:flex;flex-direction:column;gap:var(--size-3)}`;let D=class MqDocumentsPage extends v{static{this.styles=Q}render(){return f`<div class="container"><mq-documents api-key="${_(this.apiKey)}" token="${_(this.token)}" locale="${_(this.locale)}" env="${_(this.env)}"></mq-documents></div>`}};o([j({type:String,attribute:"api-key"})],D.prototype,"apiKey",void 0),o([j({type:String,attribute:"token"})],D.prototype,"token",void 0),o([j({type:String,attribute:"locale"})],D.prototype,"locale",void 0),o([j({type:String,attribute:"env"})],D.prototype,"env",void 0),D=o([u(),r("mq-documents-page")],D),n();export{C as MqDocuments,D as MqDocumentsPage};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as lit from 'lit';
|
|
2
2
|
import { LitElement, PropertyValues } from 'lit';
|
|
3
|
-
import { M as MediquoApiChatClient } from './chunks/index.d-
|
|
3
|
+
import { M as MediquoApiChatClient } from './chunks/index.d-DeJP_xib.js';
|
|
4
4
|
import { Env } from './env.js';
|
|
5
5
|
import { Locale } from './i18n.js';
|
|
6
6
|
import 'axios';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as t,c as e}from"./chunks/custom-element-D2ziPxYE.js";import{e as n}from"./chunks/provide-BwI4DDGF.js";import{c as a}from"./chunks/consume-CovVqBjI.js";import{m as o}from"./chunks/runtime-Bg1WXVCx.js";import{l as i}from"./chunks/localized-decorator-BlOuLhym.js";import{A as s}from"./chunks/api-client-context-V1UAGtKW.js";import{L as r}from"./chunks/login-token-task-Yib__6a9.js";import{l}from"./chunks/chunk-4FFT6DC2-CVWibomC.js";import{i as c,a as h,x as u}from"./chunks/lit-element-DiWJYFwC.js";import{n as p}from"./chunks/property-scuRaFcM.js";import{r as y}from"./chunks/state-LQivXIgA.js";import{setEnv as d}from"./env.js";import{initLocalization as m,setLocale as g,isValidLocale as v}from"./i18n.js";import{b,c as k,n as _}from"./chunks/api-chat-client-5LVJAeLW.js";import{r as C}from"./chunks/apple-pay-outcomes-DyL3HLPm.js";import"./chunks/context-request-event-Dfydf1ub.js";import"./chunks/context-consumer-ESdICVAb.js";import"./chunks/create-context-DqP79qjF.js";import"./chunks/task-Bj8p7kJX.js";import"./chunks/external-CJj32K_p.js";import"./chunks/chunk-2TKJJNS7-BGwxtEg7.js";import"./chunks/parseISO-Dj3qSTG8.js";import"./chunks/format-CRFiCNHw.js";import"./chunks/isBefore-CPpTogxo.js";function f(){return"undefined"!=typeof google&&"function"==typeof google.payments?.api?.PaymentsClient}const E=["PAN_ONLY","CRYPTOGRAM_3DS"],w=["VISA","MASTERCARD","AMEX"];function P(t){return{type:"PAYMENT_GATEWAY",parameters:{gateway:"globalpayments",gatewayMerchantId:t}}}function I(t){return{type:"CARD",parameters:{allowedAuthMethods:[...E],allowedCardNetworks:[...w]},tokenizationSpecification:P(t)}}function S(t){return[I(t)]}function G(t,e){return"test"===e?"TEST":"production"===e?"PRODUCTION":"development"===t?"TEST":"PRODUCTION"}function j(t,e){return function(t,e){return{apiVersion:2,apiVersionMinor:0,allowedPaymentMethods:S(t.gatewayMerchantId),merchantInfo:{merchantId:t.merchantId,merchantName:t.merchantName},transactionInfo:{totalPriceStatus:"FINAL",totalPrice:e.amount,currencyCode:e.currencyCode,countryCode:e.countryCode}}}(t,e)}async function T(t,e,n,a={}){if("undefined"==typeof window||!window.isSecureContext)return l.warn("google-pay: unavailable outside a secure context"),{available:!1,reason:"unsupported"};if(!t.trim())return l.warn("google-pay: missing merchant id"),{available:!1,reason:"merchant-id-missing"};if(!e.trim())return l.warn("google-pay: missing gateway merchant id"),{available:!1,reason:"gateway-merchant-id-missing"};if(!await function(t=8e3,e){return f()?Promise.resolve(!0):t<=0||e?.aborted?Promise.resolve(!1):new Promise(n=>{const a=Date.now()+t,o=t=>{clearInterval(s),e?.removeEventListener("abort",i),n(t)},i=()=>o(!1),s=setInterval(()=>{f()?o(!0):Date.now()>=a&&o(!1)},100);e?.addEventListener("abort",i,{once:!0})})}(a.sdkWaitTimeoutMs,a.signal))return l.warn("google-pay: pay.js was not loaded by the host page"),{available:!1,reason:"sdk-missing"};const o=G(n,a.gatewayEnvironment);try{const t=new google.payments.api.PaymentsClient({environment:o}),n=await t.isReadyToPay(function(t){return{apiVersion:2,apiVersionMinor:0,allowedPaymentMethods:S(t)}}(e));return n.result?{available:!0}:(l.warn("google-pay: isReadyToPay returned false",{environment:o}),{available:!1,reason:"unsupported"})}catch(t){return l.warn("google-pay: isReadyToPay threw",{environment:o,error:t instanceof Error?t.message:String(t)}),{available:!1,reason:"unsupported"}}}function A(t,e){return function(t){if(function(t){return"object"==typeof t&&null!==t&&"statusCode"in t&&"string"==typeof t.statusCode}(t)){const e=t.statusCode.toUpperCase();if("CANCELED"===e||"CANCELLED"===e)return!0}if(t instanceof Error){const e=t.message.toLowerCase();return e.includes("cancel")||e.includes("closed")||e.includes("abort")}return!1}(t)?{kind:"cancelled"}:b(t)&&400===t.response?.status?{kind:"denied",sessionId:e}:{kind:"authorize"}}function D(t){if(null!==t&&"object"==typeof t){const e=t.paymentMethodData?.tokenizationData,n=e?.token;if("string"==typeof n&&n.length>0)return n}throw new Error("Invalid Google Pay payment data: missing tokenizationData.token")}try{m()}catch{}const N=c`:host{display:flex;flex-direction:column;align-items:stretch;justify-content:center;gap:12px;width:100%;min-height:48px}.pay-row{display:block;width:100%}.pay-row--paying{opacity:.55;pointer-events:none}::slotted([slot=google-pay-button]){display:block;width:100%;height:var(--mq-google-pay-button-height,48px)}.state{text-align:center;font-family:system-ui,sans-serif;font-size:15px;color:#86868b;margin:0}`;class GooglePayCheckoutSuccessEvent extends Event{static{this.eventName="payment-success"}constructor(t){super(GooglePayCheckoutSuccessEvent.eventName,{bubbles:!0,composed:!0}),this.detail=t}}class GooglePayCheckoutDeniedEvent extends Event{static{this.eventName="payment-denied"}constructor(t){super(GooglePayCheckoutDeniedEvent.eventName,{bubbles:!0,composed:!0}),this.detail=t}}class GooglePayCheckoutErrorEvent extends Event{static{this.eventName="payment-error"}constructor(t){super(GooglePayCheckoutErrorEvent.eventName,{bubbles:!0,composed:!0}),this.detail=t}}const x=new Set(["sdk-missing","unsupported"]);function M(t,e){l.warn(t,{error:e instanceof Error?e.message:String(e)})}let R=class MqGooglePayCheckout extends h{constructor(){super(...arguments),this._availabilityPhase="checking",this._unavailableReason=null,this._paying=!1,this._paymentsClient=null,this._paymentsClientEnvironment=null,this._buttonHost=null,this._availabilityGeneration=0,this._availabilityAbortController=null,this._terminalErrorDispatched=!1,this.apiClient=k(),this._loginTokenTask=new r(this,()=>this.apiClient,{args:()=>[this.apiKey,this.token],onComplete:t=>{this._sessionToken=t.access_token,this.apiClient.setAuthToken(t.access_token),this._refreshAvailability()},onError:()=>{this.dispatchEvent(new GooglePayCheckoutErrorEvent({reason:"auth"}))}}),this._onPayClick=()=>{this._paying||"ready"!==this._availabilityPhase||this._processPayment()}}static{this.styles=N}willUpdate(t){t.has("env")&&(this.env&&d(this.env),this._resetPaymentsClient()),t.has("gatewayEnvironment")&&this._resetPaymentsClient(),t.has("locale")&&g(v(this.locale)?this.locale:"es_ES");const e=_(t,{env:this.env,apiKey:this.apiKey,token:this._sessionToken,locale:v(this.locale)?this.locale:"es_ES"},this.inheritedApiClient);e&&(this.apiClient=e),(t.has("merchantId")||t.has("gatewayMerchantId")||t.has("env")||t.has("gatewayEnvironment"))&&this._loginTokenTask.value&&this._refreshAvailability()}connectedCallback(){super.connectedCallback(),this._availabilityAbortController=new AbortController,this._terminalErrorDispatched=!1}disconnectedCallback(){this._availabilityAbortController?.abort(),this._availabilityAbortController=null,this._resetPaymentsClient(),super.disconnectedCallback()}_dispatchTerminalError(){this._terminalErrorDispatched||(this._terminalErrorDispatched=!0,this.dispatchEvent(new GooglePayCheckoutErrorEvent({reason:"unsupported"})))}_resetPaymentsClient(){this._paymentsClient=null,this._paymentsClientEnvironment=null,this._removeButtonHost()}_getPaymentsClient(){const t=G(this.env,this.gatewayEnvironment);return this._paymentsClient&&this._paymentsClientEnvironment===t||(this._paymentsClient=new google.payments.api.PaymentsClient({environment:t}),this._paymentsClientEnvironment=t,this._buttonHost=null),this._paymentsClient}async _refreshAvailability(){const t=++this._availabilityGeneration;this._availabilityPhase="checking",this._unavailableReason=null,this._removeButtonHost();const e=await T(this.merchantId??"",this.gatewayMerchantId??"",this.env,{signal:this._availabilityAbortController?.signal,gatewayEnvironment:this.gatewayEnvironment});if(t===this._availabilityGeneration&&this.isConnected){if(!e.available)return this._availabilityPhase="unavailable",this._unavailableReason=e.reason,void(x.has(e.reason)&&this._dispatchTerminalError());this._availabilityPhase="ready",this._unavailableReason=null}}_ensureButtonHost(){const t=this.querySelector(':scope > [slot="google-pay-button"]');if(t)return t;const e=document.createElement("div");return e.slot="google-pay-button",this.appendChild(e),e}_removeButtonHost(){this.querySelector(':scope > [slot="google-pay-button"]')?.remove(),this._buttonHost=null}_mountGooglePayButton(){if(this._buttonHost||"ready"!==this._availabilityPhase)return;const t=this._ensureButtonHost();try{const e=this._getPaymentsClient().createButton({onClick:this._onPayClick,buttonColor:"black",buttonType:"pay",buttonSizeMode:"fill"});t.replaceChildren(e),this._buttonHost=t}catch(t){M("mq-google-pay-checkout: failed to create Google Pay button",t),this._removeButtonHost(),this._availabilityPhase="unavailable",this._unavailableReason="unsupported",this._dispatchTerminalError()}}updated(t){super.updated(t),"ready"===this._availabilityPhase&&this._mountGooglePayButton()}async _processPayment(){this._paying=!0;try{const t=await this._getPaymentsClient().loadPaymentData(j({merchantId:this.merchantId,gatewayMerchantId:this.gatewayMerchantId,merchantName:this.merchantName||this.label},{amount:this.amount,currencyCode:this.currency,countryCode:this.country})),e=await this.apiClient.payments.authorizeGooglePay({order_id:this.sessionId,token:D(t)}),{status:n,consultation_id:a}=e.data,o=C(n,a,this.sessionId);switch(o.kind){case"success":this.dispatchEvent(new GooglePayCheckoutSuccessEvent({sessionId:o.sessionId,reference:o.reference}));break;case"denied":this.dispatchEvent(new GooglePayCheckoutDeniedEvent({sessionId:o.sessionId}));break;case"error":this.dispatchEvent(new GooglePayCheckoutErrorEvent({reason:o.reason}))}}catch(t){const e=A(t,this.sessionId);switch(e.kind){case"cancelled":this.dispatchEvent(new GooglePayCheckoutErrorEvent({reason:"cancelled"}));break;case"denied":this.dispatchEvent(new GooglePayCheckoutDeniedEvent({sessionId:e.sessionId}));break;case"authorize":M("mq-google-pay-checkout: authorize failed",t),this.dispatchEvent(new GooglePayCheckoutErrorEvent({reason:"authorize"}))}}finally{this._paying=!1}}_renderUnavailable(){switch(this._unavailableReason){case"merchant-id-missing":return u`<p class="state">${o("Falta el identificador de comercio de Google Pay")}</p>`;case"gateway-merchant-id-missing":return u`<p class="state">${o("Falta el identificador de pasarela de Google Pay")}</p>`;case"sdk-missing":return u`<p class="state">${o("No se ha podido cargar Google Pay. Comprueba la configuración del sitio e inténtalo de nuevo.")}</p>`;default:return u`<p class="state">${o("Google Pay no está disponible. Prueba con tarjeta u otro método de pago.")}</p>`}}render(){return this._loginTokenTask.render({pending:()=>u`<p class="state">${o("Preparando Google Pay…")}</p>`,error:()=>u`<p class="state">${o("No hemos podido iniciar el pago")}</p>`,complete:()=>"checking"===this._availabilityPhase?u`<p class="state">${o("Comprobando Google Pay…")}</p>`:"unavailable"===this._availabilityPhase?this._renderUnavailable():u`<div class="pay-row ${this._paying?"pay-row--paying":""}"><slot name="google-pay-button"></slot></div>`})}};t([p({type:String,attribute:"env"})],R.prototype,"env",void 0),t([p({type:String,attribute:"gateway-environment"})],R.prototype,"gatewayEnvironment",void 0),t([p({type:String,attribute:"api-key"})],R.prototype,"apiKey",void 0),t([p({type:String,attribute:"token"})],R.prototype,"token",void 0),t([p({type:String,attribute:"locale",reflect:!0})],R.prototype,"locale",void 0),t([p({type:String,attribute:"merchant-id"})],R.prototype,"merchantId",void 0),t([p({type:String,attribute:"gateway-merchant-id"})],R.prototype,"gatewayMerchantId",void 0),t([p({type:String,attribute:"merchant-name"})],R.prototype,"merchantName",void 0),t([p({type:String,attribute:"session-id"})],R.prototype,"sessionId",void 0),t([p({type:String,attribute:"amount"})],R.prototype,"amount",void 0),t([p({type:String,attribute:"currency"})],R.prototype,"currency",void 0),t([p({type:String,attribute:"country"})],R.prototype,"country",void 0),t([p({type:String,attribute:"label"})],R.prototype,"label",void 0),t([y()],R.prototype,"_availabilityPhase",void 0),t([y()],R.prototype,"_unavailableReason",void 0),t([y()],R.prototype,"_paying",void 0),t([a({context:s,subscribe:!0}),y()],R.prototype,"inheritedApiClient",void 0),t([n({context:s}),y()],R.prototype,"apiClient",void 0),R=t([i(),e("mq-google-pay-checkout")],R);export{GooglePayCheckoutDeniedEvent,GooglePayCheckoutErrorEvent,GooglePayCheckoutSuccessEvent,R as MqGooglePayCheckout};
|
|
1
|
+
import{_ as t,c as e}from"./chunks/custom-element-D2ziPxYE.js";import{e as n}from"./chunks/provide-BwI4DDGF.js";import{c as a}from"./chunks/consume-CovVqBjI.js";import{m as o}from"./chunks/runtime-Bg1WXVCx.js";import{l as i}from"./chunks/localized-decorator-BlOuLhym.js";import{A as s}from"./chunks/api-client-context-V1UAGtKW.js";import{L as r}from"./chunks/login-token-task-Yib__6a9.js";import{l}from"./chunks/chunk-4FFT6DC2-CVWibomC.js";import{i as c,a as h,x as u}from"./chunks/lit-element-DiWJYFwC.js";import{n as p}from"./chunks/property-scuRaFcM.js";import{r as y}from"./chunks/state-LQivXIgA.js";import{setEnv as d}from"./env.js";import{initLocalization as m,setLocale as g,isValidLocale as v}from"./i18n.js";import{i as b,c as k,n as _}from"./chunks/api-chat-client-BhxUWldC.js";import{r as C}from"./chunks/apple-pay-outcomes-BU_PyQdT.js";import"./chunks/context-request-event-Dfydf1ub.js";import"./chunks/context-consumer-ESdICVAb.js";import"./chunks/create-context-DqP79qjF.js";import"./chunks/task-Bj8p7kJX.js";import"./chunks/external-CJj32K_p.js";import"./chunks/chunk-2TKJJNS7-BGwxtEg7.js";import"./chunks/parseISO-Dj3qSTG8.js";import"./chunks/format-CRFiCNHw.js";import"./chunks/isBefore-CPpTogxo.js";function f(){return"undefined"!=typeof google&&"function"==typeof google.payments?.api?.PaymentsClient}const E=["PAN_ONLY","CRYPTOGRAM_3DS"],w=["VISA","MASTERCARD","AMEX"];function P(t){return{type:"PAYMENT_GATEWAY",parameters:{gateway:"globalpayments",gatewayMerchantId:t}}}function I(t){return{type:"CARD",parameters:{allowedAuthMethods:[...E],allowedCardNetworks:[...w]},tokenizationSpecification:P(t)}}function S(t){return[I(t)]}function G(t,e){return"test"===e?"TEST":"production"===e?"PRODUCTION":"development"===t?"TEST":"PRODUCTION"}function j(t,e){return function(t,e){return{apiVersion:2,apiVersionMinor:0,allowedPaymentMethods:S(t.gatewayMerchantId),merchantInfo:{merchantId:t.merchantId,merchantName:t.merchantName},transactionInfo:{totalPriceStatus:"FINAL",totalPrice:e.amount,currencyCode:e.currencyCode,countryCode:e.countryCode}}}(t,e)}async function T(t,e,n,a={}){if("undefined"==typeof window||!window.isSecureContext)return l.warn("google-pay: unavailable outside a secure context"),{available:!1,reason:"unsupported"};if(!t.trim())return l.warn("google-pay: missing merchant id"),{available:!1,reason:"merchant-id-missing"};if(!e.trim())return l.warn("google-pay: missing gateway merchant id"),{available:!1,reason:"gateway-merchant-id-missing"};if(!await function(t=8e3,e){return f()?Promise.resolve(!0):t<=0||e?.aborted?Promise.resolve(!1):new Promise(n=>{const a=Date.now()+t,o=t=>{clearInterval(s),e?.removeEventListener("abort",i),n(t)},i=()=>o(!1),s=setInterval(()=>{f()?o(!0):Date.now()>=a&&o(!1)},100);e?.addEventListener("abort",i,{once:!0})})}(a.sdkWaitTimeoutMs,a.signal))return l.warn("google-pay: pay.js was not loaded by the host page"),{available:!1,reason:"sdk-missing"};const o=G(n,a.gatewayEnvironment);try{const t=new google.payments.api.PaymentsClient({environment:o}),n=await t.isReadyToPay(function(t){return{apiVersion:2,apiVersionMinor:0,allowedPaymentMethods:S(t)}}(e));return n.result?{available:!0}:(l.warn("google-pay: isReadyToPay returned false",{environment:o}),{available:!1,reason:"unsupported"})}catch(t){return l.warn("google-pay: isReadyToPay threw",{environment:o,error:t instanceof Error?t.message:String(t)}),{available:!1,reason:"unsupported"}}}function A(t,e){return function(t){if(function(t){return"object"==typeof t&&null!==t&&"statusCode"in t&&"string"==typeof t.statusCode}(t)){const e=t.statusCode.toUpperCase();if("CANCELED"===e||"CANCELLED"===e)return!0}if(t instanceof Error){const e=t.message.toLowerCase();return e.includes("cancel")||e.includes("closed")||e.includes("abort")}return!1}(t)?{kind:"cancelled"}:b(t)&&400===t.response?.status?{kind:"denied",sessionId:e}:{kind:"authorize"}}function D(t){if(null!==t&&"object"==typeof t){const e=t.paymentMethodData?.tokenizationData,n=e?.token;if("string"==typeof n&&n.length>0)return n}throw new Error("Invalid Google Pay payment data: missing tokenizationData.token")}try{m()}catch{}const N=c`:host{display:flex;flex-direction:column;align-items:stretch;justify-content:center;gap:12px;width:100%;min-height:48px}.pay-row{display:block;width:100%}.pay-row--paying{opacity:.55;pointer-events:none}::slotted([slot=google-pay-button]){display:block;width:100%;height:var(--mq-google-pay-button-height,48px)}.state{text-align:center;font-family:system-ui,sans-serif;font-size:15px;color:#86868b;margin:0}`;class GooglePayCheckoutSuccessEvent extends Event{static{this.eventName="payment-success"}constructor(t){super(GooglePayCheckoutSuccessEvent.eventName,{bubbles:!0,composed:!0}),this.detail=t}}class GooglePayCheckoutDeniedEvent extends Event{static{this.eventName="payment-denied"}constructor(t){super(GooglePayCheckoutDeniedEvent.eventName,{bubbles:!0,composed:!0}),this.detail=t}}class GooglePayCheckoutErrorEvent extends Event{static{this.eventName="payment-error"}constructor(t){super(GooglePayCheckoutErrorEvent.eventName,{bubbles:!0,composed:!0}),this.detail=t}}const x=new Set(["sdk-missing","unsupported"]);function M(t,e){l.warn(t,{error:e instanceof Error?e.message:String(e)})}let R=class MqGooglePayCheckout extends h{constructor(){super(...arguments),this._availabilityPhase="checking",this._unavailableReason=null,this._paying=!1,this._paymentsClient=null,this._paymentsClientEnvironment=null,this._buttonHost=null,this._availabilityGeneration=0,this._availabilityAbortController=null,this._terminalErrorDispatched=!1,this.apiClient=k(),this._loginTokenTask=new r(this,()=>this.apiClient,{args:()=>[this.apiKey,this.token],onComplete:t=>{this._sessionToken=t.access_token,this.apiClient.setAuthToken(t.access_token),this._refreshAvailability()},onError:()=>{this.dispatchEvent(new GooglePayCheckoutErrorEvent({reason:"auth"}))}}),this._onPayClick=()=>{this._paying||"ready"!==this._availabilityPhase||this._processPayment()}}static{this.styles=N}willUpdate(t){t.has("env")&&(this.env&&d(this.env),this._resetPaymentsClient()),t.has("gatewayEnvironment")&&this._resetPaymentsClient(),t.has("locale")&&g(v(this.locale)?this.locale:"es_ES");const e=_(t,{env:this.env,apiKey:this.apiKey,token:this._sessionToken,locale:v(this.locale)?this.locale:"es_ES"},this.inheritedApiClient);e&&(this.apiClient=e),(t.has("merchantId")||t.has("gatewayMerchantId")||t.has("env")||t.has("gatewayEnvironment"))&&this._loginTokenTask.value&&this._refreshAvailability()}connectedCallback(){super.connectedCallback(),this._availabilityAbortController=new AbortController,this._terminalErrorDispatched=!1}disconnectedCallback(){this._availabilityAbortController?.abort(),this._availabilityAbortController=null,this._resetPaymentsClient(),super.disconnectedCallback()}_dispatchTerminalError(){this._terminalErrorDispatched||(this._terminalErrorDispatched=!0,this.dispatchEvent(new GooglePayCheckoutErrorEvent({reason:"unsupported"})))}_resetPaymentsClient(){this._paymentsClient=null,this._paymentsClientEnvironment=null,this._removeButtonHost()}_getPaymentsClient(){const t=G(this.env,this.gatewayEnvironment);return this._paymentsClient&&this._paymentsClientEnvironment===t||(this._paymentsClient=new google.payments.api.PaymentsClient({environment:t}),this._paymentsClientEnvironment=t,this._buttonHost=null),this._paymentsClient}async _refreshAvailability(){const t=++this._availabilityGeneration;this._availabilityPhase="checking",this._unavailableReason=null,this._removeButtonHost();const e=await T(this.merchantId??"",this.gatewayMerchantId??"",this.env,{signal:this._availabilityAbortController?.signal,gatewayEnvironment:this.gatewayEnvironment});if(t===this._availabilityGeneration&&this.isConnected){if(!e.available)return this._availabilityPhase="unavailable",this._unavailableReason=e.reason,void(x.has(e.reason)&&this._dispatchTerminalError());this._availabilityPhase="ready",this._unavailableReason=null}}_ensureButtonHost(){const t=this.querySelector(':scope > [slot="google-pay-button"]');if(t)return t;const e=document.createElement("div");return e.slot="google-pay-button",this.appendChild(e),e}_removeButtonHost(){this.querySelector(':scope > [slot="google-pay-button"]')?.remove(),this._buttonHost=null}_mountGooglePayButton(){if(this._buttonHost||"ready"!==this._availabilityPhase)return;const t=this._ensureButtonHost();try{const e=this._getPaymentsClient().createButton({onClick:this._onPayClick,buttonColor:"black",buttonType:"pay",buttonSizeMode:"fill"});t.replaceChildren(e),this._buttonHost=t}catch(t){M("mq-google-pay-checkout: failed to create Google Pay button",t),this._removeButtonHost(),this._availabilityPhase="unavailable",this._unavailableReason="unsupported",this._dispatchTerminalError()}}updated(t){super.updated(t),"ready"===this._availabilityPhase&&this._mountGooglePayButton()}async _processPayment(){this._paying=!0;try{const t=await this._getPaymentsClient().loadPaymentData(j({merchantId:this.merchantId,gatewayMerchantId:this.gatewayMerchantId,merchantName:this.merchantName||this.label},{amount:this.amount,currencyCode:this.currency,countryCode:this.country})),e=await this.apiClient.payments.authorizeGooglePay({order_id:this.sessionId,token:D(t)}),{status:n,consultation_id:a}=e.data,o=C(n,a,this.sessionId);switch(o.kind){case"success":this.dispatchEvent(new GooglePayCheckoutSuccessEvent({sessionId:o.sessionId,reference:o.reference}));break;case"denied":this.dispatchEvent(new GooglePayCheckoutDeniedEvent({sessionId:o.sessionId}));break;case"error":this.dispatchEvent(new GooglePayCheckoutErrorEvent({reason:o.reason}))}}catch(t){const e=A(t,this.sessionId);switch(e.kind){case"cancelled":this.dispatchEvent(new GooglePayCheckoutErrorEvent({reason:"cancelled"}));break;case"denied":this.dispatchEvent(new GooglePayCheckoutDeniedEvent({sessionId:e.sessionId}));break;case"authorize":M("mq-google-pay-checkout: authorize failed",t),this.dispatchEvent(new GooglePayCheckoutErrorEvent({reason:"authorize"}))}}finally{this._paying=!1}}_renderUnavailable(){switch(this._unavailableReason){case"merchant-id-missing":return u`<p class="state">${o("Falta el identificador de comercio de Google Pay")}</p>`;case"gateway-merchant-id-missing":return u`<p class="state">${o("Falta el identificador de pasarela de Google Pay")}</p>`;case"sdk-missing":return u`<p class="state">${o("No se ha podido cargar Google Pay. Comprueba la configuración del sitio e inténtalo de nuevo.")}</p>`;default:return u`<p class="state">${o("Google Pay no está disponible. Prueba con tarjeta u otro método de pago.")}</p>`}}render(){return this._loginTokenTask.render({pending:()=>u`<p class="state">${o("Preparando Google Pay…")}</p>`,error:()=>u`<p class="state">${o("No hemos podido iniciar el pago")}</p>`,complete:()=>"checking"===this._availabilityPhase?u`<p class="state">${o("Comprobando Google Pay…")}</p>`:"unavailable"===this._availabilityPhase?this._renderUnavailable():u`<div class="pay-row ${this._paying?"pay-row--paying":""}"><slot name="google-pay-button"></slot></div>`})}};t([p({type:String,attribute:"env"})],R.prototype,"env",void 0),t([p({type:String,attribute:"gateway-environment"})],R.prototype,"gatewayEnvironment",void 0),t([p({type:String,attribute:"api-key"})],R.prototype,"apiKey",void 0),t([p({type:String,attribute:"token"})],R.prototype,"token",void 0),t([p({type:String,attribute:"locale",reflect:!0})],R.prototype,"locale",void 0),t([p({type:String,attribute:"merchant-id"})],R.prototype,"merchantId",void 0),t([p({type:String,attribute:"gateway-merchant-id"})],R.prototype,"gatewayMerchantId",void 0),t([p({type:String,attribute:"merchant-name"})],R.prototype,"merchantName",void 0),t([p({type:String,attribute:"session-id"})],R.prototype,"sessionId",void 0),t([p({type:String,attribute:"amount"})],R.prototype,"amount",void 0),t([p({type:String,attribute:"currency"})],R.prototype,"currency",void 0),t([p({type:String,attribute:"country"})],R.prototype,"country",void 0),t([p({type:String,attribute:"label"})],R.prototype,"label",void 0),t([y()],R.prototype,"_availabilityPhase",void 0),t([y()],R.prototype,"_unavailableReason",void 0),t([y()],R.prototype,"_paying",void 0),t([a({context:s,subscribe:!0}),y()],R.prototype,"inheritedApiClient",void 0),t([n({context:s}),y()],R.prototype,"apiClient",void 0),R=t([i(),e("mq-google-pay-checkout")],R);export{GooglePayCheckoutDeniedEvent,GooglePayCheckoutErrorEvent,GooglePayCheckoutSuccessEvent,R as MqGooglePayCheckout};
|
|
@@ -4,7 +4,7 @@ import { Env } from './env.js';
|
|
|
4
4
|
import { Locale } from './i18n.js';
|
|
5
5
|
import './mq-checkout.js';
|
|
6
6
|
import 'zod';
|
|
7
|
-
import './chunks/index.d-
|
|
7
|
+
import './chunks/index.d-DeJP_xib.js';
|
|
8
8
|
import 'axios';
|
|
9
9
|
import './chunks/schemas.d-b6_AekBb.js';
|
|
10
10
|
import './ui/mq-skeleton.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e,c as t}from"./chunks/custom-element-D2ziPxYE.js";import{a as s,x as i}from"./chunks/lit-element-DiWJYFwC.js";import{n as o}from"./chunks/property-scuRaFcM.js";import{o as n}from"./chunks/if-defined-BYeVdwgd.js";import"./mq-checkout.js";import"./chunks/provide-BwI4DDGF.js";import"./chunks/context-request-event-Dfydf1ub.js";import"./chunks/consume-CovVqBjI.js";import"./chunks/context-consumer-ESdICVAb.js";import"./chunks/runtime-Bg1WXVCx.js";import"./chunks/localized-decorator-BlOuLhym.js";import"./chunks/task-Bj8p7kJX.js";import"./chunks/api-chat-client-
|
|
1
|
+
import{_ as e,c as t}from"./chunks/custom-element-D2ziPxYE.js";import{a as s,x as i}from"./chunks/lit-element-DiWJYFwC.js";import{n as o}from"./chunks/property-scuRaFcM.js";import{o as n}from"./chunks/if-defined-BYeVdwgd.js";import"./mq-checkout.js";import"./chunks/provide-BwI4DDGF.js";import"./chunks/context-request-event-Dfydf1ub.js";import"./chunks/consume-CovVqBjI.js";import"./chunks/context-consumer-ESdICVAb.js";import"./chunks/runtime-Bg1WXVCx.js";import"./chunks/localized-decorator-BlOuLhym.js";import"./chunks/task-Bj8p7kJX.js";import"./chunks/api-chat-client-BhxUWldC.js";import"./chunks/chunk-2TKJJNS7-BGwxtEg7.js";import"./chunks/parseISO-Dj3qSTG8.js";import"./chunks/format-CRFiCNHw.js";import"./chunks/external-CJj32K_p.js";import"./chunks/isBefore-CPpTogxo.js";import"./env.js";import"./chunks/api-client-context-V1UAGtKW.js";import"./chunks/create-context-DqP79qjF.js";import"./chunks/login-token-task-Yib__6a9.js";import"./chunks/chunk-4FFT6DC2-CVWibomC.js";import"./chunks/state-LQivXIgA.js";import"./theme.js";import"./i18n.js";import"./ui/mq-skeleton.js";import"./chunks/style-map-CIdqdn7C.js";import"./chunks/directive-2EDmOukv.js";class ImmediateVideocallPaidEvent extends Event{static{this.eventName="payment-success"}constructor(e){super(ImmediateVideocallPaidEvent.eventName,{bubbles:!0,composed:!0}),this.detail=e}}let c=class MqImmediateVideocallCheckout extends s{constructor(){super(...arguments),this._provideSession=async e=>{const t=await e.payments.createImmediateVideocallPaymentLink({video_call_schedule_id:this.videoCallScheduleId});return{sessionId:t.session_id,paymentUrl:t.payment_link}},this._onSuccess=e=>{e.stopPropagation(),this.dispatchEvent(new ImmediateVideocallPaidEvent({videoCallId:e.detail.reference}))}}render(){return i`<mq-checkout env="${n(this.env)}" api-key="${this.apiKey}" token="${this.token}" locale="${this.locale}" .provideSession="${this._provideSession}" @payment-success="${this._onSuccess}"></mq-checkout>`}};e([o({type:String,attribute:"env"})],c.prototype,"env",void 0),e([o({type:String,attribute:"api-key"})],c.prototype,"apiKey",void 0),e([o({type:String,attribute:"token"})],c.prototype,"token",void 0),e([o({type:String,attribute:"locale",reflect:!0})],c.prototype,"locale",void 0),e([o({type:String,attribute:"video-call-schedule-id"})],c.prototype,"videoCallScheduleId",void 0),c=e([t("mq-immediate-videocall-checkout")],c);export{ImmediateVideocallPaidEvent,c as MqImmediateVideocallCheckout};
|
|
@@ -4,13 +4,13 @@ import * as lit from 'lit';
|
|
|
4
4
|
import { LitElement, PropertyValues } from 'lit';
|
|
5
5
|
import { MqTabsSelectEvent } from './ui/mq-tabs.js';
|
|
6
6
|
import { z } from 'zod';
|
|
7
|
-
import { M as MediquoApiChatClient, G as GetAppointmentsResponse } from './chunks/index.d-
|
|
7
|
+
import { M as MediquoApiChatClient, G as GetAppointmentsResponse } from './chunks/index.d-DeJP_xib.js';
|
|
8
8
|
import './ui/mq-button.js';
|
|
9
|
-
import './chunks/next-appointment-card-
|
|
9
|
+
import './chunks/next-appointment-card-CWz0tef1.js';
|
|
10
10
|
import './ui/mq-card.js';
|
|
11
11
|
export { P as ProfessionalOverview } from './chunks/professional-overview-mO3tuMuH.js';
|
|
12
12
|
import { L as LoginTokenResponse } from './chunks/schemas.d-b6_AekBb.js';
|
|
13
|
-
import './chunks/mq-chat-room-
|
|
13
|
+
import './chunks/mq-chat-room-B3ant6md.js';
|
|
14
14
|
import './ui/mq-floating-bubble.js';
|
|
15
15
|
import './ui/mq-unread-badge.js';
|
|
16
16
|
import './chunks/appointment.model.d-BWwBLaEL.js';
|