clinic-connect-widget 1.0.7 → 1.0.8
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/clinic-widget.es.js +142 -5
- package/dist/clinic-widget.umd.js +1 -1
- package/package.json +2 -1
package/dist/clinic-widget.es.js
CHANGED
|
@@ -104,7 +104,7 @@ const CONFIG = {
|
|
|
104
104
|
// LiveKit Server URL
|
|
105
105
|
LIVEKIT_URL: "wss://livekit.longvan.vn"
|
|
106
106
|
};
|
|
107
|
-
const styles = ':host{--td-primary: #0e65f1;--td-primary-hover: #0b50c0;--td-bg-light: #ffffff;--td-bg-dark: #1a202c;--td-text-main: #0d131c;--td-text-sub: #49699c;--td-border: #e7ecf4;--td-success: #22c55e;--td-danger: #ef4444;--font-family: "Inter", system-ui, -apple-system, sans-serif;--z-index: 9999;font-family:var(--font-family);color:var(--td-text-main)}*{box-sizing:border-box;margin:0;padding:0}.hidden{display:none!important}.material-symbols-outlined{font-family:Material Symbols Outlined;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr}.td-widget-fab{position:fixed;bottom:24px;right:24px;display:flex;align-items:center;gap:12px;z-index:var(--z-index);cursor:pointer;font-family:var(--font-family)}.td-fab-card{background:var(--td-bg-light);border:1px solid var(--td-border);border-radius:12px;box-shadow:0 8px 30px #0000001f;display:flex;align-items:center;padding:6px 16px 6px 6px;transition:transform .2s ease,box-shadow .2s ease;max-width:320px;position:relative;overflow:hidden}.td-fab-card:hover{transform:translateY(-4px);box-shadow:0 20px 40px #00000026}.td-avatar-container{width:64px;height:64px;border-radius:8px;overflow:hidden;position:relative;flex-shrink:0}.td-avatar{width:100%;height:100%;background-size:cover;background-position:center}.td-status-dot{position:absolute;bottom:4px;right:4px;width:14px;height:14px;background:var(--td-success);border:2px solid #fff;border-radius:50%}.td-info{margin-left:12px;display:flex;flex-direction:column}.td-brand{display:flex;align-items:center;gap:4px;font-size:10px;font-weight:700;text-transform:uppercase;color:var(--td-primary);letter-spacing:.05em}.td-cta{font-size:15px;font-weight:700;color:var(--td-text-main);margin-top:2px}.td-sub{font-size:12px;color:var(--td-text-sub);margin-top:2px}.td-close-fab{position:absolute;top:4px;right:4px;opacity:0;cursor:pointer;background:none;border:none;color:#94a3b8;transition:opacity .2s;padding:4px}.td-fab-card:hover .td-close-fab{opacity:1}.td-widget-expanded{position:fixed;bottom:100px;right:24px;width:380px;max-height:80vh;background:var(--td-bg-light);border-radius:12px;box-shadow:0 25px 50px -12px #00000040;border:1px solid var(--td-border);display:flex;flex-direction:column;overflow:hidden;z-index:var(--z-index);animation:slideUp .3s cubic-bezier(.16,1,.3,1)}@keyframes slideUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.td-header{display:flex;align-items:center;justify-content:space-between;padding:16px;border-bottom:1px solid var(--td-border)}.td-header-title{display:flex;align-items:center;gap:12px;font-weight:700;font-size:18px}.td-icon-box{width:32px;height:32px;background:#0e65f11a;color:var(--td-primary);border-radius:8px;display:flex;align-items:center;justify-content:center}.td-close-btn{background:transparent;border:none;cursor:pointer;color:#64748b;padding:4px;border-radius:50%;display:flex;align-items:center;justify-content:center}.td-close-btn:hover{background:#f1f5f9}.td-content{flex:1;overflow-y:auto;padding:0}.td-doctor-profile{display:flex;flex-direction:column;align-items:center;padding:32px 24px 24px}.td-online-badge{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;background:#f0fdf4;border:1px solid #dcfce7;border-radius:999px}.td-pulse{width:8px;height:8px;background:var(--td-success);border-radius:50%}.td-badge-text{font-size:12px;font-weight:600;color:#15803d;text-transform:uppercase}.td-online-badge.td-offline{background:#f3f4f6;border-color:#e5e7eb}.td-online-badge.td-offline .td-badge-text{color:#6b7280}.td-online-badge.td-offline .td-pulse{background:#9ca3af;animation:none}.td-trust-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;padding:0 24px 24px}.td-trust-item{background:#f8f9fc;border:1px solid var(--td-border);border-radius:12px;padding:12px;text-align:center;display:flex;flex-direction:column;align-items:center;gap:8px}.td-trust-title{font-size:12px;font-weight:700}.td-actions{padding:0 24px 24px;display:flex;flex-direction:column;gap:12px}.td-btn{width:100%;height:48px;border-radius:8px;font-size:16px;font-weight:700;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;border:none}.td-btn-primary{background:var(--td-primary);color:#fff;box-shadow:0 10px 15px -3px #0e65f133}.td-btn-primary:hover{background:var(--td-primary-hover)}.td-btn-outline{background:transparent;border:1px solid var(--td-border);color:var(--td-text-main);font-size:14px}.td-btn-outline:hover{background:#f8f9fc}.td-footer{padding:12px;text-align:center;background:#f8f9fc;border-top:1px solid var(--td-border);font-size:12px;color:var(--td-text-sub)}.td-consultation-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:90vw;height:90vh;max-width:1200px;max-height:800px;background:var(--td-bg-light);border-radius:16px;box-shadow:0 25px 50px -12px #00000080;border:1px solid var(--td-border);display:flex;overflow:hidden;z-index:var(--z-index);animation:fadeIn .3s ease-out}@keyframes fadeIn{0%{opacity:0;transform:translate(-50%,-48%)}to{opacity:1;transform:translate(-50%,-50%)}}.td-video-panel{flex:1;background:#000;position:relative;display:flex;align-items:center;justify-content:center;overflow:hidden}.td-main-video{width:100%;height:100%;background-size:cover;background-position:center}.td-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(to bottom,rgba(0,0,0,.3),transparent,rgba(0,0,0,.6))}.td-video-header{position:absolute;top:16px;left:16px;right:16px;display:flex;justify-content:space-between;z-index:10}.td-badge-glass{background:#0006;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);padding:6px 12px;border-radius:20px;display:flex;align-items:center;gap:8px;color:#fff;font-size:12px;font-weight:500}.td-pip{position:absolute;top:24px;right:24px;width:160px;aspect-ratio:16/9;background:#333;border-radius:8px;border:2px solid rgba(255,255,255,.2);overflow:hidden;z-index:20;background-size:cover;background-position:center;box-shadow:0 4px 6px #0000004d}.td-pip-label{position:absolute;bottom:4px;left:4px;background:#0009;color:#fff;font-size:10px;padding:2px 6px;border-radius:4px}.td-controls{position:absolute;bottom:32px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:16px;z-index:20}.td-ctrl-btn{width:48px;height:48px;border-radius:50%;background:#fff3;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);border:none;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}.td-ctrl-btn:hover{background:#fff;color:var(--td-primary)}.td-ctrl-end{height:48px;padding:0 24px;border-radius:24px;background:var(--td-danger);color:#fff;display:flex;align-items:center;gap:8px;font-weight:600;border:none;cursor:pointer}.td-ctrl-end:hover{background:#dc2626}@media (max-width: 768px){.td-consultation-modal{width:100vw;height:100vh;border-radius:0;flex-direction:column}.td-video-panel{height:40vh}.td-chat-panel{width:100%;flex:1}}.td-overlay-wrapper{position:fixed;top:0;right:0;bottom:0;left:0;background:#0006;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:var(--z-index);display:flex;align-items:center;justify-content:center;animation:fadeInOpacity .3s ease-out}.td-modal-centered{background:var(--td-bg-light);width:90%;max-width:480px;border-radius:16px;box-shadow:0 25px 50px -12px #00000040;border:1px solid var(--td-border);display:flex;flex-direction:column;overflow:hidden;max-height:90vh;animation:scaleIn .3s cubic-bezier(.16,1,.3,1);position:relative}@keyframes fadeInOpacity{0%{opacity:0}to{opacity:1}}@keyframes scaleIn{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.td-form-container{display:flex;flex-direction:column;height:100%;padding:0 24px}.td-form-page-header{padding:24px 0 16px}.td-form-title{font-size:24px;font-weight:700;color:var(--td-text-main);margin-bottom:8px}.td-form-desc{font-size:14px;color:var(--td-text-sub);line-height:normal}.td-form{display:flex;flex-direction:column;gap:20px;padding-bottom:24px}.td-input-group{display:flex;flex-direction:column;gap:8px}.td-label{font-size:14px;font-weight:500;color:var(--td-text-main)}.td-input{width:100%;height:48px;padding:0 16px;border-radius:8px;border:1px solid var(--td-border);background:#f8f9fc;font-family:inherit;font-size:16px;color:var(--td-text-main);transition:all .2s}.td-input:focus{outline:none;border-color:var(--td-primary);box-shadow:0 0 0 2px #0e65f133}.td-textarea{width:100%;min-height:100px;padding:16px;border-radius:8px;border:1px solid var(--td-border);background:#f8f9fc;font-family:inherit;font-size:16px;color:var(--td-text-main);resize:none}.td-textarea:focus{outline:none;border-color:var(--td-primary)}.td-chips-group{display:flex;flex-wrap:wrap;gap:8px}.td-chip{padding:8px 16px;border-radius:99px;font-size:14px;font-weight:500;cursor:pointer;border:1px solid var(--td-border);background:#fff;color:var(--td-text-sub);transition:all .2s}.td-chip:hover{border-color:var(--td-primary);color:var(--td-primary);background:#0e65f10d}.td-chip.active{border-color:var(--td-primary);background:#0e65f11a;color:var(--td-primary);display:flex;align-items:center;gap:6px}.td-secure-note{display:flex;align-items:center;justify-content:center;gap:6px;font-size:12px;color:var(--td-text-sub);opacity:.8;margin-top:8px}.td-summary-container{display:flex;flex-direction:column;height:100%}.td-success-header{display:flex;flex-direction:column;align-items:center;padding:32px 24px;text-align:center}.td-success-icon{width:80px;height:80px;background:#0e65f11a;color:var(--td-primary);border-radius:50%;display:flex;align-items:center;justify-content:center;margin-bottom:16px}.td-summary-avatar{width:56px;height:56px;border-radius:50%;background-size:cover;background-position:center;flex-shrink:0}.td-summary-title{font-size:24px;font-weight:700;margin-bottom:8px}.td-summary-desc{font-size:14px;color:var(--td-text-sub);max-width:360px;margin:0 auto}.td-summary-card{margin:0 24px;padding:16px;border-radius:12px;border:1px solid var(--td-border);background:#f8f9fc;display:flex;align-items:center;gap:16px}.td-summary-details{padding:8px 24px}.td-detail-row{display:flex;justify-content:space-between;padding:12px 0;border-bottom:1px dashed var(--td-border);font-size:14px}.td-note-box{margin:16px 24px;padding:16px;background:#0e65f10d;border:1px solid rgba(14,101,241,.1);border-radius:8px}.td-note-title{font-size:14px;font-weight:700;margin-bottom:8px;display:flex;align-items:center;gap:8px}.td-grid-actions{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:12px}';
|
|
107
|
+
const styles = ':host{--td-primary: #0e65f1;--td-primary-hover: #0b50c0;--td-bg-light: #ffffff;--td-bg-dark: #1a202c;--td-text-main: #0d131c;--td-text-sub: #49699c;--td-border: #e7ecf4;--td-success: #22c55e;--td-danger: #ef4444;--font-family: "Inter", system-ui, -apple-system, sans-serif;--z-index: 9999;font-family:var(--font-family);color:var(--td-text-main)}*{box-sizing:border-box;margin:0;padding:0}.hidden{display:none!important}.material-symbols-outlined{font-family:Material Symbols Outlined;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr}.td-widget-fab{position:fixed;bottom:24px;right:24px;display:flex;align-items:center;gap:12px;z-index:var(--z-index);cursor:pointer;font-family:var(--font-family)}.td-fab-card{background:var(--td-bg-light);border:1px solid var(--td-border);border-radius:12px;box-shadow:0 8px 30px #0000001f;display:flex;align-items:center;padding:6px 16px 6px 6px;transition:transform .2s ease,box-shadow .2s ease;max-width:320px;position:relative;overflow:hidden}.td-fab-card:hover{transform:translateY(-4px);box-shadow:0 20px 40px #00000026}.td-avatar-container{width:64px;height:64px;border-radius:8px;overflow:hidden;position:relative;flex-shrink:0}.td-avatar{width:100%;height:100%;background-size:cover;background-position:center}.td-status-dot{position:absolute;bottom:4px;right:4px;width:14px;height:14px;background:var(--td-success);border:2px solid #fff;border-radius:50%}.td-info{margin-left:12px;display:flex;flex-direction:column}.td-brand{display:flex;align-items:center;gap:4px;font-size:10px;font-weight:700;text-transform:uppercase;color:var(--td-primary);letter-spacing:.05em}.td-cta{font-size:15px;font-weight:700;color:var(--td-text-main);margin-top:2px}.td-sub{font-size:12px;color:var(--td-text-sub);margin-top:2px}.td-close-fab{position:absolute;top:4px;right:4px;opacity:0;cursor:pointer;background:none;border:none;color:#94a3b8;transition:opacity .2s;padding:4px}.td-fab-card:hover .td-close-fab{opacity:1}.td-widget-expanded{position:fixed;bottom:100px;right:24px;width:380px;max-height:80vh;background:var(--td-bg-light);border-radius:12px;box-shadow:0 25px 50px -12px #00000040;border:1px solid var(--td-border);display:flex;flex-direction:column;overflow:hidden;z-index:var(--z-index);animation:slideUp .3s cubic-bezier(.16,1,.3,1)}@keyframes slideUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.td-header{display:flex;align-items:center;justify-content:space-between;padding:16px;border-bottom:1px solid var(--td-border)}.td-header-title{display:flex;align-items:center;gap:12px;font-weight:700;font-size:18px}.td-icon-box{width:32px;height:32px;background:#0e65f11a;color:var(--td-primary);border-radius:8px;display:flex;align-items:center;justify-content:center}.td-close-btn{background:transparent;border:none;cursor:pointer;color:#64748b;padding:4px;border-radius:50%;display:flex;align-items:center;justify-content:center}.td-close-btn:hover{background:#f1f5f9}.td-content{flex:1;overflow-y:auto;padding:0}.td-doctor-profile{display:flex;flex-direction:column;align-items:center;padding:32px 24px 24px}.td-online-badge{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;background:#f0fdf4;border:1px solid #dcfce7;border-radius:999px}.td-pulse{width:8px;height:8px;background:var(--td-success);border-radius:50%}.td-badge-text{font-size:12px;font-weight:600;color:#15803d;text-transform:uppercase}.td-online-badge.td-offline{background:#f3f4f6;border-color:#e5e7eb}.td-online-badge.td-offline .td-badge-text{color:#6b7280}.td-online-badge.td-offline .td-pulse{background:#9ca3af;animation:none}.td-trust-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;padding:0 24px 24px}.td-trust-item{background:#f8f9fc;border:1px solid var(--td-border);border-radius:12px;padding:12px;text-align:center;display:flex;flex-direction:column;align-items:center;gap:8px}.td-trust-title{font-size:12px;font-weight:700}.td-actions{padding:0 24px 24px;display:flex;flex-direction:column;gap:12px}.td-btn{width:100%;height:48px;border-radius:8px;font-size:16px;font-weight:700;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;border:none}.td-btn-primary{background:var(--td-primary);color:#fff;box-shadow:0 10px 15px -3px #0e65f133}.td-btn-primary:hover{background:var(--td-primary-hover)}.td-btn-outline{background:transparent;border:1px solid var(--td-border);color:var(--td-text-main);font-size:14px}.td-btn-outline:hover{background:#f8f9fc}.td-footer{padding:12px;text-align:center;background:#f8f9fc;border-top:1px solid var(--td-border);font-size:12px;color:var(--td-text-sub)}.td-consultation-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:90vw;height:90vh;max-width:1200px;max-height:800px;background:var(--td-bg-light);border-radius:16px;box-shadow:0 25px 50px -12px #00000080;border:1px solid var(--td-border);display:flex;overflow:hidden;z-index:var(--z-index);animation:fadeIn .3s ease-out}@keyframes fadeIn{0%{opacity:0;transform:translate(-50%,-48%)}to{opacity:1;transform:translate(-50%,-50%)}}.td-video-panel{flex:1;background:#000;position:relative;display:flex;align-items:center;justify-content:center;overflow:hidden}.td-main-video{width:100%;height:100%;background-size:cover;background-position:center}.td-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(to bottom,rgba(0,0,0,.3),transparent,rgba(0,0,0,.6))}.td-video-header{position:absolute;top:16px;left:16px;right:16px;display:flex;justify-content:space-between;z-index:10}.td-badge-glass{background:#0006;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);padding:6px 12px;border-radius:20px;display:flex;align-items:center;gap:8px;color:#fff;font-size:12px;font-weight:500}.td-pip{position:absolute;top:24px;right:24px;width:160px;aspect-ratio:16/9;background:#333;border-radius:8px;border:2px solid rgba(255,255,255,.2);overflow:hidden;z-index:20;background-size:cover;background-position:center;box-shadow:0 4px 6px #0000004d}.td-pip-label{position:absolute;bottom:4px;left:4px;background:#0009;color:#fff;font-size:10px;padding:2px 6px;border-radius:4px}.td-controls{position:absolute;bottom:32px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:16px;z-index:20}.td-ctrl-btn{width:48px;height:48px;border-radius:50%;background:#fff3;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);border:none;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}.td-ctrl-btn:hover{background:#fff;color:var(--td-primary)}.td-ctrl-end{height:48px;padding:0 24px;border-radius:24px;background:var(--td-danger);color:#fff;display:flex;align-items:center;gap:8px;font-weight:600;border:none;cursor:pointer}.td-ctrl-end:hover{background:#dc2626}.td-call-status-badge{height:48px;padding:0 24px;border-radius:24px;background:#0009;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);color:#fff;display:flex;align-items:center;gap:12px;font-size:14px;font-weight:500;border:1px solid rgba(255,255,255,.1);white-space:nowrap}.td-status-pulse{width:8px;height:8px;background:#fbbf24;border-radius:50%;animation:pulse-ring 2s infinite}.td-status-connecting .td-status-pulse{background:#3b82f6}.td-status-left .td-status-pulse{background:#9ca3af;animation:none}@keyframes pulse-ring{0%{box-shadow:0 0 #fbbf24b3}70%{box-shadow:0 0 0 6px #fbbf2400}to{box-shadow:0 0 #fbbf2400}}@media (max-width: 768px){.td-consultation-modal{width:100vw;height:100vh;border-radius:0;flex-direction:column}.td-video-panel{height:40vh}.td-chat-panel{width:100%;flex:1}}.td-overlay-wrapper{position:fixed;top:0;right:0;bottom:0;left:0;background:#0006;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:var(--z-index);display:flex;align-items:center;justify-content:center;animation:fadeInOpacity .3s ease-out}.td-modal-centered{background:var(--td-bg-light);width:90%;max-width:480px;border-radius:16px;box-shadow:0 25px 50px -12px #00000040;border:1px solid var(--td-border);display:flex;flex-direction:column;overflow:hidden;max-height:90vh;animation:scaleIn .3s cubic-bezier(.16,1,.3,1);position:relative}@keyframes fadeInOpacity{0%{opacity:0}to{opacity:1}}@keyframes scaleIn{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.td-form-container{display:flex;flex-direction:column;height:100%;padding:0 24px}.td-form-page-header{padding:24px 0 16px}.td-form-title{font-size:24px;font-weight:700;color:var(--td-text-main);margin-bottom:8px}.td-form-desc{font-size:14px;color:var(--td-text-sub);line-height:normal}.td-form{display:flex;flex-direction:column;gap:20px;padding-bottom:24px}.td-input-group{display:flex;flex-direction:column;gap:8px}.td-label{font-size:14px;font-weight:500;color:var(--td-text-main)}.td-input{width:100%;height:48px;padding:0 16px;border-radius:8px;border:1px solid var(--td-border);background:#f8f9fc;font-family:inherit;font-size:16px;color:var(--td-text-main);transition:all .2s}.td-input:focus{outline:none;border-color:var(--td-primary);box-shadow:0 0 0 2px #0e65f133}.td-textarea{width:100%;min-height:100px;padding:16px;border-radius:8px;border:1px solid var(--td-border);background:#f8f9fc;font-family:inherit;font-size:16px;color:var(--td-text-main);resize:none}.td-textarea:focus{outline:none;border-color:var(--td-primary)}.td-chips-group{display:flex;flex-wrap:wrap;gap:8px}.td-chip{padding:8px 16px;border-radius:99px;font-size:14px;font-weight:500;cursor:pointer;border:1px solid var(--td-border);background:#fff;color:var(--td-text-sub);transition:all .2s}.td-chip:hover{border-color:var(--td-primary);color:var(--td-primary);background:#0e65f10d}.td-chip.active{border-color:var(--td-primary);background:#0e65f11a;color:var(--td-primary);display:flex;align-items:center;gap:6px}.td-secure-note{display:flex;align-items:center;justify-content:center;gap:6px;font-size:12px;color:var(--td-text-sub);opacity:.8;margin-top:8px}.td-summary-container{display:flex;flex-direction:column;height:100%}.td-success-header{display:flex;flex-direction:column;align-items:center;padding:32px 24px;text-align:center}.td-success-icon{width:80px;height:80px;background:#0e65f11a;color:var(--td-primary);border-radius:50%;display:flex;align-items:center;justify-content:center;margin-bottom:16px}.td-summary-avatar{width:56px;height:56px;border-radius:50%;background-size:cover;background-position:center;flex-shrink:0}.td-summary-title{font-size:24px;font-weight:700;margin-bottom:8px}.td-summary-desc{font-size:14px;color:var(--td-text-sub);max-width:360px;margin:0 auto}.td-summary-card{margin:0 24px;padding:16px;border-radius:12px;border:1px solid var(--td-border);background:#f8f9fc;display:flex;align-items:center;gap:16px}.td-summary-details{padding:8px 24px}.td-detail-row{display:flex;justify-content:space-between;padding:12px 0;border-bottom:1px dashed var(--td-border);font-size:14px}.td-note-box{margin:16px 24px;padding:16px;background:#0e65f10d;border:1px solid rgba(14,101,241,.1);border-radius:8px}.td-note-title{font-size:14px;font-weight:700;margin-bottom:8px;display:flex;align-items:center;gap:8px}.td-grid-actions{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:12px}';
|
|
108
108
|
const collapsedHtml = `<div class="td-widget-fab" id="td-widget-fab">\r
|
|
109
109
|
<div class="td-fab-card">\r
|
|
110
110
|
<button class="td-close-fab" id="td-fab-close">\r
|
|
@@ -221,6 +221,12 @@ const consultationHtml = `<div class="td-consultation-modal">\r
|
|
|
221
221
|
<span class="material-symbols-outlined">call_end</span>\r
|
|
222
222
|
Kết thúc\r
|
|
223
223
|
</button>\r
|
|
224
|
+
\r
|
|
225
|
+
<!-- Dynamic Status Badge (Replaces End Button when waiting) -->\r
|
|
226
|
+
<div class="td-call-status-badge" id="td-call-status-badge" style="display: none;">\r
|
|
227
|
+
<span class="td-status-pulse"></span>\r
|
|
228
|
+
<span class="td-status-text">Đang chờ bác sĩ...</span>\r
|
|
229
|
+
</div>\r
|
|
224
230
|
</div>\r
|
|
225
231
|
</div>\r
|
|
226
232
|
\r
|
|
@@ -447,6 +453,32 @@ const render = (template, data) => {
|
|
|
447
453
|
output = output.replace(/{{containerStyle}}/g, containerStyle);
|
|
448
454
|
output = output.replace(/{{rowStyle}}/g, rowStyle);
|
|
449
455
|
output = output.replace(/{{footerStyle}}/g, footerStyle);
|
|
456
|
+
const callStatus = data.callStatus || "WAITING";
|
|
457
|
+
let consultEndBtnStyle = "display: none;";
|
|
458
|
+
let consultBadgeStyle = "display: flex;";
|
|
459
|
+
let consultBadgeText = "Đang chờ bác sĩ...";
|
|
460
|
+
let consultBadgeClass = "";
|
|
461
|
+
switch (callStatus) {
|
|
462
|
+
case "CONNECTED":
|
|
463
|
+
consultEndBtnStyle = "display: flex;";
|
|
464
|
+
consultBadgeStyle = "display: none;";
|
|
465
|
+
break;
|
|
466
|
+
case "CONNECTING":
|
|
467
|
+
consultBadgeText = "Bác sĩ chuẩn bị vào phòng...";
|
|
468
|
+
consultBadgeClass = "td-status-connecting";
|
|
469
|
+
break;
|
|
470
|
+
case "DOCTOR_LEFT":
|
|
471
|
+
consultBadgeText = "Bác sĩ đã rời phòng";
|
|
472
|
+
consultBadgeClass = "td-status-left";
|
|
473
|
+
break;
|
|
474
|
+
case "WAITING":
|
|
475
|
+
default:
|
|
476
|
+
consultBadgeText = "Đang chờ bác sĩ...";
|
|
477
|
+
break;
|
|
478
|
+
}
|
|
479
|
+
output = output.replace('id="td-call-status-badge" style="display: none;"', `id="td-call-status-badge" style="${consultBadgeStyle}" class="td-call-status-badge ${consultBadgeClass}"`);
|
|
480
|
+
output = output.replace(">Đang chờ bác sĩ...<", `>${consultBadgeText}<`);
|
|
481
|
+
output = output.replace('id="td-consult-end"', `id="td-consult-end" style="${consultEndBtnStyle}"`);
|
|
450
482
|
return output;
|
|
451
483
|
};
|
|
452
484
|
const getCollapsedHtml = (data) => render(collapsedHtml, data);
|
|
@@ -28096,16 +28128,35 @@ class LiveKitService {
|
|
|
28096
28128
|
});
|
|
28097
28129
|
});
|
|
28098
28130
|
}
|
|
28131
|
+
setCallbacks(callbacks) {
|
|
28132
|
+
this.callbacks = callbacks;
|
|
28133
|
+
}
|
|
28099
28134
|
bindEvents() {
|
|
28100
28135
|
if (!this.room) return;
|
|
28101
28136
|
this.room.on(RoomEvent.SignalConnected, () => {
|
|
28102
28137
|
console.log("[LiveKit] Signal connected");
|
|
28138
|
+
}).on(RoomEvent.ParticipantConnected, (participant) => {
|
|
28139
|
+
var _a;
|
|
28140
|
+
console.log("[LiveKit] Participant Connected:", participant.identity);
|
|
28141
|
+
if ((_a = this.callbacks) == null ? void 0 : _a.onParticipantConnected) {
|
|
28142
|
+
this.callbacks.onParticipantConnected(participant);
|
|
28143
|
+
}
|
|
28144
|
+
}).on(RoomEvent.ParticipantDisconnected, (participant) => {
|
|
28145
|
+
var _a;
|
|
28146
|
+
console.log("[LiveKit] Participant Disconnected:", participant.identity);
|
|
28147
|
+
if ((_a = this.callbacks) == null ? void 0 : _a.onParticipantDisconnected) {
|
|
28148
|
+
this.callbacks.onParticipantDisconnected(participant);
|
|
28149
|
+
}
|
|
28103
28150
|
}).on(RoomEvent.TrackSubscribed, (track, publication, participant) => {
|
|
28104
28151
|
this.handleTrackSubscribed(track, participant);
|
|
28105
28152
|
}).on(RoomEvent.TrackUnsubscribed, (track, publication, participant) => {
|
|
28106
28153
|
this.handleTrackUnsubscribed(track, participant);
|
|
28107
28154
|
}).on(RoomEvent.Disconnected, () => {
|
|
28155
|
+
var _a;
|
|
28108
28156
|
console.log("[LiveKit] Disconnected");
|
|
28157
|
+
if ((_a = this.callbacks) == null ? void 0 : _a.onDisconnected) {
|
|
28158
|
+
this.callbacks.onDisconnected();
|
|
28159
|
+
}
|
|
28109
28160
|
}).on(RoomEvent.MediaDevicesError, (e2) => {
|
|
28110
28161
|
console.error("[LiveKit] Media Device Error:", e2);
|
|
28111
28162
|
});
|
|
@@ -28164,15 +28215,22 @@ class LiveKitService {
|
|
|
28164
28215
|
const remoteContainer = this.wrapper.querySelector(".td-main-video");
|
|
28165
28216
|
console.log("[LiveKit] Remote Container found:", remoteContainer, "Is Connected:", remoteContainer == null ? void 0 : remoteContainer.isConnected);
|
|
28166
28217
|
if (remoteContainer) {
|
|
28167
|
-
|
|
28168
|
-
|
|
28169
|
-
remoteContainer.style.backgroundImage = "none";
|
|
28218
|
+
const oldVideos = remoteContainer.querySelectorAll(".td-livekit-video");
|
|
28219
|
+
oldVideos.forEach((v) => v.remove());
|
|
28170
28220
|
const videoEl = track.attach();
|
|
28221
|
+
videoEl.classList.add("td-livekit-video");
|
|
28171
28222
|
videoEl.style.width = "100%";
|
|
28172
28223
|
videoEl.style.height = "100%";
|
|
28173
28224
|
videoEl.style.objectFit = "cover";
|
|
28225
|
+
videoEl.style.position = "absolute";
|
|
28226
|
+
videoEl.style.top = "0";
|
|
28227
|
+
videoEl.style.left = "0";
|
|
28228
|
+
videoEl.style.zIndex = "1";
|
|
28229
|
+
videoEl.style.opacity = "0";
|
|
28230
|
+
videoEl.style.transition = "opacity 0.5s ease-in-out";
|
|
28231
|
+
videoEl.id = "td-remote-video";
|
|
28174
28232
|
remoteContainer.appendChild(videoEl);
|
|
28175
|
-
console.log("[LiveKit] Remote video attached");
|
|
28233
|
+
console.log("[LiveKit] Remote video attached (hidden initially)");
|
|
28176
28234
|
} else {
|
|
28177
28235
|
console.warn("[LiveKit] Remote container not found!");
|
|
28178
28236
|
}
|
|
@@ -28337,6 +28395,9 @@ class ClinicWidget {
|
|
|
28337
28395
|
}
|
|
28338
28396
|
}
|
|
28339
28397
|
}
|
|
28398
|
+
if (current.status === WidgetStates.CONSULTATION && prev.callStatus !== current.callStatus) {
|
|
28399
|
+
this.updateConsultationUI(current);
|
|
28400
|
+
}
|
|
28340
28401
|
}
|
|
28341
28402
|
render(status, stateOverride = null) {
|
|
28342
28403
|
const existingContent = this.shadowRoot.querySelector(".td-widget-content");
|
|
@@ -28749,8 +28810,84 @@ class ClinicWidget {
|
|
|
28749
28810
|
});
|
|
28750
28811
|
}
|
|
28751
28812
|
}
|
|
28813
|
+
updateConsultationUI(state) {
|
|
28814
|
+
const badge = this.shadowRoot.getElementById("td-call-status-badge");
|
|
28815
|
+
const endBtn = this.shadowRoot.getElementById("td-consult-end");
|
|
28816
|
+
if (!badge || !endBtn) return;
|
|
28817
|
+
const callStatus = state.callStatus || "WAITING";
|
|
28818
|
+
let badgeText = "";
|
|
28819
|
+
let badgeClass = "";
|
|
28820
|
+
let showBadge = true;
|
|
28821
|
+
let showBtn = false;
|
|
28822
|
+
const remoteVideo = this.shadowRoot.getElementById("td-remote-video");
|
|
28823
|
+
const introContainer = this.shadowRoot.getElementById("td-video-container");
|
|
28824
|
+
switch (callStatus) {
|
|
28825
|
+
case "CONNECTED":
|
|
28826
|
+
showBtn = true;
|
|
28827
|
+
showBadge = false;
|
|
28828
|
+
if (remoteVideo) {
|
|
28829
|
+
remoteVideo.style.opacity = "1";
|
|
28830
|
+
}
|
|
28831
|
+
if (introContainer) {
|
|
28832
|
+
console.log("[Widget] Removing Intro Video container...");
|
|
28833
|
+
introContainer.style.transition = "opacity 0.5s";
|
|
28834
|
+
introContainer.style.opacity = "0";
|
|
28835
|
+
setTimeout(() => {
|
|
28836
|
+
introContainer.remove();
|
|
28837
|
+
}, 500);
|
|
28838
|
+
}
|
|
28839
|
+
break;
|
|
28840
|
+
case "CONNECTING":
|
|
28841
|
+
badgeText = "Bác sĩ chuẩn bị vào phòng...";
|
|
28842
|
+
badgeClass = "td-status-connecting";
|
|
28843
|
+
break;
|
|
28844
|
+
case "DOCTOR_LEFT":
|
|
28845
|
+
badgeText = "Bác sĩ đã rời phòng";
|
|
28846
|
+
badgeClass = "td-status-left";
|
|
28847
|
+
showBtn = true;
|
|
28848
|
+
break;
|
|
28849
|
+
case "WAITING":
|
|
28850
|
+
default:
|
|
28851
|
+
badgeText = "Đang chờ bác sĩ...";
|
|
28852
|
+
break;
|
|
28853
|
+
}
|
|
28854
|
+
if (showBadge) {
|
|
28855
|
+
badge.style.display = "flex";
|
|
28856
|
+
const textSpan = badge.querySelector(".td-status-text");
|
|
28857
|
+
if (textSpan) textSpan.textContent = badgeText;
|
|
28858
|
+
badge.classList.remove("td-status-connecting", "td-status-left");
|
|
28859
|
+
if (badgeClass) {
|
|
28860
|
+
badge.classList.add(badgeClass);
|
|
28861
|
+
}
|
|
28862
|
+
} else {
|
|
28863
|
+
badge.style.display = "none";
|
|
28864
|
+
}
|
|
28865
|
+
endBtn.style.display = showBtn ? "flex" : "none";
|
|
28866
|
+
}
|
|
28752
28867
|
joinVideoCall() {
|
|
28753
28868
|
var _a;
|
|
28869
|
+
console.log("[Widget] Joining Video Call...");
|
|
28870
|
+
store.setState({ callStatus: "WAITING" });
|
|
28871
|
+
if (!this.livekit) {
|
|
28872
|
+
this.livekit = new LiveKitService();
|
|
28873
|
+
}
|
|
28874
|
+
this.livekit.setCallbacks({
|
|
28875
|
+
onParticipantConnected: (participant) => {
|
|
28876
|
+
console.log("[Widget] Participant connected:", participant);
|
|
28877
|
+
if (store.getState().callStatus === "CONNECTED") return;
|
|
28878
|
+
store.setState({ callStatus: "CONNECTING" });
|
|
28879
|
+
setTimeout(() => {
|
|
28880
|
+
store.setState({ callStatus: "CONNECTED" });
|
|
28881
|
+
}, 3e3);
|
|
28882
|
+
},
|
|
28883
|
+
onParticipantDisconnected: (participant) => {
|
|
28884
|
+
console.log("[Widget] Participant disconnected:", participant);
|
|
28885
|
+
store.setState({ callStatus: "DOCTOR_LEFT" });
|
|
28886
|
+
},
|
|
28887
|
+
onDisconnected: () => {
|
|
28888
|
+
store.setState({ status: WidgetStates.COMPLETED });
|
|
28889
|
+
}
|
|
28890
|
+
});
|
|
28754
28891
|
const state = store.getState();
|
|
28755
28892
|
const { user, doctor } = state;
|
|
28756
28893
|
const userId = "guest_6rakxwiai";
|