@zjw-jszn/shared-imsdk 1.0.9 → 1.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -0
- package/dist/api/index.d.ts +6 -0
- package/dist/config/index.d.ts +44 -0
- package/dist/shared-imsdk.css +148 -120
- package/dist/shared-imsdk.es.js +369 -77
- package/dist/shared-imsdk.umd.cjs +369 -77
- package/dist/types/index.d.ts +21 -0
- package/dist/utils/websocket.d.ts +10 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const __SHARED_IMSDK_CSS__ = ".confirm-dialog-mask[data-v-69eaf313] {\n position: fixed;\n z-index: 12000;\n inset: 0;\n\n background: rgba(15, 23, 42, 0.35);\n backdrop-filter: blur(2px);\n}\n.confirm-dialog[data-v-69eaf313] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n width: min(420px, calc(100vw - 32px));\n border: 1px solid #e8edf4;\n border-radius: 12px;\n\n background: #fff;\n box-shadow: 0 18px 48px rgba(15, 23, 42, 0.22);\n}\n.confirm-dialog-header[data-v-69eaf313] {\n padding: 16px 18px 8px;\n}\n.confirm-dialog-title[data-v-69eaf313] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #1f2937;\n}\n.confirm-dialog-body[data-v-69eaf313] {\n padding: 0 18px 10px;\n}\n.confirm-dialog-message[data-v-69eaf313] {\n margin: 0;\n font-size: 14px;\n line-height: 1.55;\n color: #4b5563;\n}\n.confirm-dialog-error[data-v-69eaf313] {\n margin: 10px 0 0;\n font-size: 13px;\n line-height: 1.45;\n color: #cf1322;\n}\n.confirm-dialog-footer[data-v-69eaf313] {\n display: flex;\n gap: 10px;\n justify-content: flex-end;\n padding: 14px 18px 18px;\n}\n.dialog-btn[data-v-69eaf313] {\n cursor: pointer;\n\n min-width: 80px;\n height: 34px;\n padding: 0 14px;\n border: 1px solid transparent;\n border-radius: 8px;\n\n font-size: 14px;\n\n transition: all 0.2s ease;\n}\n.dialog-btn[data-v-69eaf313]:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n.cancel-btn[data-v-69eaf313] {\n border-color: #d9d9d9;\n color: #595959;\n background: #fff;\n}\n.cancel-btn[data-v-69eaf313]:hover:not(:disabled) {\n border-color: #bfbfbf;\n color: #262626;\n background: #fafafa;\n}\n.confirm-btn[data-v-69eaf313] {\n border-color: #0e77cc;\n color: #fff;\n background: linear-gradient(135deg, #0e77cc 0%, #0d6db8 100%);\n}\n.confirm-btn[data-v-69eaf313]:hover:not(:disabled) {\n border-color: #0d6db8;\n filter: brightness(1.03);\n}\n.v3-body-inner{scroll-behavior:smooth;scrollbar-color:#393d3f rgba(0,0,0,.1);scrollbar-width:thin}.v3-body-inner::-webkit-scrollbar{width:8px}.v3-body-inner::-webkit-scrollbar-track{background-color:transparent}.v3-body-inner::-webkit-scrollbar-thumb{display:none;background:rgba(0,0,0,.3);border-radius:5px}.v3-body-inner:hover::-webkit-scrollbar-thumb{display:block}.v3-emoji-picker{height:320px;width:280px;box-shadow:0 2px 10px #0003;border-radius:10px;margin:0 auto;box-sizing:border-box;display:flex;flex-direction:column;text-align:left}.v3-emoji-picker *{box-sizing:border-box}.v3-emoji-picker .v3-header{padding:15px 15px 13px;border-bottom:1px solid}.v3-emoji-picker .v3-header .v3-groups{display:flex}.v3-emoji-picker .v3-header .v3-groups .v3-group{flex-grow:1;padding:0;margin:0;border:none;background:none;font-size:23px;cursor:pointer;position:relative;display:block;opacity:.7;transition:.2s}.v3-emoji-picker .v3-header .v3-groups .v3-group.v3-is-hidden{display:none}.v3-emoji-picker .v3-header .v3-groups .v3-group:first-child,.v3-emoji-picker .v3-header .v3-groups .v3-group:last-child{flex-grow:0}.v3-emoji-picker .v3-header .v3-groups .v3-group:hover{opacity:1}.v3-emoji-picker .v3-header .v3-groups .v3-group span{display:flex;align-items:center;justify-content:center}.v3-emoji-picker .v3-header .v3-groups .v3-group span img{display:block;width:1em;height:auto}.v3-emoji-picker .v3-spacing{height:11px}.v3-emoji-picker .v3-search input{width:100%;display:block;height:26px;padding:0 10px;border:1px solid;border-radius:3px;font-size:12px;transition:.2s}.v3-emoji-picker .v3-search input:focus{outline:none}.v3-emoji-picker .v3-body{padding:0 0 15px 11px;min-height:0;flex-grow:1}.v3-emoji-picker .v3-body .v3-body-inner{flex-grow:1;min-height:0;overflow-y:auto;overflow-x:hidden;height:100%;padding-right:11px}.v3-emoji-picker .v3-body .v3-body-inner .v3-group h5{margin:0;top:0;padding:7px 0 3px 4px;z-index:2}.v3-emoji-picker .v3-body .v3-body-inner .v3-group h5.v3-sticky{position:sticky}.v3-emoji-picker .v3-body .v3-body-inner .v3-group .v3-emojis{display:flex;font-size:18px;flex-wrap:wrap}.v3-emoji-picker .v3-body .v3-body-inner .v3-group .v3-emojis button{cursor:pointer;border:none;background:none;margin:0;text-align:center;display:flex;align-items:center;justify-content:center;flex-basis:12.5%;max-width:12.5%;flex-grow:1;padding:0;font-size:22px;position:relative}.v3-emoji-picker .v3-body .v3-body-inner .v3-group .v3-emojis button:after{content:\"\";width:100%;padding-bottom:100%}.v3-emoji-picker .v3-body .v3-body-inner .v3-group .v3-emojis button span{display:flex;align-items:center;justify-content:center}.v3-emoji-picker .v3-body .v3-body-inner .v3-group .v3-emojis button img{max-width:100%;padding:4px}.v3-emoji-picker .v3-body .v3-body-inner .v3-group .v3-emojis button span,.v3-emoji-picker .v3-body .v3-body-inner .v3-group .v3-emojis button img{position:absolute;top:0;left:0;width:100%;height:100%}.v3-emoji-picker .v3-body .v3-body-inner.is-mac .v3-emojis button{font-family:\"Apple Color Emoji\"}.v3-emoji-picker .v3-footer{font-size:14px;border-top:1px solid #dddddd;padding:15px;display:flex;align-items:center;justify-content:space-between;position:relative}.v3-emoji-picker .v3-footer .v3-tone,.v3-emoji-picker .v3-footer .v3-foot-left{display:flex;align-items:center}.v3-emoji-picker .v3-footer .v3-tone img,.v3-emoji-picker .v3-footer .v3-foot-left img{width:20px;display:block}.v3-emoji-picker .v3-footer .v3-tone>span:first-child,.v3-emoji-picker .v3-footer .v3-foot-left>span:first-child{margin-right:6px}.v3-emoji-picker .v3-footer .v3-foot-left>span.v3-text{max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.v3-emoji-picker .v3-footer .v3-tone{border:none;padding:0;background:none;cursor:pointer;display:inline-flex;align-items:center}.v3-emoji-picker .v3-footer .v3-tone>span{display:inline-flex;vertical-align:top}.v3-emoji-picker .v3-footer .v3-tone .v3-text{font-size:13px}.v3-emoji-picker .v3-footer .v3-tone .v3-icon{display:inline-flex;height:15px;width:15px;vertical-align:middle;align-self:center;border:2px solid rgba(0,0,0,.2)}.v3-emoji-picker .v3-footer .v3-tone .v3-icon.v3-tone-neutral{background-color:#ffd225}.v3-emoji-picker .v3-footer .v3-tone .v3-icon.v3-tone-1f3fb{background-color:#ffdfbd}.v3-emoji-picker .v3-footer .v3-tone .v3-icon.v3-tone-1f3fc{background-color:#e9c197}.v3-emoji-picker .v3-footer .v3-tone .v3-icon.v3-tone-1f3fd{background-color:#c88e62}.v3-emoji-picker .v3-footer .v3-tone .v3-icon.v3-tone-1f3fe{background-color:#a86637}.v3-emoji-picker .v3-footer .v3-tone .v3-icon.v3-tone-1f3ff{background-color:#60463a}.v3-emoji-picker .v3-footer .v3-tone .is-mac span{font-family:\"Apple Color Emoji\"}.v3-skin-tones{position:absolute;height:100%;width:60%;top:0;left:0;display:flex;align-items:center;justify-content:flex-end;padding:0 15px;opacity:0;visibility:hidden;transition:.2s;border-radius:0 0 10px 10px}.v3-skin-tones.v3-is-open{opacity:1;visibility:visible}.v3-skin-tones .v3-skin-tone{display:inline-block;height:15px;width:25px;border:none;padding:0;cursor:pointer;transition:0ms}.v3-skin-tones .v3-skin-tone:hover{transform:scale(1.1);transition:.2s}.v3-skin-tones .v3-skin-tone-neutral{color:#ffd225;background-color:#ffd225}.v3-skin-tones .v3-skin-tone-1f3fb{color:#ffdfbd;background-color:#ffdfbd}.v3-skin-tones .v3-skin-tone-1f3fc{color:#e9c197;background-color:#e9c197}.v3-skin-tones .v3-skin-tone-1f3fd{color:#c88e62;background-color:#c88e62}.v3-skin-tones .v3-skin-tone-1f3fe{color:#a86637;background-color:#a86637}.v3-skin-tones .v3-skin-tone-1f3ff{color:#60463a;background-color:#60463a}.v3-input-emoji-picker *{box-sizing:border-box}.v3-input-emoji-picker .v3-input-picker-root{position:relative}.v3-input-emoji-picker .v3-input-picker-root .v3-emoji-picker-input,.v3-input-emoji-picker .v3-input-picker-root .v3-emoji-picker-textarea{width:100%;height:40px;border:1px solid #999;padding-left:15px}.v3-input-emoji-picker .v3-input-picker-root .v3-emoji-picker-textarea{min-height:80px;resize:vertical}.v3-input-emoji-picker .v3-input-picker-root .v3-emoji-picker-textarea+.v3-input-picker-wrap .v3-input-picker-icon{top:auto;bottom:5px}.v3-input-emoji-picker .v3-input-picker-root .v3-input-picker-wrap .v3-input-picker-icon{display:inline-flex;position:absolute;right:5px;top:50%;transform:translateY(-50%);font-size:24px;border:none;background:none;padding:0 5px;cursor:pointer}.v3-input-emoji-picker .v3-input-picker-root .v3-input-picker-wrap .v3-input-picker-icon img{display:block;width:1em;height:1em}.v3-input-emoji-picker .v3-input-picker-root .v3-input-picker-wrap .v3-emoji-picker{opacity:0;visibility:hidden;transition:.2s}.v3-input-emoji-picker .v3-input-picker-root .v3-input-picker-wrap.v3-picker-is-open .v3-emoji-picker{opacity:1;visibility:visible;z-index:999}.v3-emoji-picker{--v3-picker-bg: #ffffff;--v3-picker-fg: #000000;--v3-picker-border: #dddddd;--v3-picker-input-bg: var(--v3-picker-bg);--v3-picker-input-border: #cccccc;--v3-picker-input-focus-border: #000000;--v3-group-image-filter: none;--v3-picker-emoji-hover: #f7f7f7;background:var(--v3-picker-bg);color:var(--v3-picker-fg)}.v3-emoji-picker .v3-footer,.v3-emoji-picker .v3-header{border-color:var(--v3-picker-border)}.v3-emoji-picker .v3-groups{filter:var(--v3-group-image-filter)}.v3-emoji-picker .v3-tone{color:var(--v3-picker-fg)}.v3-emoji-picker .v3-search input{background:var(--v3-picker-input-bg);border-color:var(--v3-picker-input-border);color:inherit}.v3-emoji-picker .v3-search input:focus{border-color:var(--v3-picker-input-focus-border)}.v3-emoji-picker .v3-body .v3-body-inner .v3-group h5,.v3-emoji-picker .v3-skin-tones{background:var(--v3-picker-bg)}.v3-emoji-picker .v3-body .v3-body-inner .v3-group .v3-emojis button:hover{background:var(--v3-picker-emoji-hover, #f7f7f7)}@media (prefers-color-scheme: dark){.v3-emoji-picker.v3-color-theme-auto{--v3-picker-bg: #000000;--v3-picker-fg: #ffffff;--v3-picker-border: #333333;--v3-picker-input-bg: #222222;--v3-picker-input-border: #444444;--v3-picker-input-focus-border: #555555;--v3-group-image-filter: invert(1);--v3-picker-emoji-hover: #222222}}.v3-emoji-picker.v3-color-theme-dark{--v3-picker-bg: #000000;--v3-picker-fg: #ffffff;--v3-picker-border: #333333;--v3-picker-input-bg: #222222;--v3-picker-input-border: #444444;--v3-picker-input-focus-border: #555555;--v3-group-image-filter: invert(1);--v3-picker-emoji-hover: #222222}\n\n.chat-room[data-v-cc3cfaa7] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: #fff;\n}\n.chat-room-header[data-v-cc3cfaa7] {\n display: flex;\n gap: 12px;\n align-items: center;\n\n padding: 8px 20px;\n border-bottom: 1px solid #e8e8e8;\n\n background: linear-gradient(180deg, #fff 0%, #fafafa 100%);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n}\n.back-btn[data-v-cc3cfaa7] {\n cursor: pointer;\n\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n\n width: 36px;\n height: 36px;\n border: none;\n border-radius: 50%;\n\n font-size: 16px;\n color: #595959;\n\n background: #f0f0f0;\n\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.back-btn[data-v-cc3cfaa7]:hover {\n transform: scale(1.05);\n color: #0e77cc;\n background: #e8e8e8;\n}\n.back-btn[data-v-cc3cfaa7]:active {\n transform: scale(0.95);\n}\n.title[data-v-cc3cfaa7] {\n display: flex;\n flex: 1;\n gap: 12px;\n align-items: center;\n}\n.header-actions[data-v-cc3cfaa7] {\n display: flex;\n flex-shrink: 0;\n align-items: flex-end;\n}\n.end-session-btn[data-v-cc3cfaa7] {\n cursor: pointer;\n\n min-width: 90px;\n height: 32px;\n padding: 0 12px;\n border: 1px solid #ffd6d6;\n border-radius: 16px;\n\n font-size: 13px;\n font-weight: 500;\n color: #d4380d;\n\n background: #fff2f0;\n\n transition: all 0.2s ease;\n}\n.end-session-btn[data-v-cc3cfaa7]:hover:not(:disabled) {\n border-color: #ffb3ad;\n background: #ffe7e2;\n}\n.end-session-btn[data-v-cc3cfaa7]:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n.avatar-wrapper[data-v-cc3cfaa7] {\n position: relative;\n flex-shrink: 0;\n width: 42px;\n height: 42px;\n}\n.avatar-img[data-v-cc3cfaa7] {\n width: 100%;\n height: 100%;\n border: 2px solid white;\n border-radius: 50%;\n\n object-fit: cover;\n background: linear-gradient(135deg, #f0f0f0 0%, #e8e8e8 100%);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n.avatar-text[data-v-cc3cfaa7] {\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 42px;\n height: 42px;\n border: 2px solid white;\n border-radius: 50%;\n\n font-size: 16px;\n font-weight: 600;\n color: white;\n\n background: linear-gradient(135deg, #0e77cc 0%, #0d6db8 100%);\n box-shadow: 0 2px 8px rgba(14, 119, 204, 0.3);\n}\n.user-info[data-v-cc3cfaa7] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n.name[data-v-cc3cfaa7] {\n font-size: 15px;\n font-weight: 600;\n color: #262626;\n letter-spacing: 0.2px;\n}\n.messages[data-v-cc3cfaa7] {\n position: relative;\n\n overflow-y: auto;\n flex: 1;\n\n padding: 24px 20px;\n\n background: linear-gradient(180deg, #f5f5f5 0%, #fafafa 100%);\n}\n\n/* 自定义滚动条 */\n.messages[data-v-cc3cfaa7]::-webkit-scrollbar {\n width: 6px;\n}\n.messages[data-v-cc3cfaa7]::-webkit-scrollbar-track {\n background: transparent;\n}\n.messages[data-v-cc3cfaa7]::-webkit-scrollbar-thumb {\n border-radius: 3px;\n background: #d9d9d9;\n}\n.messages[data-v-cc3cfaa7]::-webkit-scrollbar-thumb:hover {\n background: #bfbfbf;\n}\n.loading-more[data-v-cc3cfaa7] {\n display: flex;\n gap: 8px;\n align-items: center;\n justify-content: center;\n\n padding: 16px;\n\n font-size: 13px;\n color: #8c8c8c;\n}\n.loading-spinner-small[data-v-cc3cfaa7] {\n width: 20px;\n height: 20px;\n border: 2px solid #f0f0f0;\n border-top: 2px solid #0e77cc;\n border-radius: 50%;\n\n animation: spin-cc3cfaa7 0.8s linear infinite;\n}\n.no-more[data-v-cc3cfaa7] {\n padding: 12px;\n font-size: 12px;\n color: #bfbfbf;\n text-align: center;\n}\n.loading-state[data-v-cc3cfaa7] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n padding: 60px 20px;\n\n color: #bfbfbf;\n}\n.loading-spinner[data-v-cc3cfaa7] {\n width: 40px;\n height: 40px;\n margin-bottom: 16px;\n border: 3px solid #f0f0f0;\n border-top: 3px solid #0e77cc;\n border-radius: 50%;\n\n animation: spin-cc3cfaa7 0.8s linear infinite;\n}\n@keyframes spin-cc3cfaa7 {\n0% { transform: rotate(0deg);\n}\n100% { transform: rotate(360deg);\n}\n}\n.empty-messages[data-v-cc3cfaa7] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n height: 100%;\n\n color: #bfbfbf;\n}\n.empty-messages .icon[data-v-cc3cfaa7] {\n margin-bottom: 16px;\n font-size: 64px;\n opacity: 0.5;\n}\n.empty-messages p[data-v-cc3cfaa7] {\n margin: 0;\n font-size: 14px;\n font-weight: 400;\n}\n.message-item[data-v-cc3cfaa7] {\n display: flex;\n gap: 12px;\n margin-bottom: 24px;\n animation: slide-in-cc3cfaa7 0.3s ease-out;\n}\n@keyframes slide-in-cc3cfaa7 {\nfrom {\n transform: translateY(10px);\n opacity: 0;\n}\nto {\n transform: translateY(0);\n opacity: 1;\n}\n}\n.message-item.is-self[data-v-cc3cfaa7] {\n justify-content: flex-end;\n}\n.msg-avatar-wrapper[data-v-cc3cfaa7] {\n position: relative;\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n}\n.msg-avatar-img[data-v-cc3cfaa7] {\n width: 100%;\n height: 100%;\n border: 2px solid white;\n border-radius: 50%;\n\n object-fit: cover;\n background: linear-gradient(135deg, #f0f0f0 0%, #e8e8e8 100%);\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);\n}\n.msg-avatar[data-v-cc3cfaa7] {\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 40px;\n height: 40px;\n border: 2px solid white;\n border-radius: 50%;\n\n font-size: 15px;\n font-weight: 600;\n color: white;\n\n background: linear-gradient(135deg, #0e77cc 0%, #0d6db8 100%);\n box-shadow: 0 2px 6px rgba(14, 119, 204, 0.3);\n}\n.message-content-wrapper[data-v-cc3cfaa7] {\n display: flex;\n flex-direction: column;\n max-width: 65%;\n}\n.is-self .message-content-wrapper[data-v-cc3cfaa7] {\n align-items: flex-end;\n}\n.message-sender[data-v-cc3cfaa7] {\n margin-bottom: 6px;\n font-size: 12px;\n font-weight: 400;\n color: #8c8c8c;\n}\n.message-content[data-v-cc3cfaa7] {\n padding: 12px 16px;\n border-radius: 12px;\n\n background-color: white;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n\n transition: all 0.2s;\n}\n.message-item.is-self .message-content[data-v-cc3cfaa7] {\n color: white;\n background: linear-gradient(135deg, #0e77cc 0%, #0d6db8 100%);\n box-shadow: 0 2px 8px rgba(14, 119, 204, 0.25);\n}\n.message-text[data-v-cc3cfaa7] {\n margin-bottom: 6px;\n\n font-size: 14px;\n line-height: 1.6;\n color: #262626;\n overflow-wrap: break-word;\n}\n.message-item.is-self .message-text[data-v-cc3cfaa7] {\n color: white;\n}\n\n/* 图片消息 */\n.message-image[data-v-cc3cfaa7] {\n margin-bottom: 6px;\n}\n.message-image img[data-v-cc3cfaa7] {\n cursor: pointer;\n\n max-width: 300px;\n max-height: 300px;\n border-radius: 8px;\n\n object-fit: cover;\n\n transition: transform 0.2s;\n}\n.message-image img[data-v-cc3cfaa7]:hover {\n transform: scale(1.02);\n}\n\n/* 表情消息 */\n.message-emoji[data-v-cc3cfaa7] {\n display: flex;\n align-items: center;\n justify-content: center;\n\n min-height: 60px;\n margin-bottom: 6px;\n\n font-size: 48px;\n line-height: 1;\n}\n\n/* 文件消息 */\n.message-file[data-v-cc3cfaa7] {\n margin-bottom: 6px;\n}\n.file-link[data-v-cc3cfaa7] {\n display: inline-flex;\n gap: 8px;\n align-items: center;\n\n padding: 12px 16px;\n border-radius: 8px;\n\n font-size: 14px;\n font-weight: 500;\n color: #262626;\n text-decoration: none;\n\n background-color: #f5f5f5;\n\n transition: all 0.2s;\n}\n.file-link[data-v-cc3cfaa7]:hover {\n color: #0e77cc;\n background-color: #e8e8e8;\n}\n.is-self .file-link[data-v-cc3cfaa7] {\n color: white;\n background-color: rgba(255, 255, 255, 0.2);\n}\n.is-self .file-link[data-v-cc3cfaa7]:hover {\n background-color: rgba(255, 255, 255, 0.3);\n}\n\n/* 系统通知 */\n.message-system[data-v-cc3cfaa7] {\n margin-bottom: 6px;\n padding: 8px 12px;\n border-left: 3px solid #0e77cc;\n border-radius: 6px;\n\n font-size: 13px;\n color: #8c8c8c;\n text-align: center;\n\n background-color: #f5f5f5;\n}\n.is-self .message-system[data-v-cc3cfaa7] {\n border-left-color: white;\n color: rgba(255, 255, 255, 0.9);\n background-color: rgba(255, 255, 255, 0.2);\n}\n\n/* 卡片消息 */\n.message-card[data-v-cc3cfaa7] {\n margin-bottom: 6px;\n padding: 12px;\n border: 1px solid #bae6fd;\n border-radius: 8px;\n\n background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%);\n}\n.is-self .message-card[data-v-cc3cfaa7] {\n border-color: rgba(255, 255, 255, 0.3);\n background: rgba(255, 255, 255, 0.2);\n}\n.message-time[data-v-cc3cfaa7] {\n font-size: 11px;\n color: #8c8c8c;\n}\n.message-item.is-self .message-time[data-v-cc3cfaa7] {\n color: rgba(255, 255, 255, 0.75);\n}\n.input-area[data-v-cc3cfaa7] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n\n padding: 16px 20px;\n border-top: 1px solid #e8e8e8;\n\n background: white;\n box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.04);\n}\n\n/* 工具栏 */\n.input-toolbar[data-v-cc3cfaa7] {\n display: flex;\n gap: 8px;\n padding: 4px 0;\n}\n.tool-btn[data-v-cc3cfaa7] {\n cursor: pointer;\n\n display: inline-flex;\n gap: 6px;\n align-items: center;\n\n padding: 8px 14px;\n border: 1.5px solid #e8e8e8;\n border-radius: 8px;\n\n font-size: 13px;\n font-weight: 500;\n color: #595959;\n\n background: white;\n outline: none;\n\n transition: all 0.2s;\n}\n.tool-btn[data-v-cc3cfaa7]:hover:not(:disabled) {\n border-color: #0e77cc;\n color: #0e77cc;\n background: #f0f9ff;\n}\n.tool-btn[data-v-cc3cfaa7]:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n background: #f5f5f5;\n}\n.tool-btn-text[data-v-cc3cfaa7] {\n font-size: 13px;\n}\n.tool-btn-icon[data-v-cc3cfaa7] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n width: 18px;\n height: 18px;\n}\n.tool-btn-svg[data-v-cc3cfaa7] {\n width: 18px;\n height: 18px;\n}\n.image-btn[data-v-cc3cfaa7] {\n border-color: #d9d9d9;\n}\n.emoji-container[data-v-cc3cfaa7] {\n position: relative;\n}\n.quick-reply-container[data-v-cc3cfaa7] {\n position: relative;\n}\n.quick-reply-trigger[data-v-cc3cfaa7] {\n border-color: #d9d9d9;\n}\n.quick-reply-trigger.active[data-v-cc3cfaa7] {\n border-color: #0e77cc;\n color: #0e77cc;\n background: #f0f9ff;\n}\n.quick-reply-panel[data-v-cc3cfaa7] {\n position: absolute;\n z-index: 1001;\n bottom: calc(100% + 8px);\n left: 0;\n\n overflow: hidden;\n\n width: 320px;\n max-width: min(320px, calc(100vw - 80px));\n border: 1px solid #e8e8e8;\n border-radius: 10px;\n\n background: #fff;\n box-shadow: 0 8px 30px rgba(0, 0, 0, 0.12);\n}\n.quick-reply-search[data-v-cc3cfaa7] {\n padding: 10px;\n border-bottom: 1px solid #f0f0f0;\n}\n.quick-reply-search input[data-v-cc3cfaa7] {\n width: 100%;\n height: 34px;\n padding: 0 10px;\n border: 1px solid #d9d9d9;\n border-radius: 8px;\n\n font-size: 13px;\n color: #595959;\n\n background: #fff;\n outline: none;\n}\n.quick-reply-search input[data-v-cc3cfaa7]:focus {\n border-color: #0e77cc;\n box-shadow: 0 0 0 2px rgba(14, 119, 204, 0.08);\n}\n.quick-reply-list[data-v-cc3cfaa7] {\n overflow-y: auto;\n max-height: 220px;\n padding: 8px;\n}\n.quick-reply-item[data-v-cc3cfaa7] {\n cursor: pointer;\n\n width: 100%;\n margin-bottom: 6px;\n padding: 8px 10px;\n border: 1px solid transparent;\n border-radius: 8px;\n\n font-size: 13px;\n line-height: 1.45;\n color: #595959;\n text-align: left;\n\n background: #f7f8fa;\n}\n.quick-reply-item[data-v-cc3cfaa7]:last-child {\n margin-bottom: 0;\n}\n.quick-reply-item[data-v-cc3cfaa7]:hover {\n border-color: #b6dcfa;\n color: #0e77cc;\n background: #f0f9ff;\n}\n.quick-reply-empty[data-v-cc3cfaa7] {\n padding: 18px 10px;\n font-size: 12px;\n color: #bfbfbf;\n text-align: center;\n}\n.emoji-picker-wrapper[data-v-cc3cfaa7] {\n position: absolute;\n z-index: 1000;\n bottom: 100%;\n left: 0;\n\n overflow: hidden;\n\n margin-bottom: 8px;\n border-radius: 8px;\n\n box-shadow: 0 8px 30px rgba(0, 0, 0, 0.15);\n}\n.input-area textarea[data-v-cc3cfaa7] {\n resize: none;\n\n width: 100%;\n padding: 12px 14px;\n border: 1.5px solid #e8e8e8;\n border-radius: 8px;\n\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n font-size: 14px;\n line-height: 1.5;\n\n background: #fafafa;\n outline: none;\n\n transition: all 0.2s;\n}\n.input-area textarea[data-v-cc3cfaa7]:focus {\n border-color: #0e77cc;\n background: white;\n box-shadow: 0 0 0 3px rgba(14, 119, 204, 0.08);\n}\n.input-area textarea[data-v-cc3cfaa7]::placeholder {\n color: #bfbfbf;\n}\n.input-actions[data-v-cc3cfaa7] {\n display: flex;\n justify-content: flex-end;\n}\n.send-btn[data-v-cc3cfaa7] {\n cursor: pointer;\n\n padding: 10px 28px;\n border: none;\n border-radius: 8px;\n\n font-size: 14px;\n font-weight: 500;\n color: white;\n letter-spacing: 0.3px;\n\n background: linear-gradient(135deg, #0e77cc 0%, #0d6db8 100%);\n box-shadow: 0 2px 6px rgba(14, 119, 204, 0.25);\n\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.send-btn[data-v-cc3cfaa7]:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(14, 119, 204, 0.35);\n}\n.send-btn[data-v-cc3cfaa7]:active {\n transform: translateY(0);\n box-shadow: 0 2px 6px rgba(14, 119, 204, 0.25);\n}\n\n.conversation-list[data-v-d070a051] {\n overflow-y: auto;\n display: flex;\n flex: 1;\n flex-direction: column;\n\n background: #fff;\n}\n\n/* 自定义滚动条 */\n.conversation-list[data-v-d070a051]::-webkit-scrollbar {\n width: 6px;\n}\n.conversation-list[data-v-d070a051]::-webkit-scrollbar-track {\n background: transparent;\n}\n.conversation-list[data-v-d070a051]::-webkit-scrollbar-thumb {\n border-radius: 3px;\n background: #d9d9d9;\n}\n.conversation-list[data-v-d070a051]::-webkit-scrollbar-thumb:hover {\n background: #bfbfbf;\n}\n.unread-header[data-v-d070a051] {\n padding: 8px 20px;\n border-bottom: 1px solid #e8e8e8;\n background: linear-gradient(180deg, #fafafa 0%, #fff 100%);\n}\n.unread-count[data-v-d070a051] {\n font-size: 15px;\n font-weight: 600;\n color: #262626;\n letter-spacing: 0.3px;\n}\n.loading-state[data-v-d070a051] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n padding: 60px 20px;\n\n color: #bfbfbf;\n}\n.loading-spinner[data-v-d070a051] {\n width: 40px;\n height: 40px;\n margin-bottom: 16px;\n border: 3px solid #f0f0f0;\n border-top: 3px solid #0e77cc;\n border-radius: 50%;\n\n animation: spin-d070a051 0.8s linear infinite;\n}\n@keyframes spin-d070a051 {\n0% { transform: rotate(0deg);\n}\n100% { transform: rotate(360deg);\n}\n}\n.empty-state[data-v-d070a051] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n height: 100%;\n padding: 40px 20px;\n\n color: #bfbfbf;\n}\n.empty-icon[data-v-d070a051] {\n width: 64px;\n height: 64px;\n margin-bottom: 16px;\n opacity: 0.5;\n}\n.empty-state p[data-v-d070a051] {\n margin: 0;\n font-size: 14px;\n font-weight: 400;\n}\n.conversation-item[data-v-d070a051] {\n cursor: pointer;\n\n position: relative;\n\n padding: 12px 16px;\n border-bottom: 1px solid #f0f0f0;\n\n background: white;\n\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.conversation-item[data-v-d070a051]:hover {\n background-color: #f5f7fa;\n}\n.conversation-item.active[data-v-d070a051] {\n padding-left: 13px;\n border-left: 3px solid #0e77cc;\n background: linear-gradient(90deg, #ecf5ff 0%, #fff 100%);\n}\n.conversation-item[data-v-d070a051]:last-child {\n border-bottom: none;\n}\n\n/* 会话项内容布局 */\n.conversation-item-content[data-v-d070a051] {\n display: flex;\n gap: 12px;\n align-items: center;\n width: 100%;\n}\n.avatar-wrapper[data-v-d070a051] {\n position: relative;\n flex-shrink: 0;\n width: 44px;\n height: 44px;\n}\n.avatar-img[data-v-d070a051] {\n width: 100%;\n height: 100%;\n border: 2px solid white;\n border-radius: 50%;\n\n object-fit: cover;\n background: linear-gradient(135deg, #f0f0f0 0%, #e8e8e8 100%);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n.avatar-text[data-v-d070a051] {\n position: absolute;\n top: 0;\n left: 0;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 44px;\n height: 44px;\n border: 2px solid white;\n border-radius: 50%;\n\n font-size: 16px;\n font-weight: 600;\n color: white;\n\n background: linear-gradient(135deg, #0e77cc 0%, #0d6db8 100%);\n box-shadow: 0 2px 8px rgba(14, 119, 204, 0.3);\n}\n.session-info[data-v-d070a051] {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: 4px;\n justify-content: center;\n\n min-width: 0;\n}\n.session-name[data-v-d070a051] {\n font-size: 14px;\n font-weight: 600;\n color: #262626;\n letter-spacing: 0.2px;\n}\n.content-text[data-v-d070a051] {\n overflow: hidden;\n display: block;\n\n font-size: 13px;\n line-height: 1.4;\n color: #595959;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.session-meta[data-v-d070a051] {\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n gap: 6px;\n align-items: flex-end;\n}\n.session-time[data-v-d070a051] {\n font-size: 12px;\n font-weight: 400;\n color: #8c8c8c;\n}\n.unread-badge[data-v-d070a051] {\n display: flex;\n align-items: center;\n justify-content: center;\n\n min-width: 20px;\n height: 20px;\n margin-left: 8px;\n padding: 0 7px;\n border-radius: 10px;\n\n font-size: 12px;\n font-weight: 600;\n color: white;\n\n background: linear-gradient(135deg, #ff4d4f 0%, #ff7875 100%);\n box-shadow: 0 2px 6px rgba(255, 77, 79, 0.3);\n\n animation: pulse-d070a051 2s ease-in-out infinite;\n}\n@keyframes pulse-d070a051 {\n0%, 100% {\n transform: scale(1);\n}\n50% {\n transform: scale(1.05);\n}\n}\n\n.chat-window[data-v-00d50ef7] {\n position: fixed;\n z-index: 9998;\n\n overflow: hidden;\n display: flex;\n flex-direction: column;\n\n min-width: 380px;\n min-height: 360px;\n border: 1px solid rgba(9, 62, 105, 0.14);\n border-radius: 18px;\n\n background: linear-gradient(180deg, #fff 0%, #f9fcff 100%);\n backdrop-filter: blur(6px);\n box-shadow: 0 24px 80px rgba(11, 58, 106, 0.24);\n\n animation: window-enter-00d50ef7 0.22s ease-out;\n}\n.chat-window.is-dragging[data-v-00d50ef7] {\n cursor: move;\n box-shadow: 0 28px 88px rgba(11, 58, 106, 0.28);\n}\n.chat-window.is-resizing[data-v-00d50ef7] {\n cursor: nwse-resize;\n}\n.chat-header[data-v-00d50ef7] {\n cursor: move;\n user-select: none;\n\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: space-between;\n\n padding: 10px 20px;\n\n color: white;\n\n background: linear-gradient(135deg, #0f83df 0%, #0e6fbe 62%, #0c5fa5 100%);\n box-shadow: 0 2px 12px rgba(14, 119, 204, 0.26);\n}\n\n/* 用户信息区域 */\n.user-info-section[data-v-00d50ef7] {\n display: flex;\n flex: 1;\n gap: 12px;\n align-items: center;\n}\n.user-avatar-wrapper[data-v-00d50ef7] {\n position: relative;\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n}\n.user-avatar[data-v-00d50ef7] {\n width: 100%;\n height: 100%;\n border: 2px solid rgba(255, 255, 255, 0.3);\n border-radius: 50%;\n\n object-fit: cover;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n}\n.user-avatar-default[data-v-00d50ef7] {\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 40px;\n height: 40px;\n border: 2px solid rgba(255, 255, 255, 0.3);\n border-radius: 50%;\n\n font-size: 16px;\n font-weight: 600;\n color: white;\n\n background: linear-gradient(135deg, rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0.1) 100%);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n}\n.status-indicator[data-v-00d50ef7] {\n cursor: pointer;\n\n position: absolute;\n right: -2px;\n bottom: -2px;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 14px;\n height: 14px;\n border: 2px solid white;\n border-radius: 50%;\n\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\n\n transition: transform 0.2s;\n}\n.status-indicator[data-v-00d50ef7]:hover {\n transform: scale(1.15);\n}\n.status-indicator svg[data-v-00d50ef7] {\n width: 8px;\n height: 8px;\n}\n\n/* 状态下拉菜单 */\n.status-dropdown[data-v-00d50ef7] {\n position: absolute;\n z-index: 100;\n top: 100%;\n left: 0;\n\n min-width: 120px;\n margin-top: 8px;\n padding: 6px;\n border: 1px solid #dbe7f5;\n border-radius: 10px;\n\n background: white;\n box-shadow: 0 12px 30px rgba(11, 58, 106, 0.18);\n}\n.status-option[data-v-00d50ef7] {\n cursor: pointer;\n\n display: flex;\n gap: 8px;\n align-items: center;\n\n padding: 8px 10px;\n border-radius: 6px;\n\n color: #262626;\n\n transition: all 0.2s;\n}\n.status-option[data-v-00d50ef7]:hover {\n background: #f5f5f5;\n}\n.status-option.active[data-v-00d50ef7] {\n color: #0e77cc;\n background: #e6f7ff;\n}\n.status-dot[data-v-00d50ef7] {\n flex-shrink: 0;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n}\n.status-option span[data-v-00d50ef7] {\n flex: 1;\n font-size: 13px;\n}\n.check-icon[data-v-00d50ef7] {\n width: 16px;\n height: 16px;\n opacity: 0.8;\n}\n.user-details[data-v-00d50ef7] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n.user-name[data-v-00d50ef7] {\n font-size: 14px;\n font-weight: 600;\n letter-spacing: 0.2px;\n}\n.user-status[data-v-00d50ef7] {\n font-size: 12px;\n font-weight: 400;\n opacity: 0.9;\n}\n.close-btn[data-v-00d50ef7] {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 32px;\n height: 32px;\n border: none;\n border-radius: 8px;\n\n font-size: 28px;\n line-height: 1;\n color: white;\n\n opacity: 0.8;\n background: none;\n\n transition: all 0.2s;\n}\n.close-btn[data-v-00d50ef7]:hover {\n transform: rotate(90deg);\n opacity: 1;\n background: rgba(255, 255, 255, 0.15);\n}\n.close-btn[data-v-00d50ef7]:active {\n transform: rotate(90deg) scale(0.95);\n}\n.chat-body[data-v-00d50ef7] {\n overflow: hidden;\n display: flex;\n flex: 1;\n\n min-height: 0;\n\n background: linear-gradient(180deg, #fbfdff 0%, #f4f8fc 100%);\n}\n\n/* 第一栏:一级菜单 */\n.first-sidebar[data-v-00d50ef7] {\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n\n width: 76px;\n padding: 0;\n border-right: 1px solid #dce8f3;\n\n background: linear-gradient(180deg, #f5f9ff 0%, #f0f6fd 100%);\n}\n.menu-items-container[data-v-00d50ef7] {\n display: flex;\n flex: 1;\n flex-direction: column;\n align-items: center;\n\n padding: 18px 0;\n}\n.menu-item[data-v-00d50ef7] {\n cursor: pointer;\n\n position: relative;\n\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n\n width: 50px;\n height: 50px;\n margin-bottom: 12px;\n border: 1px solid transparent;\n border-radius: 12px;\n\n font-weight: 400;\n color: #7d8fa3;\n\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.menu-item[data-v-00d50ef7]:last-child {\n margin-bottom: 0;\n}\n.menu-item[data-v-00d50ef7]:hover {\n transform: translateY(-1px);\n border-color: #d2e3f3;\n color: #0e77cc;\n background: #f7fbff;\n}\n.menu-item.active[data-v-00d50ef7] {\n border-color: #0e77cc;\n color: white;\n background: linear-gradient(135deg, #0f83df 0%, #0d6db8 100%);\n box-shadow: 0 8px 20px rgba(14, 119, 204, 0.35);\n}\n.menu-item.active[data-v-00d50ef7]::before {\n content: '';\n\n position: absolute;\n top: 50%;\n left: -11px;\n transform: translateY(-50%);\n\n width: 3px;\n height: 24px;\n border-radius: 2px;\n\n background: #0e77cc;\n}\n.menu-item .icon[data-v-00d50ef7] {\n width: 23px;\n height: 23px;\n}\n.menu-item .label[data-v-00d50ef7] {\n display: none;\n}\n.menu-item .menu-badge[data-v-00d50ef7] {\n position: absolute;\n top: 6px;\n right: 6px;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n min-width: 16px;\n height: 16px;\n padding: 0 5px;\n border: 2px solid white;\n border-radius: 8px;\n\n font-size: 10px;\n font-weight: 600;\n line-height: 1;\n color: white;\n\n background: linear-gradient(135deg, #ff4d4f 0%, #ff7875 100%);\n box-shadow: 0 2px 6px rgba(255, 77, 79, 0.4);\n}\n.menu-item.active .menu-badge[data-v-00d50ef7] {\n border-color: #0e77cc;\n color: #ff4d4f;\n background: linear-gradient(135deg, #fff 0%, #f0f0f0 100%);\n}\n\n/* 第二栏:二级侧边栏 */\n.second-sidebar[data-v-00d50ef7] {\n overflow: hidden;\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n\n width: 250px;\n border-right: 1px solid #dce8f3;\n\n background: linear-gradient(180deg, #fff 0%, #fbfdff 100%);\n}\n\n/* 第三栏:聊天区域 */\n.chat-area[data-v-00d50ef7] {\n overflow: hidden;\n display: flex;\n flex: 1;\n flex-direction: column;\n\n min-width: 0;\n\n background: radial-gradient(circle at top right, rgba(14, 119, 204, 0.08) 0%, rgba(255, 255, 255, 0) 42%), #fff;\n}\n.empty-chat[data-v-00d50ef7] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n height: 100%;\n\n color: #8ca1b8;\n\n background: linear-gradient(180deg, #f7fbff 0%, #fff 100%);\n}\n.empty-chat .empty-icon[data-v-00d50ef7] {\n width: 72px;\n height: 72px;\n margin-bottom: 18px;\n\n opacity: 0.5;\n filter: drop-shadow(0 8px 20px rgba(11, 58, 106, 0.16));\n}\n.empty-chat p[data-v-00d50ef7] {\n margin: 0;\n font-size: 15px;\n font-weight: 500;\n letter-spacing: 0.3px;\n}\n\n/* 拉伸手柄 */\n.resize-handle[data-v-00d50ef7] {\n cursor: nwse-resize;\n\n position: absolute;\n z-index: 9999;\n right: 0;\n bottom: 0;\n\n width: 24px;\n height: 24px;\n\n opacity: 0.5;\n\n transition: opacity 0.2s;\n}\n.resize-handle[data-v-00d50ef7]:hover {\n opacity: 1;\n}\n.resize-handle[data-v-00d50ef7]::after {\n content: '';\n\n position: absolute;\n right: 6px;\n bottom: 6px;\n\n width: 0;\n height: 0;\n border-top: 10px solid transparent;\n border-right: 10px solid #0e77cc;\n border-bottom: 10px solid #0e77cc;\n border-left: 10px solid transparent;\n\n opacity: 0.6;\n filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.1));\n}\n@keyframes window-enter-00d50ef7 {\nfrom {\n transform: translate3d(0, 16px, 0) scale(0.98);\n opacity: 0;\n}\nto {\n transform: translate3d(0, 0, 0) scale(1);\n opacity: 1;\n}\n}\n@media (width <= 960px) {\n.second-sidebar[data-v-00d50ef7] {\n width: 220px;\n}\n}\n\n.float-button[data-v-a60f9c33] {\n touch-action: none;\n cursor: grab;\n user-select: none;\n\n position: fixed;\n z-index: 9999;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 64px;\n height: 64px;\n border: 1px solid #0e77cc;\n border-radius: 50%;\n\n background: #fff;\n box-shadow: 0 4px 20px rgba(14, 119, 204, 0.3);\n\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.float-button.is-hidden[data-v-a60f9c33] {\n pointer-events: none;\n transform: scale(0.88);\n opacity: 0;\n}\n.float-button[data-v-a60f9c33]:hover {\n transform: translateY(-2px);\n box-shadow: 0 6px 30px rgba(14, 119, 204, 0.4);\n}\n.float-button[data-v-a60f9c33]:active {\n transform: translateY(0) scale(0.95);\n}\n.float-button.is-dragging[data-v-a60f9c33] {\n cursor: grabbing;\n transform: scale(1.08);\n box-shadow: 0 8px 35px rgba(14, 119, 204, 0.35);\n}\n.float-button .icon[data-v-a60f9c33] {\n pointer-events: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 32px;\n height: 32px;\n\n filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.1));\n}\n.float-button .icon img[data-v-a60f9c33] {\n width: 100%;\n height: 100%;\n object-fit: contain;\n}\n.float-button .badge[data-v-a60f9c33] {\n pointer-events: none;\n\n position: absolute;\n top: 4px;\n right: 4px;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n border: 2.5px solid white;\n border-radius: 10px;\n\n font-size: 11px;\n font-weight: 600;\n line-height: 1;\n color: white;\n\n background: linear-gradient(135deg, #ff4d4f 0%, #ff7875 100%);\n box-shadow: 0 2px 8px rgba(255, 77, 79, 0.4);\n}\n.float-button.has-unread[data-v-a60f9c33] {\n animation: pulse-a60f9c33 2s ease-in-out infinite;\n}\n@keyframes pulse-a60f9c33 {\n0%, 100% {\n box-shadow: 0 4px 20px rgba(14, 119, 204, 0.3),\n 0 0 0 0 rgba(255, 77, 79, 0.4);\n}\n50% {\n box-shadow: 0 4px 20px rgba(14, 119, 204, 0.3),\n 0 0 0 12px rgba(255, 77, 79, 0);\n}\n}\n/*$vite$:1*/"
|
|
1
|
+
const __SHARED_IMSDK_CSS__ = ".confirm-dialog-mask[data-v-69eaf313] {\n position: fixed;\n z-index: 12000;\n inset: 0;\n\n background: rgba(15, 23, 42, 0.35);\n backdrop-filter: blur(2px);\n}\n.confirm-dialog[data-v-69eaf313] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n width: min(420px, calc(100vw - 32px));\n border: 1px solid #e8edf4;\n border-radius: 12px;\n\n background: #fff;\n box-shadow: 0 18px 48px rgba(15, 23, 42, 0.22);\n}\n.confirm-dialog-header[data-v-69eaf313] {\n padding: 16px 18px 8px;\n}\n.confirm-dialog-title[data-v-69eaf313] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #1f2937;\n}\n.confirm-dialog-body[data-v-69eaf313] {\n padding: 0 18px 10px;\n}\n.confirm-dialog-message[data-v-69eaf313] {\n margin: 0;\n font-size: 14px;\n line-height: 1.55;\n color: #4b5563;\n}\n.confirm-dialog-error[data-v-69eaf313] {\n margin: 10px 0 0;\n font-size: 13px;\n line-height: 1.45;\n color: #cf1322;\n}\n.confirm-dialog-footer[data-v-69eaf313] {\n display: flex;\n gap: 10px;\n justify-content: flex-end;\n padding: 14px 18px 18px;\n}\n.dialog-btn[data-v-69eaf313] {\n cursor: pointer;\n\n min-width: 80px;\n height: 34px;\n padding: 0 14px;\n border: 1px solid transparent;\n border-radius: 8px;\n\n font-size: 14px;\n\n transition: all 0.2s ease;\n}\n.dialog-btn[data-v-69eaf313]:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n.cancel-btn[data-v-69eaf313] {\n border-color: #d9d9d9;\n color: #595959;\n background: #fff;\n}\n.cancel-btn[data-v-69eaf313]:hover:not(:disabled) {\n border-color: #bfbfbf;\n color: #262626;\n background: #fafafa;\n}\n.confirm-btn[data-v-69eaf313] {\n border-color: #0e77cc;\n color: #fff;\n background: linear-gradient(135deg, #0e77cc 0%, #0d6db8 100%);\n}\n.confirm-btn[data-v-69eaf313]:hover:not(:disabled) {\n border-color: #0d6db8;\n filter: brightness(1.03);\n}\n.v3-body-inner{scroll-behavior:smooth;scrollbar-color:#393d3f rgba(0,0,0,.1);scrollbar-width:thin}.v3-body-inner::-webkit-scrollbar{width:8px}.v3-body-inner::-webkit-scrollbar-track{background-color:transparent}.v3-body-inner::-webkit-scrollbar-thumb{display:none;background:rgba(0,0,0,.3);border-radius:5px}.v3-body-inner:hover::-webkit-scrollbar-thumb{display:block}.v3-emoji-picker{height:320px;width:280px;box-shadow:0 2px 10px #0003;border-radius:10px;margin:0 auto;box-sizing:border-box;display:flex;flex-direction:column;text-align:left}.v3-emoji-picker *{box-sizing:border-box}.v3-emoji-picker .v3-header{padding:15px 15px 13px;border-bottom:1px solid}.v3-emoji-picker .v3-header .v3-groups{display:flex}.v3-emoji-picker .v3-header .v3-groups .v3-group{flex-grow:1;padding:0;margin:0;border:none;background:none;font-size:23px;cursor:pointer;position:relative;display:block;opacity:.7;transition:.2s}.v3-emoji-picker .v3-header .v3-groups .v3-group.v3-is-hidden{display:none}.v3-emoji-picker .v3-header .v3-groups .v3-group:first-child,.v3-emoji-picker .v3-header .v3-groups .v3-group:last-child{flex-grow:0}.v3-emoji-picker .v3-header .v3-groups .v3-group:hover{opacity:1}.v3-emoji-picker .v3-header .v3-groups .v3-group span{display:flex;align-items:center;justify-content:center}.v3-emoji-picker .v3-header .v3-groups .v3-group span img{display:block;width:1em;height:auto}.v3-emoji-picker .v3-spacing{height:11px}.v3-emoji-picker .v3-search input{width:100%;display:block;height:26px;padding:0 10px;border:1px solid;border-radius:3px;font-size:12px;transition:.2s}.v3-emoji-picker .v3-search input:focus{outline:none}.v3-emoji-picker .v3-body{padding:0 0 15px 11px;min-height:0;flex-grow:1}.v3-emoji-picker .v3-body .v3-body-inner{flex-grow:1;min-height:0;overflow-y:auto;overflow-x:hidden;height:100%;padding-right:11px}.v3-emoji-picker .v3-body .v3-body-inner .v3-group h5{margin:0;top:0;padding:7px 0 3px 4px;z-index:2}.v3-emoji-picker .v3-body .v3-body-inner .v3-group h5.v3-sticky{position:sticky}.v3-emoji-picker .v3-body .v3-body-inner .v3-group .v3-emojis{display:flex;font-size:18px;flex-wrap:wrap}.v3-emoji-picker .v3-body .v3-body-inner .v3-group .v3-emojis button{cursor:pointer;border:none;background:none;margin:0;text-align:center;display:flex;align-items:center;justify-content:center;flex-basis:12.5%;max-width:12.5%;flex-grow:1;padding:0;font-size:22px;position:relative}.v3-emoji-picker .v3-body .v3-body-inner .v3-group .v3-emojis button:after{content:\"\";width:100%;padding-bottom:100%}.v3-emoji-picker .v3-body .v3-body-inner .v3-group .v3-emojis button span{display:flex;align-items:center;justify-content:center}.v3-emoji-picker .v3-body .v3-body-inner .v3-group .v3-emojis button img{max-width:100%;padding:4px}.v3-emoji-picker .v3-body .v3-body-inner .v3-group .v3-emojis button span,.v3-emoji-picker .v3-body .v3-body-inner .v3-group .v3-emojis button img{position:absolute;top:0;left:0;width:100%;height:100%}.v3-emoji-picker .v3-body .v3-body-inner.is-mac .v3-emojis button{font-family:\"Apple Color Emoji\"}.v3-emoji-picker .v3-footer{font-size:14px;border-top:1px solid #dddddd;padding:15px;display:flex;align-items:center;justify-content:space-between;position:relative}.v3-emoji-picker .v3-footer .v3-tone,.v3-emoji-picker .v3-footer .v3-foot-left{display:flex;align-items:center}.v3-emoji-picker .v3-footer .v3-tone img,.v3-emoji-picker .v3-footer .v3-foot-left img{width:20px;display:block}.v3-emoji-picker .v3-footer .v3-tone>span:first-child,.v3-emoji-picker .v3-footer .v3-foot-left>span:first-child{margin-right:6px}.v3-emoji-picker .v3-footer .v3-foot-left>span.v3-text{max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.v3-emoji-picker .v3-footer .v3-tone{border:none;padding:0;background:none;cursor:pointer;display:inline-flex;align-items:center}.v3-emoji-picker .v3-footer .v3-tone>span{display:inline-flex;vertical-align:top}.v3-emoji-picker .v3-footer .v3-tone .v3-text{font-size:13px}.v3-emoji-picker .v3-footer .v3-tone .v3-icon{display:inline-flex;height:15px;width:15px;vertical-align:middle;align-self:center;border:2px solid rgba(0,0,0,.2)}.v3-emoji-picker .v3-footer .v3-tone .v3-icon.v3-tone-neutral{background-color:#ffd225}.v3-emoji-picker .v3-footer .v3-tone .v3-icon.v3-tone-1f3fb{background-color:#ffdfbd}.v3-emoji-picker .v3-footer .v3-tone .v3-icon.v3-tone-1f3fc{background-color:#e9c197}.v3-emoji-picker .v3-footer .v3-tone .v3-icon.v3-tone-1f3fd{background-color:#c88e62}.v3-emoji-picker .v3-footer .v3-tone .v3-icon.v3-tone-1f3fe{background-color:#a86637}.v3-emoji-picker .v3-footer .v3-tone .v3-icon.v3-tone-1f3ff{background-color:#60463a}.v3-emoji-picker .v3-footer .v3-tone .is-mac span{font-family:\"Apple Color Emoji\"}.v3-skin-tones{position:absolute;height:100%;width:60%;top:0;left:0;display:flex;align-items:center;justify-content:flex-end;padding:0 15px;opacity:0;visibility:hidden;transition:.2s;border-radius:0 0 10px 10px}.v3-skin-tones.v3-is-open{opacity:1;visibility:visible}.v3-skin-tones .v3-skin-tone{display:inline-block;height:15px;width:25px;border:none;padding:0;cursor:pointer;transition:0ms}.v3-skin-tones .v3-skin-tone:hover{transform:scale(1.1);transition:.2s}.v3-skin-tones .v3-skin-tone-neutral{color:#ffd225;background-color:#ffd225}.v3-skin-tones .v3-skin-tone-1f3fb{color:#ffdfbd;background-color:#ffdfbd}.v3-skin-tones .v3-skin-tone-1f3fc{color:#e9c197;background-color:#e9c197}.v3-skin-tones .v3-skin-tone-1f3fd{color:#c88e62;background-color:#c88e62}.v3-skin-tones .v3-skin-tone-1f3fe{color:#a86637;background-color:#a86637}.v3-skin-tones .v3-skin-tone-1f3ff{color:#60463a;background-color:#60463a}.v3-input-emoji-picker *{box-sizing:border-box}.v3-input-emoji-picker .v3-input-picker-root{position:relative}.v3-input-emoji-picker .v3-input-picker-root .v3-emoji-picker-input,.v3-input-emoji-picker .v3-input-picker-root .v3-emoji-picker-textarea{width:100%;height:40px;border:1px solid #999;padding-left:15px}.v3-input-emoji-picker .v3-input-picker-root .v3-emoji-picker-textarea{min-height:80px;resize:vertical}.v3-input-emoji-picker .v3-input-picker-root .v3-emoji-picker-textarea+.v3-input-picker-wrap .v3-input-picker-icon{top:auto;bottom:5px}.v3-input-emoji-picker .v3-input-picker-root .v3-input-picker-wrap .v3-input-picker-icon{display:inline-flex;position:absolute;right:5px;top:50%;transform:translateY(-50%);font-size:24px;border:none;background:none;padding:0 5px;cursor:pointer}.v3-input-emoji-picker .v3-input-picker-root .v3-input-picker-wrap .v3-input-picker-icon img{display:block;width:1em;height:1em}.v3-input-emoji-picker .v3-input-picker-root .v3-input-picker-wrap .v3-emoji-picker{opacity:0;visibility:hidden;transition:.2s}.v3-input-emoji-picker .v3-input-picker-root .v3-input-picker-wrap.v3-picker-is-open .v3-emoji-picker{opacity:1;visibility:visible;z-index:999}.v3-emoji-picker{--v3-picker-bg: #ffffff;--v3-picker-fg: #000000;--v3-picker-border: #dddddd;--v3-picker-input-bg: var(--v3-picker-bg);--v3-picker-input-border: #cccccc;--v3-picker-input-focus-border: #000000;--v3-group-image-filter: none;--v3-picker-emoji-hover: #f7f7f7;background:var(--v3-picker-bg);color:var(--v3-picker-fg)}.v3-emoji-picker .v3-footer,.v3-emoji-picker .v3-header{border-color:var(--v3-picker-border)}.v3-emoji-picker .v3-groups{filter:var(--v3-group-image-filter)}.v3-emoji-picker .v3-tone{color:var(--v3-picker-fg)}.v3-emoji-picker .v3-search input{background:var(--v3-picker-input-bg);border-color:var(--v3-picker-input-border);color:inherit}.v3-emoji-picker .v3-search input:focus{border-color:var(--v3-picker-input-focus-border)}.v3-emoji-picker .v3-body .v3-body-inner .v3-group h5,.v3-emoji-picker .v3-skin-tones{background:var(--v3-picker-bg)}.v3-emoji-picker .v3-body .v3-body-inner .v3-group .v3-emojis button:hover{background:var(--v3-picker-emoji-hover, #f7f7f7)}@media (prefers-color-scheme: dark){.v3-emoji-picker.v3-color-theme-auto{--v3-picker-bg: #000000;--v3-picker-fg: #ffffff;--v3-picker-border: #333333;--v3-picker-input-bg: #222222;--v3-picker-input-border: #444444;--v3-picker-input-focus-border: #555555;--v3-group-image-filter: invert(1);--v3-picker-emoji-hover: #222222}}.v3-emoji-picker.v3-color-theme-dark{--v3-picker-bg: #000000;--v3-picker-fg: #ffffff;--v3-picker-border: #333333;--v3-picker-input-bg: #222222;--v3-picker-input-border: #444444;--v3-picker-input-focus-border: #555555;--v3-group-image-filter: invert(1);--v3-picker-emoji-hover: #222222}\n\n.chat-room[data-v-1459079f] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: #fff;\n}\n.chat-room-header[data-v-1459079f] {\n display: flex;\n gap: 12px;\n align-items: center;\n\n padding: 8px 20px;\n border-bottom: 1px solid #e8e8e8;\n\n background: linear-gradient(180deg, #fff 0%, #fafafa 100%);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n}\n.back-btn[data-v-1459079f] {\n cursor: pointer;\n\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n\n width: 36px;\n height: 36px;\n border: none;\n border-radius: 50%;\n\n font-size: 16px;\n color: #595959;\n\n background: #f0f0f0;\n\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.back-btn[data-v-1459079f]:hover {\n transform: scale(1.05);\n color: #0e77cc;\n background: #e8e8e8;\n}\n.back-btn[data-v-1459079f]:active {\n transform: scale(0.95);\n}\n.title[data-v-1459079f] {\n display: flex;\n flex: 1;\n gap: 12px;\n align-items: center;\n}\n.header-actions[data-v-1459079f] {\n display: flex;\n flex-shrink: 0;\n align-items: flex-end;\n}\n.end-session-btn[data-v-1459079f] {\n cursor: pointer;\n\n min-width: 90px;\n height: 32px;\n padding: 0 12px;\n border: 1px solid #ffd6d6;\n border-radius: 16px;\n\n font-size: 13px;\n font-weight: 500;\n color: #d4380d;\n\n background: #fff2f0;\n\n transition: all 0.2s ease;\n}\n.end-session-btn[data-v-1459079f]:hover:not(:disabled) {\n border-color: #ffb3ad;\n background: #ffe7e2;\n}\n.end-session-btn[data-v-1459079f]:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n.avatar-wrapper[data-v-1459079f] {\n position: relative;\n flex-shrink: 0;\n width: 42px;\n height: 42px;\n}\n.avatar-img[data-v-1459079f] {\n width: 100%;\n height: 100%;\n border: 2px solid white;\n border-radius: 50%;\n\n object-fit: cover;\n background: linear-gradient(135deg, #f0f0f0 0%, #e8e8e8 100%);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n.avatar-text[data-v-1459079f] {\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 42px;\n height: 42px;\n border: 2px solid white;\n border-radius: 50%;\n\n font-size: 16px;\n font-weight: 600;\n color: white;\n\n background: linear-gradient(135deg, #0e77cc 0%, #0d6db8 100%);\n box-shadow: 0 2px 8px rgba(14, 119, 204, 0.3);\n}\n.user-info[data-v-1459079f] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n.name[data-v-1459079f] {\n font-size: 15px;\n font-weight: 600;\n color: #262626;\n letter-spacing: 0.2px;\n}\n.messages[data-v-1459079f] {\n position: relative;\n\n overflow-y: auto;\n flex: 1;\n\n padding: 24px 20px;\n\n background: linear-gradient(180deg, #f5f5f5 0%, #fafafa 100%);\n}\n\n/* 自定义滚动条 */\n.messages[data-v-1459079f]::-webkit-scrollbar {\n width: 6px;\n}\n.messages[data-v-1459079f]::-webkit-scrollbar-track {\n background: transparent;\n}\n.messages[data-v-1459079f]::-webkit-scrollbar-thumb {\n border-radius: 3px;\n background: #d9d9d9;\n}\n.messages[data-v-1459079f]::-webkit-scrollbar-thumb:hover {\n background: #bfbfbf;\n}\n.loading-more[data-v-1459079f] {\n display: flex;\n gap: 8px;\n align-items: center;\n justify-content: center;\n\n padding: 16px;\n\n font-size: 13px;\n color: #8c8c8c;\n}\n.loading-spinner-small[data-v-1459079f] {\n width: 20px;\n height: 20px;\n border: 2px solid #f0f0f0;\n border-top: 2px solid #0e77cc;\n border-radius: 50%;\n\n animation: spin-1459079f 0.8s linear infinite;\n}\n.no-more[data-v-1459079f] {\n padding: 12px;\n font-size: 12px;\n color: #bfbfbf;\n text-align: center;\n}\n.loading-state[data-v-1459079f] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n padding: 60px 20px;\n\n color: #bfbfbf;\n}\n.loading-spinner[data-v-1459079f] {\n width: 40px;\n height: 40px;\n margin-bottom: 16px;\n border: 3px solid #f0f0f0;\n border-top: 3px solid #0e77cc;\n border-radius: 50%;\n\n animation: spin-1459079f 0.8s linear infinite;\n}\n@keyframes spin-1459079f {\n0% { transform: rotate(0deg);\n}\n100% { transform: rotate(360deg);\n}\n}\n.empty-messages[data-v-1459079f] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n height: 100%;\n\n color: #bfbfbf;\n}\n.empty-messages .icon[data-v-1459079f] {\n margin-bottom: 16px;\n font-size: 64px;\n opacity: 0.5;\n}\n.empty-messages p[data-v-1459079f] {\n margin: 0;\n font-size: 14px;\n font-weight: 400;\n}\n.message-item[data-v-1459079f] {\n display: flex;\n gap: 12px;\n margin-bottom: 24px;\n animation: slide-in-1459079f 0.3s ease-out;\n}\n@keyframes slide-in-1459079f {\nfrom {\n transform: translateY(10px);\n opacity: 0;\n}\nto {\n transform: translateY(0);\n opacity: 1;\n}\n}\n.message-item.is-self[data-v-1459079f] {\n justify-content: flex-end;\n}\n.msg-avatar-wrapper[data-v-1459079f] {\n position: relative;\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n}\n.msg-avatar-img[data-v-1459079f] {\n width: 100%;\n height: 100%;\n border: 2px solid white;\n border-radius: 50%;\n\n object-fit: cover;\n background: linear-gradient(135deg, #f0f0f0 0%, #e8e8e8 100%);\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);\n}\n.msg-avatar[data-v-1459079f] {\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 40px;\n height: 40px;\n border: 2px solid white;\n border-radius: 50%;\n\n font-size: 15px;\n font-weight: 600;\n color: white;\n\n background: linear-gradient(135deg, #0e77cc 0%, #0d6db8 100%);\n box-shadow: 0 2px 6px rgba(14, 119, 204, 0.3);\n}\n.message-content-wrapper[data-v-1459079f] {\n display: flex;\n flex-direction: column;\n max-width: 65%;\n}\n.is-self .message-content-wrapper[data-v-1459079f] {\n align-items: flex-end;\n}\n.message-sender[data-v-1459079f] {\n margin-bottom: 6px;\n font-size: 12px;\n font-weight: 400;\n color: #8c8c8c;\n}\n.message-content[data-v-1459079f] {\n padding: 12px 16px;\n border-radius: 12px;\n\n background-color: white;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n\n transition: all 0.2s;\n}\n.message-item.is-self .message-content[data-v-1459079f] {\n color: white;\n background: linear-gradient(135deg, #0e77cc 0%, #0d6db8 100%);\n box-shadow: 0 2px 8px rgba(14, 119, 204, 0.25);\n}\n.message-text[data-v-1459079f] {\n margin-bottom: 6px;\n\n font-size: 14px;\n line-height: 1.6;\n color: #262626;\n overflow-wrap: break-word;\n}\n.message-item.is-self .message-text[data-v-1459079f] {\n color: white;\n}\n\n/* 图片消息 */\n.message-image[data-v-1459079f] {\n margin-bottom: 6px;\n}\n.message-image img[data-v-1459079f] {\n cursor: pointer;\n\n max-width: 300px;\n max-height: 300px;\n border-radius: 8px;\n\n object-fit: cover;\n\n transition: transform 0.2s;\n}\n.message-image img[data-v-1459079f]:hover {\n transform: scale(1.02);\n}\n\n/* 表情消息 */\n.message-emoji[data-v-1459079f] {\n display: flex;\n align-items: center;\n justify-content: center;\n\n min-height: 60px;\n margin-bottom: 6px;\n\n font-size: 48px;\n line-height: 1;\n}\n\n/* 文件消息 */\n.message-file[data-v-1459079f] {\n margin-bottom: 6px;\n}\n.file-link[data-v-1459079f] {\n display: inline-flex;\n gap: 8px;\n align-items: center;\n\n padding: 12px 16px;\n border-radius: 8px;\n\n font-size: 14px;\n font-weight: 500;\n color: #262626;\n text-decoration: none;\n\n background-color: #f5f5f5;\n\n transition: all 0.2s;\n}\n.file-link[data-v-1459079f]:hover {\n color: #0e77cc;\n background-color: #e8e8e8;\n}\n.is-self .file-link[data-v-1459079f] {\n color: white;\n background-color: rgba(255, 255, 255, 0.2);\n}\n.is-self .file-link[data-v-1459079f]:hover {\n background-color: rgba(255, 255, 255, 0.3);\n}\n\n/* 系统通知 */\n.message-system[data-v-1459079f] {\n margin-bottom: 6px;\n padding: 8px 12px;\n border-left: 3px solid #0e77cc;\n border-radius: 6px;\n\n font-size: 13px;\n color: #8c8c8c;\n text-align: center;\n\n background-color: #f5f5f5;\n}\n.is-self .message-system[data-v-1459079f] {\n border-left-color: white;\n color: rgba(255, 255, 255, 0.9);\n background-color: rgba(255, 255, 255, 0.2);\n}\n\n/* 卡片消息 */\n.message-card[data-v-1459079f] {\n margin-bottom: 6px;\n padding: 12px;\n border: 1px solid #bae6fd;\n border-radius: 8px;\n\n background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%);\n}\n.is-self .message-card[data-v-1459079f] {\n border-color: rgba(255, 255, 255, 0.3);\n background: rgba(255, 255, 255, 0.2);\n}\n.message-time[data-v-1459079f] {\n font-size: 11px;\n color: #8c8c8c;\n}\n.message-item.is-self .message-time[data-v-1459079f] {\n color: rgba(255, 255, 255, 0.75);\n}\n.input-area[data-v-1459079f] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n\n padding: 16px 20px;\n border-top: 1px solid #e8e8e8;\n\n background: white;\n box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.04);\n}\n\n/* 工具栏 */\n.input-toolbar[data-v-1459079f] {\n display: flex;\n gap: 8px;\n padding: 4px 0;\n}\n.tool-btn[data-v-1459079f] {\n cursor: pointer;\n\n display: inline-flex;\n gap: 6px;\n align-items: center;\n\n padding: 8px 14px;\n border: 1.5px solid #e8e8e8;\n border-radius: 8px;\n\n font-size: 13px;\n font-weight: 500;\n color: #595959;\n\n background: white;\n outline: none;\n\n transition: all 0.2s;\n}\n.tool-btn[data-v-1459079f]:hover:not(:disabled) {\n border-color: #0e77cc;\n color: #0e77cc;\n background: #f0f9ff;\n}\n.tool-btn[data-v-1459079f]:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n background: #f5f5f5;\n}\n.tool-btn-text[data-v-1459079f] {\n font-size: 13px;\n}\n.tool-btn-icon[data-v-1459079f] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n width: 18px;\n height: 18px;\n}\n.tool-btn-svg[data-v-1459079f] {\n width: 18px;\n height: 18px;\n}\n.image-btn[data-v-1459079f] {\n border-color: #d9d9d9;\n}\n.emoji-container[data-v-1459079f] {\n position: relative;\n}\n.quick-reply-container[data-v-1459079f] {\n position: relative;\n}\n.quick-reply-trigger[data-v-1459079f] {\n border-color: #d9d9d9;\n}\n.quick-reply-trigger.active[data-v-1459079f] {\n border-color: #0e77cc;\n color: #0e77cc;\n background: #f0f9ff;\n}\n.quick-reply-panel[data-v-1459079f] {\n position: absolute;\n z-index: 1001;\n bottom: calc(100% + 8px);\n left: 0;\n\n overflow: hidden;\n\n width: 320px;\n max-width: min(320px, calc(100vw - 80px));\n border: 1px solid #e8e8e8;\n border-radius: 10px;\n\n background: #fff;\n box-shadow: 0 8px 30px rgba(0, 0, 0, 0.12);\n}\n.quick-reply-search[data-v-1459079f] {\n padding: 10px;\n border-bottom: 1px solid #f0f0f0;\n}\n.quick-reply-search input[data-v-1459079f] {\n width: 100%;\n height: 34px;\n padding: 0 10px;\n border: 1px solid #d9d9d9;\n border-radius: 8px;\n\n font-size: 13px;\n color: #595959;\n\n background: #fff;\n outline: none;\n}\n.quick-reply-search input[data-v-1459079f]:focus {\n border-color: #0e77cc;\n box-shadow: 0 0 0 2px rgba(14, 119, 204, 0.08);\n}\n.quick-reply-list[data-v-1459079f] {\n overflow-y: auto;\n max-height: 220px;\n padding: 8px;\n}\n.quick-reply-item[data-v-1459079f] {\n cursor: pointer;\n\n width: 100%;\n margin-bottom: 6px;\n padding: 8px 10px;\n border: 1px solid transparent;\n border-radius: 8px;\n\n font-size: 13px;\n line-height: 1.45;\n color: #595959;\n text-align: left;\n\n background: #f7f8fa;\n}\n.quick-reply-item[data-v-1459079f]:last-child {\n margin-bottom: 0;\n}\n.quick-reply-item[data-v-1459079f]:hover {\n border-color: #b6dcfa;\n color: #0e77cc;\n background: #f0f9ff;\n}\n.quick-reply-empty[data-v-1459079f] {\n padding: 18px 10px;\n font-size: 12px;\n color: #bfbfbf;\n text-align: center;\n}\n.emoji-picker-wrapper[data-v-1459079f] {\n position: absolute;\n z-index: 1000;\n bottom: 100%;\n left: 0;\n\n overflow: hidden;\n\n margin-bottom: 8px;\n border-radius: 8px;\n\n box-shadow: 0 8px 30px rgba(0, 0, 0, 0.15);\n}\n.input-area textarea[data-v-1459079f] {\n resize: none;\n\n width: 100%;\n padding: 12px 14px;\n border: 1.5px solid #e8e8e8;\n border-radius: 8px;\n\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n font-size: 14px;\n line-height: 1.5;\n\n background: #fafafa;\n outline: none;\n\n transition: all 0.2s;\n}\n.input-area textarea[data-v-1459079f]:focus {\n border-color: #0e77cc;\n background: white;\n box-shadow: 0 0 0 3px rgba(14, 119, 204, 0.08);\n}\n.input-area textarea[data-v-1459079f]::placeholder {\n color: #bfbfbf;\n}\n.input-actions[data-v-1459079f] {\n display: flex;\n justify-content: flex-end;\n}\n.send-btn[data-v-1459079f] {\n cursor: pointer;\n\n padding: 10px 28px;\n border: none;\n border-radius: 8px;\n\n font-size: 14px;\n font-weight: 500;\n color: white;\n letter-spacing: 0.3px;\n\n background: linear-gradient(135deg, #0e77cc 0%, #0d6db8 100%);\n box-shadow: 0 2px 6px rgba(14, 119, 204, 0.25);\n\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.send-btn[data-v-1459079f]:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(14, 119, 204, 0.35);\n}\n.send-btn[data-v-1459079f]:active {\n transform: translateY(0);\n box-shadow: 0 2px 6px rgba(14, 119, 204, 0.25);\n}\n\n.conversation-list[data-v-66bc5469] {\n overflow-y: auto;\n display: flex;\n flex: 1;\n flex-direction: column;\n\n background: #fff;\n}\n\n/* 自定义滚动条 */\n.conversation-list[data-v-66bc5469]::-webkit-scrollbar {\n width: 6px;\n}\n.conversation-list[data-v-66bc5469]::-webkit-scrollbar-track {\n background: transparent;\n}\n.conversation-list[data-v-66bc5469]::-webkit-scrollbar-thumb {\n border-radius: 3px;\n background: #d9d9d9;\n}\n.conversation-list[data-v-66bc5469]::-webkit-scrollbar-thumb:hover {\n background: #bfbfbf;\n}\n.unread-header[data-v-66bc5469] {\n padding: 8px 20px;\n border-bottom: 1px solid #e8e8e8;\n background: linear-gradient(180deg, #fafafa 0%, #fff 100%);\n}\n.unread-count[data-v-66bc5469] {\n font-size: 15px;\n font-weight: 600;\n color: #262626;\n letter-spacing: 0.3px;\n}\n.search-header[data-v-66bc5469] {\n padding: 10px 16px;\n border-bottom: 1px solid #f0f0f0;\n background: #fff;\n}\n.search-input[data-v-66bc5469] {\n box-sizing: border-box;\n width: 100%;\n height: 36px;\n padding: 0 12px;\n border: 1px solid #d9d9d9;\n border-radius: 8px;\n\n font-size: 13px;\n color: #262626;\n\n background: #fff;\n outline: none;\n\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n}\n.search-input[data-v-66bc5469]::placeholder {\n color: #bfbfbf;\n}\n.search-input[data-v-66bc5469]:focus {\n border-color: #0e77cc;\n box-shadow: 0 0 0 2px rgb(14 119 204 / 12%);\n}\n.loading-state[data-v-66bc5469] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n padding: 60px 20px;\n\n color: #bfbfbf;\n}\n.loading-spinner[data-v-66bc5469] {\n width: 40px;\n height: 40px;\n margin-bottom: 16px;\n border: 3px solid #f0f0f0;\n border-top: 3px solid #0e77cc;\n border-radius: 50%;\n\n animation: spin-66bc5469 0.8s linear infinite;\n}\n@keyframes spin-66bc5469 {\n0% { transform: rotate(0deg);\n}\n100% { transform: rotate(360deg);\n}\n}\n.empty-state[data-v-66bc5469] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n height: 100%;\n padding: 40px 20px;\n\n color: #bfbfbf;\n}\n.empty-icon[data-v-66bc5469] {\n width: 64px;\n height: 64px;\n margin-bottom: 16px;\n opacity: 0.5;\n}\n.empty-state p[data-v-66bc5469] {\n margin: 0;\n font-size: 14px;\n font-weight: 400;\n}\n.conversation-item[data-v-66bc5469] {\n cursor: pointer;\n\n position: relative;\n\n padding: 12px 16px;\n border-bottom: 1px solid #f0f0f0;\n\n background: white;\n\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.conversation-item[data-v-66bc5469]:hover {\n background-color: #f5f7fa;\n}\n.conversation-item.active[data-v-66bc5469] {\n padding-left: 13px;\n border-left: 3px solid #0e77cc;\n background: linear-gradient(90deg, #ecf5ff 0%, #fff 100%);\n}\n.conversation-item[data-v-66bc5469]:last-child {\n border-bottom: none;\n}\n\n/* 会话项内容布局 */\n.conversation-item-content[data-v-66bc5469] {\n display: flex;\n gap: 12px;\n align-items: center;\n width: 100%;\n}\n.avatar-wrapper[data-v-66bc5469] {\n position: relative;\n flex-shrink: 0;\n width: 44px;\n height: 44px;\n}\n.avatar-img[data-v-66bc5469] {\n width: 100%;\n height: 100%;\n border: 2px solid white;\n border-radius: 50%;\n\n object-fit: cover;\n background: linear-gradient(135deg, #f0f0f0 0%, #e8e8e8 100%);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n.avatar-text[data-v-66bc5469] {\n position: absolute;\n top: 0;\n left: 0;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 44px;\n height: 44px;\n border: 2px solid white;\n border-radius: 50%;\n\n font-size: 16px;\n font-weight: 600;\n color: white;\n\n background: linear-gradient(135deg, #0e77cc 0%, #0d6db8 100%);\n box-shadow: 0 2px 8px rgba(14, 119, 204, 0.3);\n}\n.session-info[data-v-66bc5469] {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: 4px;\n justify-content: center;\n\n min-width: 0;\n}\n.session-name[data-v-66bc5469] {\n font-size: 14px;\n font-weight: 600;\n color: #262626;\n letter-spacing: 0.2px;\n}\n.content-text[data-v-66bc5469] {\n overflow: hidden;\n display: block;\n\n font-size: 13px;\n line-height: 1.4;\n color: #595959;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.session-meta[data-v-66bc5469] {\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n gap: 6px;\n align-items: flex-end;\n}\n.session-time[data-v-66bc5469] {\n font-size: 12px;\n font-weight: 400;\n color: #8c8c8c;\n}\n.unread-badge[data-v-66bc5469] {\n display: flex;\n align-items: center;\n justify-content: center;\n\n min-width: 20px;\n height: 20px;\n margin-left: 8px;\n padding: 0 7px;\n border-radius: 10px;\n\n font-size: 12px;\n font-weight: 600;\n color: white;\n\n background: linear-gradient(135deg, #ff4d4f 0%, #ff7875 100%);\n box-shadow: 0 2px 6px rgba(255, 77, 79, 0.3);\n\n animation: pulse-66bc5469 2s ease-in-out infinite;\n}\n@keyframes pulse-66bc5469 {\n0%, 100% {\n transform: scale(1);\n}\n50% {\n transform: scale(1.05);\n}\n}\n\n.chat-window[data-v-00d50ef7] {\n position: fixed;\n z-index: 9998;\n\n overflow: hidden;\n display: flex;\n flex-direction: column;\n\n min-width: 380px;\n min-height: 360px;\n border: 1px solid rgba(9, 62, 105, 0.14);\n border-radius: 18px;\n\n background: linear-gradient(180deg, #fff 0%, #f9fcff 100%);\n backdrop-filter: blur(6px);\n box-shadow: 0 24px 80px rgba(11, 58, 106, 0.24);\n\n animation: window-enter-00d50ef7 0.22s ease-out;\n}\n.chat-window.is-dragging[data-v-00d50ef7] {\n cursor: move;\n box-shadow: 0 28px 88px rgba(11, 58, 106, 0.28);\n}\n.chat-window.is-resizing[data-v-00d50ef7] {\n cursor: nwse-resize;\n}\n.chat-header[data-v-00d50ef7] {\n cursor: move;\n user-select: none;\n\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: space-between;\n\n padding: 10px 20px;\n\n color: white;\n\n background: linear-gradient(135deg, #0f83df 0%, #0e6fbe 62%, #0c5fa5 100%);\n box-shadow: 0 2px 12px rgba(14, 119, 204, 0.26);\n}\n\n/* 用户信息区域 */\n.user-info-section[data-v-00d50ef7] {\n display: flex;\n flex: 1;\n gap: 12px;\n align-items: center;\n}\n.user-avatar-wrapper[data-v-00d50ef7] {\n position: relative;\n flex-shrink: 0;\n width: 40px;\n height: 40px;\n}\n.user-avatar[data-v-00d50ef7] {\n width: 100%;\n height: 100%;\n border: 2px solid rgba(255, 255, 255, 0.3);\n border-radius: 50%;\n\n object-fit: cover;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n}\n.user-avatar-default[data-v-00d50ef7] {\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 40px;\n height: 40px;\n border: 2px solid rgba(255, 255, 255, 0.3);\n border-radius: 50%;\n\n font-size: 16px;\n font-weight: 600;\n color: white;\n\n background: linear-gradient(135deg, rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0.1) 100%);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n}\n.status-indicator[data-v-00d50ef7] {\n cursor: pointer;\n\n position: absolute;\n right: -2px;\n bottom: -2px;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 14px;\n height: 14px;\n border: 2px solid white;\n border-radius: 50%;\n\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\n\n transition: transform 0.2s;\n}\n.status-indicator[data-v-00d50ef7]:hover {\n transform: scale(1.15);\n}\n.status-indicator svg[data-v-00d50ef7] {\n width: 8px;\n height: 8px;\n}\n\n/* 状态下拉菜单 */\n.status-dropdown[data-v-00d50ef7] {\n position: absolute;\n z-index: 100;\n top: 100%;\n left: 0;\n\n min-width: 120px;\n margin-top: 8px;\n padding: 6px;\n border: 1px solid #dbe7f5;\n border-radius: 10px;\n\n background: white;\n box-shadow: 0 12px 30px rgba(11, 58, 106, 0.18);\n}\n.status-option[data-v-00d50ef7] {\n cursor: pointer;\n\n display: flex;\n gap: 8px;\n align-items: center;\n\n padding: 8px 10px;\n border-radius: 6px;\n\n color: #262626;\n\n transition: all 0.2s;\n}\n.status-option[data-v-00d50ef7]:hover {\n background: #f5f5f5;\n}\n.status-option.active[data-v-00d50ef7] {\n color: #0e77cc;\n background: #e6f7ff;\n}\n.status-dot[data-v-00d50ef7] {\n flex-shrink: 0;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n}\n.status-option span[data-v-00d50ef7] {\n flex: 1;\n font-size: 13px;\n}\n.check-icon[data-v-00d50ef7] {\n width: 16px;\n height: 16px;\n opacity: 0.8;\n}\n.user-details[data-v-00d50ef7] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n.user-name[data-v-00d50ef7] {\n font-size: 14px;\n font-weight: 600;\n letter-spacing: 0.2px;\n}\n.user-status[data-v-00d50ef7] {\n font-size: 12px;\n font-weight: 400;\n opacity: 0.9;\n}\n.close-btn[data-v-00d50ef7] {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 32px;\n height: 32px;\n border: none;\n border-radius: 8px;\n\n font-size: 28px;\n line-height: 1;\n color: white;\n\n opacity: 0.8;\n background: none;\n\n transition: all 0.2s;\n}\n.close-btn[data-v-00d50ef7]:hover {\n transform: rotate(90deg);\n opacity: 1;\n background: rgba(255, 255, 255, 0.15);\n}\n.close-btn[data-v-00d50ef7]:active {\n transform: rotate(90deg) scale(0.95);\n}\n.chat-body[data-v-00d50ef7] {\n overflow: hidden;\n display: flex;\n flex: 1;\n\n min-height: 0;\n\n background: linear-gradient(180deg, #fbfdff 0%, #f4f8fc 100%);\n}\n\n/* 第一栏:一级菜单 */\n.first-sidebar[data-v-00d50ef7] {\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n\n width: 76px;\n padding: 0;\n border-right: 1px solid #dce8f3;\n\n background: linear-gradient(180deg, #f5f9ff 0%, #f0f6fd 100%);\n}\n.menu-items-container[data-v-00d50ef7] {\n display: flex;\n flex: 1;\n flex-direction: column;\n align-items: center;\n\n padding: 18px 0;\n}\n.menu-item[data-v-00d50ef7] {\n cursor: pointer;\n\n position: relative;\n\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n\n width: 50px;\n height: 50px;\n margin-bottom: 12px;\n border: 1px solid transparent;\n border-radius: 12px;\n\n font-weight: 400;\n color: #7d8fa3;\n\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.menu-item[data-v-00d50ef7]:last-child {\n margin-bottom: 0;\n}\n.menu-item[data-v-00d50ef7]:hover {\n transform: translateY(-1px);\n border-color: #d2e3f3;\n color: #0e77cc;\n background: #f7fbff;\n}\n.menu-item.active[data-v-00d50ef7] {\n border-color: #0e77cc;\n color: white;\n background: linear-gradient(135deg, #0f83df 0%, #0d6db8 100%);\n box-shadow: 0 8px 20px rgba(14, 119, 204, 0.35);\n}\n.menu-item.active[data-v-00d50ef7]::before {\n content: '';\n\n position: absolute;\n top: 50%;\n left: -11px;\n transform: translateY(-50%);\n\n width: 3px;\n height: 24px;\n border-radius: 2px;\n\n background: #0e77cc;\n}\n.menu-item .icon[data-v-00d50ef7] {\n width: 23px;\n height: 23px;\n}\n.menu-item .label[data-v-00d50ef7] {\n display: none;\n}\n.menu-item .menu-badge[data-v-00d50ef7] {\n position: absolute;\n top: 6px;\n right: 6px;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n min-width: 16px;\n height: 16px;\n padding: 0 5px;\n border: 2px solid white;\n border-radius: 8px;\n\n font-size: 10px;\n font-weight: 600;\n line-height: 1;\n color: white;\n\n background: linear-gradient(135deg, #ff4d4f 0%, #ff7875 100%);\n box-shadow: 0 2px 6px rgba(255, 77, 79, 0.4);\n}\n.menu-item.active .menu-badge[data-v-00d50ef7] {\n border-color: #0e77cc;\n color: #ff4d4f;\n background: linear-gradient(135deg, #fff 0%, #f0f0f0 100%);\n}\n\n/* 第二栏:二级侧边栏 */\n.second-sidebar[data-v-00d50ef7] {\n overflow: hidden;\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n\n width: 250px;\n border-right: 1px solid #dce8f3;\n\n background: linear-gradient(180deg, #fff 0%, #fbfdff 100%);\n}\n\n/* 第三栏:聊天区域 */\n.chat-area[data-v-00d50ef7] {\n overflow: hidden;\n display: flex;\n flex: 1;\n flex-direction: column;\n\n min-width: 0;\n\n background: radial-gradient(circle at top right, rgba(14, 119, 204, 0.08) 0%, rgba(255, 255, 255, 0) 42%), #fff;\n}\n.empty-chat[data-v-00d50ef7] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n height: 100%;\n\n color: #8ca1b8;\n\n background: linear-gradient(180deg, #f7fbff 0%, #fff 100%);\n}\n.empty-chat .empty-icon[data-v-00d50ef7] {\n width: 72px;\n height: 72px;\n margin-bottom: 18px;\n\n opacity: 0.5;\n filter: drop-shadow(0 8px 20px rgba(11, 58, 106, 0.16));\n}\n.empty-chat p[data-v-00d50ef7] {\n margin: 0;\n font-size: 15px;\n font-weight: 500;\n letter-spacing: 0.3px;\n}\n\n/* 拉伸手柄 */\n.resize-handle[data-v-00d50ef7] {\n cursor: nwse-resize;\n\n position: absolute;\n z-index: 9999;\n right: 0;\n bottom: 0;\n\n width: 24px;\n height: 24px;\n\n opacity: 0.5;\n\n transition: opacity 0.2s;\n}\n.resize-handle[data-v-00d50ef7]:hover {\n opacity: 1;\n}\n.resize-handle[data-v-00d50ef7]::after {\n content: '';\n\n position: absolute;\n right: 6px;\n bottom: 6px;\n\n width: 0;\n height: 0;\n border-top: 10px solid transparent;\n border-right: 10px solid #0e77cc;\n border-bottom: 10px solid #0e77cc;\n border-left: 10px solid transparent;\n\n opacity: 0.6;\n filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.1));\n}\n@keyframes window-enter-00d50ef7 {\nfrom {\n transform: translate3d(0, 16px, 0) scale(0.98);\n opacity: 0;\n}\nto {\n transform: translate3d(0, 0, 0) scale(1);\n opacity: 1;\n}\n}\n@media (width <= 960px) {\n.second-sidebar[data-v-00d50ef7] {\n width: 220px;\n}\n}\n\n.float-button[data-v-a60f9c33] {\n touch-action: none;\n cursor: grab;\n user-select: none;\n\n position: fixed;\n z-index: 9999;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 64px;\n height: 64px;\n border: 1px solid #0e77cc;\n border-radius: 50%;\n\n background: #fff;\n box-shadow: 0 4px 20px rgba(14, 119, 204, 0.3);\n\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.float-button.is-hidden[data-v-a60f9c33] {\n pointer-events: none;\n transform: scale(0.88);\n opacity: 0;\n}\n.float-button[data-v-a60f9c33]:hover {\n transform: translateY(-2px);\n box-shadow: 0 6px 30px rgba(14, 119, 204, 0.4);\n}\n.float-button[data-v-a60f9c33]:active {\n transform: translateY(0) scale(0.95);\n}\n.float-button.is-dragging[data-v-a60f9c33] {\n cursor: grabbing;\n transform: scale(1.08);\n box-shadow: 0 8px 35px rgba(14, 119, 204, 0.35);\n}\n.float-button .icon[data-v-a60f9c33] {\n pointer-events: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 32px;\n height: 32px;\n\n filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.1));\n}\n.float-button .icon img[data-v-a60f9c33] {\n width: 100%;\n height: 100%;\n object-fit: contain;\n}\n.float-button .badge[data-v-a60f9c33] {\n pointer-events: none;\n\n position: absolute;\n top: 4px;\n right: 4px;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n border: 2.5px solid white;\n border-radius: 10px;\n\n font-size: 11px;\n font-weight: 600;\n line-height: 1;\n color: white;\n\n background: linear-gradient(135deg, #ff4d4f 0%, #ff7875 100%);\n box-shadow: 0 2px 8px rgba(255, 77, 79, 0.4);\n}\n.float-button.has-unread[data-v-a60f9c33] {\n animation: pulse-a60f9c33 2s ease-in-out infinite;\n}\n@keyframes pulse-a60f9c33 {\n0%, 100% {\n box-shadow: 0 4px 20px rgba(14, 119, 204, 0.3),\n 0 0 0 0 rgba(255, 77, 79, 0.4);\n}\n50% {\n box-shadow: 0 4px 20px rgba(14, 119, 204, 0.3),\n 0 0 0 12px rgba(255, 77, 79, 0);\n}\n}\n/*$vite$:1*/"
|
|
2
2
|
if (typeof document !== 'undefined' && __SHARED_IMSDK_CSS__) {
|
|
3
3
|
const __SHARED_IMSDK_STYLE_ID__ = 'zjw-jszn-shared-imsdk-style'
|
|
4
4
|
if (!document.getElementById(__SHARED_IMSDK_STYLE_ID__)) {
|
|
@@ -5722,6 +5722,7 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
5722
5722
|
var defaultConfig = {
|
|
5723
5723
|
api: {
|
|
5724
5724
|
baseURL: "https://aox.api.orchiport.asia",
|
|
5725
|
+
resourceBaseURL: "https://resource.api.orchiport.asia",
|
|
5725
5726
|
prefix: "",
|
|
5726
5727
|
uploadURL: "https://resource.api.orchiport.asia/system/uploadImage",
|
|
5727
5728
|
signKey: "Z0XYfLbnDpuVqk41",
|
|
@@ -5731,11 +5732,29 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
5731
5732
|
defaultSignKey: "your-default-sign-key-here"
|
|
5732
5733
|
},
|
|
5733
5734
|
ws: {
|
|
5735
|
+
url: "",
|
|
5734
5736
|
controller: "",
|
|
5735
|
-
platform: ""
|
|
5737
|
+
platform: "",
|
|
5738
|
+
reconnectInterval: 3e3,
|
|
5739
|
+
heartbeatInterval: 3e3,
|
|
5740
|
+
maxReconnectAttempts: 5,
|
|
5741
|
+
connectTimeout: 3e4,
|
|
5742
|
+
traceEnabled: false,
|
|
5743
|
+
protocol: {
|
|
5744
|
+
controller: "",
|
|
5745
|
+
action: {
|
|
5746
|
+
send: "send",
|
|
5747
|
+
msgRead: "msgRead",
|
|
5748
|
+
onConnect: "onConnect",
|
|
5749
|
+
offLine: "offLine",
|
|
5750
|
+
heartbeat: "heartbeat"
|
|
5751
|
+
},
|
|
5752
|
+
heartbeatSignals: ["ping", "pong"]
|
|
5753
|
+
}
|
|
5736
5754
|
},
|
|
5737
5755
|
sound: { enabled: true },
|
|
5738
5756
|
auth: { authorizationPayload: {} },
|
|
5757
|
+
chat: { platformServicePhone: "" },
|
|
5739
5758
|
runtimeApi: {}
|
|
5740
5759
|
};
|
|
5741
5760
|
var currentConfig = defaultConfig;
|
|
@@ -5749,28 +5768,37 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
5749
5768
|
* 更新配置
|
|
5750
5769
|
*/
|
|
5751
5770
|
function updateConfig(config) {
|
|
5752
|
-
var _ref, _config$sound$enabled, _config$sound, _currentConfig$sound, _config$sound$url, _config$sound2, _currentConfig$sound2, _currentConfig$auth, _config$auth;
|
|
5771
|
+
var _config$ws, _config$ws2, _config$ws$protocol$h, _config$ws3, _ref, _config$sound$enabled, _config$sound, _currentConfig$sound, _config$sound$url, _config$sound2, _currentConfig$sound2, _currentConfig$auth, _config$auth;
|
|
5753
5772
|
currentConfig = _objectSpread2(_objectSpread2(_objectSpread2({}, currentConfig), config), {}, {
|
|
5754
5773
|
api: _objectSpread2(_objectSpread2({}, currentConfig.api), config.api),
|
|
5755
|
-
ws: _objectSpread2(_objectSpread2({}, currentConfig.ws), config.ws),
|
|
5774
|
+
ws: _objectSpread2(_objectSpread2(_objectSpread2({}, currentConfig.ws), config.ws), {}, { protocol: _objectSpread2(_objectSpread2(_objectSpread2({}, currentConfig.ws.protocol), (_config$ws = config.ws) === null || _config$ws === void 0 ? void 0 : _config$ws.protocol), {}, {
|
|
5775
|
+
action: _objectSpread2(_objectSpread2({}, currentConfig.ws.protocol.action), ((_config$ws2 = config.ws) === null || _config$ws2 === void 0 || (_config$ws2 = _config$ws2.protocol) === null || _config$ws2 === void 0 ? void 0 : _config$ws2.action) || {}),
|
|
5776
|
+
heartbeatSignals: (_config$ws$protocol$h = (_config$ws3 = config.ws) === null || _config$ws3 === void 0 || (_config$ws3 = _config$ws3.protocol) === null || _config$ws3 === void 0 ? void 0 : _config$ws3.heartbeatSignals) !== null && _config$ws$protocol$h !== void 0 ? _config$ws$protocol$h : currentConfig.ws.protocol.heartbeatSignals
|
|
5777
|
+
}) }),
|
|
5756
5778
|
sound: {
|
|
5757
5779
|
enabled: (_ref = (_config$sound$enabled = (_config$sound = config.sound) === null || _config$sound === void 0 ? void 0 : _config$sound.enabled) !== null && _config$sound$enabled !== void 0 ? _config$sound$enabled : (_currentConfig$sound = currentConfig.sound) === null || _currentConfig$sound === void 0 ? void 0 : _currentConfig$sound.enabled) !== null && _ref !== void 0 ? _ref : true,
|
|
5758
5780
|
url: (_config$sound$url = (_config$sound2 = config.sound) === null || _config$sound2 === void 0 ? void 0 : _config$sound2.url) !== null && _config$sound$url !== void 0 ? _config$sound$url : (_currentConfig$sound2 = currentConfig.sound) === null || _currentConfig$sound2 === void 0 ? void 0 : _currentConfig$sound2.url
|
|
5759
5781
|
},
|
|
5760
5782
|
auth: _objectSpread2(_objectSpread2(_objectSpread2({}, currentConfig.auth), config.auth), {}, { authorizationPayload: _objectSpread2(_objectSpread2({}, ((_currentConfig$auth = currentConfig.auth) === null || _currentConfig$auth === void 0 ? void 0 : _currentConfig$auth.authorizationPayload) || {}), ((_config$auth = config.auth) === null || _config$auth === void 0 ? void 0 : _config$auth.authorizationPayload) || {}) }),
|
|
5783
|
+
chat: _objectSpread2(_objectSpread2({}, currentConfig.chat), config.chat),
|
|
5761
5784
|
runtimeApi: _objectSpread2(_objectSpread2({}, currentConfig.runtimeApi), config.runtimeApi)
|
|
5762
5785
|
});
|
|
5763
5786
|
}
|
|
5764
5787
|
var PREFIX_TRIM_REGEXP = /^\/+|\/+$/g;
|
|
5788
|
+
var URL_TRIM_REGEXP = /\/+$/g;
|
|
5789
|
+
var URL_ORIGIN_REGEXP = /^[a-z][a-z\d+\-.]*:\/\/[^/]+/i;
|
|
5790
|
+
var WS_PROTOCOL_REGEXP = /^wss?:\/\//i;
|
|
5791
|
+
var HTTPS_PROTOCOL_REGEXP = /^https:\/\//i;
|
|
5792
|
+
var HTTP_PROTOCOL_REGEXP = /^http:\/\//i;
|
|
5765
5793
|
function normalizePrefix(prefix) {
|
|
5766
5794
|
if (!prefix) return "";
|
|
5767
5795
|
return `/${prefix.replace(PREFIX_TRIM_REGEXP, "")}`;
|
|
5768
5796
|
}
|
|
5769
|
-
var STORE_API_PREFIX = "/cashier/IM";
|
|
5797
|
+
var STORE_API_PREFIX$1 = "/cashier/IM";
|
|
5770
5798
|
var PLATFORM_API_PREFIX = "/site/IM";
|
|
5771
5799
|
function isStorePrefix(prefix) {
|
|
5772
5800
|
const normalized = normalizePrefix(prefix);
|
|
5773
|
-
return normalized === STORE_API_PREFIX || normalized.startsWith(`${STORE_API_PREFIX}/`);
|
|
5801
|
+
return normalized === STORE_API_PREFIX$1 || normalized.startsWith(`${STORE_API_PREFIX$1}/`);
|
|
5774
5802
|
}
|
|
5775
5803
|
function isPlatformPrefix(prefix) {
|
|
5776
5804
|
const normalized = normalizePrefix(prefix);
|
|
@@ -5802,6 +5830,59 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
5802
5830
|
return currentConfig.ws.platform || "";
|
|
5803
5831
|
}
|
|
5804
5832
|
/**
|
|
5833
|
+
* 是否开启 WebSocket Trace 日志
|
|
5834
|
+
*/
|
|
5835
|
+
function isWSTraceEnabled() {
|
|
5836
|
+
return currentConfig.ws.traceEnabled === true;
|
|
5837
|
+
}
|
|
5838
|
+
function normalizeWSAction(value, fallback) {
|
|
5839
|
+
return String(value || "").trim() || fallback;
|
|
5840
|
+
}
|
|
5841
|
+
/**
|
|
5842
|
+
* 获取 WebSocket 协议控制器(优先 protocol.controller)
|
|
5843
|
+
*/
|
|
5844
|
+
function getWSProtocolController() {
|
|
5845
|
+
var _currentConfig$ws$pro;
|
|
5846
|
+
return String(((_currentConfig$ws$pro = currentConfig.ws.protocol) === null || _currentConfig$ws$pro === void 0 ? void 0 : _currentConfig$ws$pro.controller) || "").trim() || getWSController();
|
|
5847
|
+
}
|
|
5848
|
+
/**
|
|
5849
|
+
* 获取 WebSocket 协议动作映射
|
|
5850
|
+
*/
|
|
5851
|
+
function getWSProtocolAction() {
|
|
5852
|
+
var _currentConfig$ws$pro2;
|
|
5853
|
+
const action = ((_currentConfig$ws$pro2 = currentConfig.ws.protocol) === null || _currentConfig$ws$pro2 === void 0 ? void 0 : _currentConfig$ws$pro2.action) || defaultConfig.ws.protocol.action;
|
|
5854
|
+
return {
|
|
5855
|
+
send: normalizeWSAction(action.send, "send"),
|
|
5856
|
+
msgRead: normalizeWSAction(action.msgRead, "msgRead"),
|
|
5857
|
+
onConnect: normalizeWSAction(action.onConnect, "onConnect"),
|
|
5858
|
+
offLine: normalizeWSAction(action.offLine, "offLine"),
|
|
5859
|
+
heartbeat: normalizeWSAction(action.heartbeat, "heartbeat")
|
|
5860
|
+
};
|
|
5861
|
+
}
|
|
5862
|
+
function normalizeURL(value) {
|
|
5863
|
+
return String(value || "").trim().replace(URL_TRIM_REGEXP, "");
|
|
5864
|
+
}
|
|
5865
|
+
function toWSURLFromHTTP(baseURL, fallback = "") {
|
|
5866
|
+
const normalized = normalizeURL(baseURL);
|
|
5867
|
+
const fallbackURL = normalizeURL(fallback);
|
|
5868
|
+
if (!normalized) return fallbackURL;
|
|
5869
|
+
const originMatch = normalized.match(URL_ORIGIN_REGEXP);
|
|
5870
|
+
const origin = (originMatch === null || originMatch === void 0 ? void 0 : originMatch[0]) || normalized;
|
|
5871
|
+
if (WS_PROTOCOL_REGEXP.test(origin)) return origin;
|
|
5872
|
+
if (HTTPS_PROTOCOL_REGEXP.test(origin)) return origin.replace(HTTPS_PROTOCOL_REGEXP, "wss://");
|
|
5873
|
+
if (HTTP_PROTOCOL_REGEXP.test(origin)) return origin.replace(HTTP_PROTOCOL_REGEXP, "ws://");
|
|
5874
|
+
return fallbackURL;
|
|
5875
|
+
}
|
|
5876
|
+
/**
|
|
5877
|
+
* 获取 WebSocket 基础地址
|
|
5878
|
+
* 优先级:ws.url > api.baseURL 推导 > 默认地址
|
|
5879
|
+
*/
|
|
5880
|
+
function getWSBaseURL() {
|
|
5881
|
+
const configured = normalizeURL(currentConfig.ws.url);
|
|
5882
|
+
if (configured) return configured;
|
|
5883
|
+
return toWSURLFromHTTP(currentConfig.api.baseURL, "wss://aox.api.orchiport.asia");
|
|
5884
|
+
}
|
|
5885
|
+
/**
|
|
5805
5886
|
* 获取鉴权扩展参数(平台默认为空,门店可注入 username/avatar)
|
|
5806
5887
|
*/
|
|
5807
5888
|
function getAuthorizationExtraPayload() {
|
|
@@ -6138,6 +6219,7 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
6138
6219
|
var INTEGER_STRING_REGEXP = /^\d+$/;
|
|
6139
6220
|
var UPLOAD_TIMEOUT_MS = 3e4;
|
|
6140
6221
|
var MAX_UPLOAD_IMAGE_SIZE_BYTES = 2 * 1024 * 1024;
|
|
6222
|
+
var CUSTOMER_ONLY_TRUE_SET = new Set(["1", "true"]);
|
|
6141
6223
|
function ensureAuthorized(apiName) {
|
|
6142
6224
|
if (!httpClient.getAuth()) throw new Error(`未登录,禁止请求 ${apiName},请先完成鉴权`);
|
|
6143
6225
|
}
|
|
@@ -6205,6 +6287,15 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
6205
6287
|
if (response.result === void 0 || response.result === null) throw new Error(`${apiName} 接口返回 result 为空`);
|
|
6206
6288
|
return response.result;
|
|
6207
6289
|
}
|
|
6290
|
+
function normalizePhone(phone) {
|
|
6291
|
+
return typeof phone === "string" ? phone.trim() : "";
|
|
6292
|
+
}
|
|
6293
|
+
function isCustomerOnlyFlagEnabled(value) {
|
|
6294
|
+
if (typeof value === "boolean") return value;
|
|
6295
|
+
if (typeof value === "number") return value === 1;
|
|
6296
|
+
if (typeof value === "string") return CUSTOMER_ONLY_TRUE_SET.has(value.trim().toLowerCase());
|
|
6297
|
+
return false;
|
|
6298
|
+
}
|
|
6208
6299
|
/**
|
|
6209
6300
|
* 获取用户鉴权
|
|
6210
6301
|
* @param params 鉴权参数
|
|
@@ -6245,6 +6336,7 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
6245
6336
|
* @param data.limit - 每页数量
|
|
6246
6337
|
* @param data.uid - 用户ID
|
|
6247
6338
|
* @param data.user_type - 用户类型
|
|
6339
|
+
* @param data.username - 用户名(可选,门店场景可用于筛选)
|
|
6248
6340
|
*/
|
|
6249
6341
|
function getUserChatList(_x3) {
|
|
6250
6342
|
return _getUserChatList.apply(this, arguments);
|
|
@@ -6252,7 +6344,14 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
6252
6344
|
function _getUserChatList() {
|
|
6253
6345
|
_getUserChatList = _asyncToGenerator(function* (data) {
|
|
6254
6346
|
ensureAuthorized("getUserChatList");
|
|
6255
|
-
|
|
6347
|
+
const payload = {
|
|
6348
|
+
page: data.page,
|
|
6349
|
+
limit: data.limit
|
|
6350
|
+
};
|
|
6351
|
+
if (typeof data.uid === "number") payload.uid = data.uid;
|
|
6352
|
+
if (typeof data.user_type === "number") payload.user_type = data.user_type;
|
|
6353
|
+
if (typeof data.username === "string" && data.username.trim()) payload.username = data.username.trim();
|
|
6354
|
+
return unwrapResult(yield httpClient.post(buildApiPath("/user/getChatList"), payload), "getUserChatList");
|
|
6256
6355
|
});
|
|
6257
6356
|
return _getUserChatList.apply(this, arguments);
|
|
6258
6357
|
}
|
|
@@ -6335,14 +6434,36 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
6335
6434
|
* @param data.session_id - 会话ID
|
|
6336
6435
|
* @param data.user_type - 用户类型
|
|
6337
6436
|
* @param data.msg_type - 消息类型
|
|
6437
|
+
* @param data.friend_type - 对话对象类型
|
|
6438
|
+
* @param data.customeronly - 平台客服模式标记(1/true)
|
|
6338
6439
|
*/
|
|
6339
6440
|
function getChatList(_x7) {
|
|
6340
6441
|
return _getChatList.apply(this, arguments);
|
|
6341
6442
|
}
|
|
6342
6443
|
function _getChatList() {
|
|
6343
6444
|
_getChatList = _asyncToGenerator(function* (data) {
|
|
6445
|
+
var _data$friend_type, _getConfig$chat;
|
|
6344
6446
|
ensureAuthorized("getChatList");
|
|
6345
|
-
|
|
6447
|
+
const friendType = Number((_data$friend_type = data.friend_type) !== null && _data$friend_type !== void 0 ? _data$friend_type : 0);
|
|
6448
|
+
const customerOnlyRaw = data.customeronly;
|
|
6449
|
+
const isCustomerOnly = isCustomerOnlyFlagEnabled(customerOnlyRaw);
|
|
6450
|
+
const isPlatformCustomerMode = isCustomerOnly && friendType === 4;
|
|
6451
|
+
const inputPhone = normalizePhone(data.phone);
|
|
6452
|
+
const servicePhone = normalizePhone((_getConfig$chat = getConfig().chat) === null || _getConfig$chat === void 0 ? void 0 : _getConfig$chat.platformServicePhone);
|
|
6453
|
+
const resolvedPhone = inputPhone || (isPlatformCustomerMode ? servicePhone : "");
|
|
6454
|
+
if (isPlatformCustomerMode && !data.session_id && !resolvedPhone) throw new Error("平台客服会话缺少 phone,请传入 phone 或配置 chat.platformServicePhone");
|
|
6455
|
+
const payload = {
|
|
6456
|
+
page: data.page,
|
|
6457
|
+
limit: data.limit
|
|
6458
|
+
};
|
|
6459
|
+
if (typeof data.username === "string" && data.username.trim()) payload.username = data.username.trim();
|
|
6460
|
+
if (resolvedPhone) payload.phone = resolvedPhone;
|
|
6461
|
+
if (typeof data.session_id === "string" && data.session_id.trim()) payload.session_id = data.session_id.trim();
|
|
6462
|
+
if (typeof data.user_type === "number") payload.user_type = data.user_type;
|
|
6463
|
+
if (typeof data.msg_type === "number") payload.msg_type = data.msg_type;
|
|
6464
|
+
if (Number.isFinite(friendType) && friendType > 0) payload.friend_type = friendType;
|
|
6465
|
+
if (isCustomerOnly) payload.customeronly = 1;
|
|
6466
|
+
return unwrapResult(yield httpClient.post(buildApiPath("/chat/getList"), payload), "getChatList");
|
|
6346
6467
|
});
|
|
6347
6468
|
return _getChatList.apply(this, arguments);
|
|
6348
6469
|
}
|
|
@@ -16644,8 +16765,8 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
16644
16765
|
class: "msg-avatar"
|
|
16645
16766
|
};
|
|
16646
16767
|
var _hoisted_17$2 = { class: "message-content-wrapper" };
|
|
16647
|
-
var _hoisted_18$
|
|
16648
|
-
var _hoisted_19$
|
|
16768
|
+
var _hoisted_18$2 = { class: "message-sender" };
|
|
16769
|
+
var _hoisted_19$2 = { class: "message-content" };
|
|
16649
16770
|
var _hoisted_20$1 = {
|
|
16650
16771
|
key: 0,
|
|
16651
16772
|
class: "message-text"
|
|
@@ -17167,12 +17288,15 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
17167
17288
|
}();
|
|
17168
17289
|
input.click();
|
|
17169
17290
|
}
|
|
17170
|
-
function resolveUploadedImageUrl(uploadURL, fileUrl) {
|
|
17291
|
+
function resolveUploadedImageUrl(resourceBaseURL, uploadURL, fileUrl) {
|
|
17171
17292
|
const normalizedFileUrl = typeof fileUrl === "string" ? fileUrl.trim() : "";
|
|
17172
17293
|
if (!normalizedFileUrl) return "";
|
|
17173
17294
|
if (HTTP_URL_REGEXP.test(normalizedFileUrl)) return normalizedFileUrl;
|
|
17295
|
+
const normalizedResourceBaseURL = typeof resourceBaseURL === "string" ? resourceBaseURL.trim() : "";
|
|
17296
|
+
const normalizedUploadURL = typeof uploadURL === "string" ? uploadURL.trim() : "";
|
|
17297
|
+
const preferredBaseURL = normalizedResourceBaseURL || normalizedUploadURL;
|
|
17174
17298
|
try {
|
|
17175
|
-
return new URL(normalizedFileUrl,
|
|
17299
|
+
return new URL(normalizedFileUrl, preferredBaseURL).toString();
|
|
17176
17300
|
} catch (_unused2) {
|
|
17177
17301
|
return normalizedFileUrl;
|
|
17178
17302
|
}
|
|
@@ -17196,7 +17320,8 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
17196
17320
|
isUploading.value = true;
|
|
17197
17321
|
const response = yield uploadImage(file);
|
|
17198
17322
|
if (!response.success || !((_response$data = response.data) === null || _response$data === void 0 ? void 0 : _response$data.url)) throw new Error(response.message || "上传失败");
|
|
17199
|
-
const
|
|
17323
|
+
const config = getConfig();
|
|
17324
|
+
const imageUrl = resolveUploadedImageUrl(config.api.resourceBaseURL, config.api.uploadURL, response.data.url);
|
|
17200
17325
|
if (!imageUrl) throw new Error("上传返回图片地址为空");
|
|
17201
17326
|
const tempMessageId = createTempMessageId();
|
|
17202
17327
|
const messageData = {
|
|
@@ -17345,7 +17470,7 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
17345
17470
|
alt: msg.sender,
|
|
17346
17471
|
class: "msg-avatar-img",
|
|
17347
17472
|
onError: handleImageError
|
|
17348
|
-
}, null, 40, _hoisted_15$2)) : (openBlock(), createElementBlock("div", _hoisted_16$2, toDisplayString(((_msg$sender = msg.sender) === null || _msg$sender === void 0 ? void 0 : _msg$sender.charAt(0)) || "?"), 1))]), createBaseVNode("div", _hoisted_17$2, [createBaseVNode("div", _hoisted_18$
|
|
17473
|
+
}, null, 40, _hoisted_15$2)) : (openBlock(), createElementBlock("div", _hoisted_16$2, toDisplayString(((_msg$sender = msg.sender) === null || _msg$sender === void 0 ? void 0 : _msg$sender.charAt(0)) || "?"), 1))]), createBaseVNode("div", _hoisted_17$2, [createBaseVNode("div", _hoisted_18$2, toDisplayString(msg.sender), 1), createBaseVNode("div", _hoisted_19$2, [msg.msgType === 1 ? (openBlock(), createElementBlock("div", _hoisted_20$1, toDisplayString(msg.content), 1)) : msg.msgType === 2 ? (openBlock(), createElementBlock("div", _hoisted_21, [createBaseVNode("img", {
|
|
17349
17474
|
src: msg.content,
|
|
17350
17475
|
alt: "图片",
|
|
17351
17476
|
onLoad: ($event) => handleMessageImageLoad(msg.id),
|
|
@@ -17395,7 +17520,7 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
17395
17520
|
class: "tool-btn emoji-btn",
|
|
17396
17521
|
title: "选择表情",
|
|
17397
17522
|
onClick: toggleEmojiPicker
|
|
17398
|
-
}, [..._cache[7] || (_cache[7] = [createStaticVNode("<span class=\"tool-btn-icon\" aria-hidden=\"true\" data-v-
|
|
17523
|
+
}, [..._cache[7] || (_cache[7] = [createStaticVNode("<span class=\"tool-btn-icon\" aria-hidden=\"true\" data-v-1459079f><svg class=\"tool-btn-svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" data-v-1459079f><circle cx=\"12\" cy=\"12\" r=\"10\" data-v-1459079f></circle><path d=\"M8 14s1.5 2 4 2 4-2 4-2\" data-v-1459079f></path><line x1=\"9\" y1=\"9\" x2=\"9.01\" y2=\"9\" data-v-1459079f></line><line x1=\"15\" y1=\"9\" x2=\"15.01\" y2=\"9\" data-v-1459079f></line></svg></span><span class=\"tool-btn-text\" data-v-1459079f>表情</span>", 2)])]), showEmojiPicker.value ? (openBlock(), createElementBlock("div", _hoisted_55, [createVNode(unref(Picker), {
|
|
17399
17524
|
native: true,
|
|
17400
17525
|
theme: "light",
|
|
17401
17526
|
"group-names": {
|
|
@@ -17481,7 +17606,7 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
17481
17606
|
]);
|
|
17482
17607
|
};
|
|
17483
17608
|
}
|
|
17484
|
-
}), [["__scopeId", "data-v-
|
|
17609
|
+
}), [["__scopeId", "data-v-1459079f"]]);
|
|
17485
17610
|
//#endregion
|
|
17486
17611
|
//#region src/assets/img/list.png?url
|
|
17487
17612
|
var list_default = "data:image/png;base64,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";
|
|
@@ -17513,31 +17638,37 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
17513
17638
|
var _hoisted_3$2 = { class: "unread-count" };
|
|
17514
17639
|
var _hoisted_4$1 = {
|
|
17515
17640
|
key: 1,
|
|
17516
|
-
class: "
|
|
17641
|
+
class: "search-header"
|
|
17517
17642
|
};
|
|
17518
|
-
var _hoisted_5$1 =
|
|
17643
|
+
var _hoisted_5$1 = ["onKeydown"];
|
|
17644
|
+
var _hoisted_6$1 = {
|
|
17519
17645
|
key: 2,
|
|
17646
|
+
class: "loading-state"
|
|
17647
|
+
};
|
|
17648
|
+
var _hoisted_7$1 = {
|
|
17649
|
+
key: 3,
|
|
17520
17650
|
class: "empty-state"
|
|
17521
17651
|
};
|
|
17522
|
-
var
|
|
17523
|
-
var
|
|
17524
|
-
var
|
|
17525
|
-
var
|
|
17526
|
-
var
|
|
17527
|
-
var
|
|
17652
|
+
var _hoisted_8$1 = ["src"];
|
|
17653
|
+
var _hoisted_9$1 = ["onClick"];
|
|
17654
|
+
var _hoisted_10$1 = { class: "conversation-item-content" };
|
|
17655
|
+
var _hoisted_11$1 = { class: "avatar-wrapper" };
|
|
17656
|
+
var _hoisted_12$1 = ["src", "alt"];
|
|
17657
|
+
var _hoisted_13$1 = {
|
|
17528
17658
|
key: 1,
|
|
17529
17659
|
class: "avatar-text"
|
|
17530
17660
|
};
|
|
17531
|
-
var
|
|
17532
|
-
var
|
|
17533
|
-
var
|
|
17534
|
-
var
|
|
17535
|
-
var
|
|
17536
|
-
var
|
|
17661
|
+
var _hoisted_14$1 = { class: "session-info" };
|
|
17662
|
+
var _hoisted_15$1 = { class: "session-name" };
|
|
17663
|
+
var _hoisted_16$1 = { class: "content-text" };
|
|
17664
|
+
var _hoisted_17$1 = { class: "session-meta" };
|
|
17665
|
+
var _hoisted_18$1 = { class: "session-time" };
|
|
17666
|
+
var _hoisted_19$1 = {
|
|
17537
17667
|
key: 0,
|
|
17538
17668
|
class: "unread-badge"
|
|
17539
17669
|
};
|
|
17540
17670
|
var WS_RELOAD_DEBOUNCE_MS = 200;
|
|
17671
|
+
var STORE_API_PREFIX = "/cashier/IM";
|
|
17541
17672
|
//#endregion
|
|
17542
17673
|
//#region src/components/ConversationList.vue
|
|
17543
17674
|
var ConversationList_default = /* @__PURE__ */ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
|
|
@@ -17556,8 +17687,11 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
17556
17687
|
const emit = __emit;
|
|
17557
17688
|
const conversations = /* @__PURE__ */ ref([]);
|
|
17558
17689
|
const loading = /* @__PURE__ */ ref(false);
|
|
17690
|
+
const searchInputUsername = /* @__PURE__ */ ref("");
|
|
17691
|
+
const searchUsername = /* @__PURE__ */ ref("");
|
|
17559
17692
|
let latestLoadRequestId = 0;
|
|
17560
17693
|
let wsReloadTimer = null;
|
|
17694
|
+
const TRAILING_SLASH_REGEXP = /\/+$/;
|
|
17561
17695
|
const stableMessageDedupe = createStableMessageDedupe();
|
|
17562
17696
|
const { unreadCount } = useUnreadStore();
|
|
17563
17697
|
function getUserType() {
|
|
@@ -17565,6 +17699,17 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
17565
17699
|
const userType = Number(config.api.userType);
|
|
17566
17700
|
return Number.isFinite(userType) ? userType : void 0;
|
|
17567
17701
|
}
|
|
17702
|
+
function isStoreMode() {
|
|
17703
|
+
const prefix = String(getConfig().api.prefix || "").trim().replace(TRAILING_SLASH_REGEXP, "");
|
|
17704
|
+
return prefix === STORE_API_PREFIX || prefix.startsWith(`${STORE_API_PREFIX}/`);
|
|
17705
|
+
}
|
|
17706
|
+
const showStoreUsernameSearch = computed(() => {
|
|
17707
|
+
return isStoreMode() && props.type === "conversation";
|
|
17708
|
+
});
|
|
17709
|
+
const emptyStateText = computed(() => {
|
|
17710
|
+
if (showStoreUsernameSearch.value && searchUsername.value) return "未找到匹配用户";
|
|
17711
|
+
return "暂无消息";
|
|
17712
|
+
});
|
|
17568
17713
|
const MsgType = {
|
|
17569
17714
|
TEXT: 1,
|
|
17570
17715
|
IMAGE: 2,
|
|
@@ -17646,11 +17791,14 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
17646
17791
|
if (!userInfo) return;
|
|
17647
17792
|
try {
|
|
17648
17793
|
loading.value = true;
|
|
17794
|
+
const keyword = searchUsername.value.trim();
|
|
17795
|
+
const shouldSearchByUsername = showStoreUsernameSearch.value && !!keyword;
|
|
17649
17796
|
const result = yield getUserChatList({
|
|
17650
17797
|
page: 1,
|
|
17651
17798
|
limit: 50,
|
|
17652
17799
|
uid: userInfo.id,
|
|
17653
|
-
user_type: getUserType()
|
|
17800
|
+
user_type: getUserType(),
|
|
17801
|
+
username: shouldSearchByUsername ? keyword : void 0
|
|
17654
17802
|
});
|
|
17655
17803
|
if (requestId !== latestLoadRequestId) return;
|
|
17656
17804
|
conversations.value = result.list.map((session) => transformSession(session));
|
|
@@ -17768,6 +17916,13 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
17768
17916
|
loadData();
|
|
17769
17917
|
}, WS_RELOAD_DEBOUNCE_MS);
|
|
17770
17918
|
}
|
|
17919
|
+
function handleSearchEnter() {
|
|
17920
|
+
if (!showStoreUsernameSearch.value) return;
|
|
17921
|
+
const nextKeyword = searchInputUsername.value.trim();
|
|
17922
|
+
const changed = nextKeyword !== searchUsername.value;
|
|
17923
|
+
if (changed) searchUsername.value = nextKeyword;
|
|
17924
|
+
if (changed || nextKeyword) loadData();
|
|
17925
|
+
}
|
|
17771
17926
|
function handleWebSocketMessage(data) {
|
|
17772
17927
|
const message = normalizeWSMessage(data);
|
|
17773
17928
|
if (!message) return;
|
|
@@ -17793,7 +17948,13 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
17793
17948
|
}
|
|
17794
17949
|
}
|
|
17795
17950
|
__expose({ reload });
|
|
17796
|
-
watch(() => props.type,
|
|
17951
|
+
watch(() => props.type, (nextType, prevType) => {
|
|
17952
|
+
if (prevType === "conversation" && nextType !== "conversation" && (searchInputUsername.value || searchUsername.value)) {
|
|
17953
|
+
searchInputUsername.value = "";
|
|
17954
|
+
searchUsername.value = "";
|
|
17955
|
+
}
|
|
17956
|
+
loadData();
|
|
17957
|
+
});
|
|
17797
17958
|
onMounted(() => {
|
|
17798
17959
|
loadData();
|
|
17799
17960
|
wsClient.on("message", handleWebSocketMessage);
|
|
@@ -17808,32 +17969,40 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
17808
17969
|
return (_ctx, _cache) => {
|
|
17809
17970
|
return openBlock(), createElementBlock("div", _hoisted_1$3, [
|
|
17810
17971
|
props.type === "unread" ? (openBlock(), createElementBlock("div", _hoisted_2$2, [createBaseVNode("span", _hoisted_3$2, "未读消息 (" + toDisplayString(unref(unreadCount)) + ")", 1)])) : createCommentVNode("", true),
|
|
17811
|
-
|
|
17972
|
+
showStoreUsernameSearch.value ? (openBlock(), createElementBlock("div", _hoisted_4$1, [withDirectives(createBaseVNode("input", {
|
|
17973
|
+
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => searchInputUsername.value = $event),
|
|
17974
|
+
class: "search-input",
|
|
17975
|
+
type: "text",
|
|
17976
|
+
placeholder: "输入用户名后回车搜索",
|
|
17977
|
+
maxlength: "32",
|
|
17978
|
+
onKeydown: withKeys(withModifiers(handleSearchEnter, ["prevent"]), ["enter"])
|
|
17979
|
+
}, null, 40, _hoisted_5$1), [[vModelText, searchInputUsername.value]])])) : createCommentVNode("", true),
|
|
17980
|
+
loading.value ? (openBlock(), createElementBlock("div", _hoisted_6$1, [..._cache[1] || (_cache[1] = [createBaseVNode("div", { class: "loading-spinner" }, null, -1), createBaseVNode("p", null, "加载中...", -1)])])) : filteredConversations.value.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_7$1, [createBaseVNode("img", {
|
|
17812
17981
|
class: "empty-icon",
|
|
17813
17982
|
src: unref(list_default),
|
|
17814
17983
|
alt: "暂无消息"
|
|
17815
|
-
}, null, 8,
|
|
17984
|
+
}, null, 8, _hoisted_8$1), createBaseVNode("p", null, toDisplayString(emptyStateText.value), 1)])) : createCommentVNode("", true),
|
|
17816
17985
|
(openBlock(true), createElementBlock(Fragment, null, renderList(filteredConversations.value, (conversation) => {
|
|
17817
17986
|
return openBlock(), createElementBlock("div", {
|
|
17818
17987
|
key: conversation.id,
|
|
17819
17988
|
class: normalizeClass(["conversation-item", { active: conversation.id === props.selectedId }]),
|
|
17820
17989
|
onClick: ($event) => handleSelect(conversation.id)
|
|
17821
|
-
}, [createBaseVNode("div",
|
|
17822
|
-
createBaseVNode("div",
|
|
17990
|
+
}, [createBaseVNode("div", _hoisted_10$1, [
|
|
17991
|
+
createBaseVNode("div", _hoisted_11$1, [conversation.avatar ? (openBlock(), createElementBlock("img", {
|
|
17823
17992
|
key: 0,
|
|
17824
17993
|
src: conversation.avatar,
|
|
17825
17994
|
alt: conversation.name,
|
|
17826
17995
|
class: "avatar-img",
|
|
17827
17996
|
onError: handleImageError
|
|
17828
|
-
}, null, 40,
|
|
17829
|
-
createBaseVNode("div",
|
|
17830
|
-
createBaseVNode("div",
|
|
17831
|
-
])], 10,
|
|
17997
|
+
}, null, 40, _hoisted_12$1)) : (openBlock(), createElementBlock("div", _hoisted_13$1, toDisplayString(conversation.avatarText), 1))]),
|
|
17998
|
+
createBaseVNode("div", _hoisted_14$1, [createBaseVNode("div", _hoisted_15$1, toDisplayString(conversation.name), 1), createBaseVNode("span", _hoisted_16$1, toDisplayString(conversation.lastMessage), 1)]),
|
|
17999
|
+
createBaseVNode("div", _hoisted_17$1, [createBaseVNode("div", _hoisted_18$1, toDisplayString(formatTime(conversation.lastTime)), 1), conversation.unreadCount > 0 ? (openBlock(), createElementBlock("span", _hoisted_19$1, toDisplayString(conversation.unreadCount > 99 ? "99+" : conversation.unreadCount), 1)) : createCommentVNode("", true)])
|
|
18000
|
+
])], 10, _hoisted_9$1);
|
|
17832
18001
|
}), 128))
|
|
17833
18002
|
]);
|
|
17834
18003
|
};
|
|
17835
18004
|
}
|
|
17836
|
-
}), [["__scopeId", "data-v-
|
|
18005
|
+
}), [["__scopeId", "data-v-66bc5469"]]);
|
|
17837
18006
|
//#endregion
|
|
17838
18007
|
//#region src/components/ChatWindow.vue?vue&type=script&setup=true&lang.ts
|
|
17839
18008
|
var _hoisted_1$2 = { class: "user-info-section" };
|
|
@@ -18550,9 +18719,10 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
18550
18719
|
CLOSING: 2,
|
|
18551
18720
|
CLOSED: 3
|
|
18552
18721
|
};
|
|
18553
|
-
var
|
|
18554
|
-
var
|
|
18555
|
-
var
|
|
18722
|
+
var DEFAULT_HEARTBEAT_INTERVAL = 3e3;
|
|
18723
|
+
var DEFAULT_RECONNECT_INTERVAL = 3e3;
|
|
18724
|
+
var DEFAULT_MAX_RECONNECT_COUNT = 5;
|
|
18725
|
+
var DEFAULT_CONNECT_TIMEOUT = 3e4;
|
|
18556
18726
|
var MAX_MESSAGE_QUEUE_SIZE = 200;
|
|
18557
18727
|
var PRESENCE_ACTION_STORAGE_KEY = "imsdk:presence-action";
|
|
18558
18728
|
var PRESENCE_CHANGE_EVENT = "presenceChange";
|
|
@@ -18582,6 +18752,7 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
18582
18752
|
_defineProperty(this, "status", WS_STATUS.CLOSED);
|
|
18583
18753
|
_defineProperty(this, "heartbeatTimer", null);
|
|
18584
18754
|
_defineProperty(this, "reconnectTimer", null);
|
|
18755
|
+
_defineProperty(this, "connectTimeoutTimer", null);
|
|
18585
18756
|
_defineProperty(this, "reconnectCount", 0);
|
|
18586
18757
|
_defineProperty(this, "messageQueue", []);
|
|
18587
18758
|
_defineProperty(this, "listeners", /* @__PURE__ */ new Map());
|
|
@@ -18593,12 +18764,52 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
18593
18764
|
_defineProperty(this, "siteId", "");
|
|
18594
18765
|
_defineProperty(this, "presenceAction", "onConnect");
|
|
18595
18766
|
_defineProperty(this, "isConnected", false);
|
|
18596
|
-
_defineProperty(this, "
|
|
18767
|
+
_defineProperty(this, "wsUrlOverride", "");
|
|
18597
18768
|
_defineProperty(this, "logPrefix", "[WebSocket]");
|
|
18598
|
-
this.
|
|
18769
|
+
this.wsUrlOverride = config.wsUrl || "";
|
|
18599
18770
|
this.siteId = config.siteId || "";
|
|
18600
18771
|
this.presenceAction = readPresenceActionFromStorage();
|
|
18601
18772
|
}
|
|
18773
|
+
toPositiveInt(value, fallback) {
|
|
18774
|
+
const next = Number(value);
|
|
18775
|
+
if (!Number.isFinite(next) || next <= 0) return fallback;
|
|
18776
|
+
return Math.floor(next);
|
|
18777
|
+
}
|
|
18778
|
+
getHeartbeatInterval() {
|
|
18779
|
+
return this.toPositiveInt(getConfig().ws.heartbeatInterval, DEFAULT_HEARTBEAT_INTERVAL);
|
|
18780
|
+
}
|
|
18781
|
+
getReconnectInterval() {
|
|
18782
|
+
return this.toPositiveInt(getConfig().ws.reconnectInterval, DEFAULT_RECONNECT_INTERVAL);
|
|
18783
|
+
}
|
|
18784
|
+
getMaxReconnectCount() {
|
|
18785
|
+
return this.toPositiveInt(getConfig().ws.maxReconnectAttempts, DEFAULT_MAX_RECONNECT_COUNT);
|
|
18786
|
+
}
|
|
18787
|
+
getConnectTimeout() {
|
|
18788
|
+
return this.toPositiveInt(getConfig().ws.connectTimeout, DEFAULT_CONNECT_TIMEOUT);
|
|
18789
|
+
}
|
|
18790
|
+
trace(tag, payload) {
|
|
18791
|
+
if (!isWSTraceEnabled()) return;
|
|
18792
|
+
if (payload) {
|
|
18793
|
+
console.debug(`${this.logPrefix} [TRACE] ${tag}`, payload);
|
|
18794
|
+
return;
|
|
18795
|
+
}
|
|
18796
|
+
console.debug(`${this.logPrefix} [TRACE] ${tag}`);
|
|
18797
|
+
}
|
|
18798
|
+
resolveProtocolAction(action) {
|
|
18799
|
+
const actions = getWSProtocolAction();
|
|
18800
|
+
if (action === "send") return actions.send;
|
|
18801
|
+
if (action === "msgRead") return actions.msgRead;
|
|
18802
|
+
if (action === "onConnect") return actions.onConnect;
|
|
18803
|
+
if (action === "offLine") return actions.offLine;
|
|
18804
|
+
if (action === "heartbeat") return actions.heartbeat;
|
|
18805
|
+
return action;
|
|
18806
|
+
}
|
|
18807
|
+
stopConnectTimeout() {
|
|
18808
|
+
if (this.connectTimeoutTimer) {
|
|
18809
|
+
clearTimeout(this.connectTimeoutTimer);
|
|
18810
|
+
this.connectTimeoutTimer = null;
|
|
18811
|
+
}
|
|
18812
|
+
}
|
|
18602
18813
|
/**
|
|
18603
18814
|
* 连接 WebSocket
|
|
18604
18815
|
* @param {string} token - 用户token
|
|
@@ -18610,7 +18821,12 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
18610
18821
|
return new Promise((resolve, reject) => {
|
|
18611
18822
|
try {
|
|
18612
18823
|
this.destroyConnection();
|
|
18613
|
-
const url = `${this.
|
|
18824
|
+
const url = `${this.wsUrlOverride || getWSBaseURL()}?platform=${encodeURIComponent(getWSPlatform())}${token ? `&token=${encodeURIComponent(token)}` : ""}`;
|
|
18825
|
+
this.trace("connect:prepare", {
|
|
18826
|
+
url,
|
|
18827
|
+
platform: getWSPlatform()
|
|
18828
|
+
});
|
|
18829
|
+
const connectTimeout = this.getConnectTimeout();
|
|
18614
18830
|
this.lastToken = token;
|
|
18615
18831
|
this.lastUserId = userId;
|
|
18616
18832
|
this.lastPhone = phone;
|
|
@@ -18624,9 +18840,27 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
18624
18840
|
});
|
|
18625
18841
|
this.ws = new WebSocket(url);
|
|
18626
18842
|
this.status = WS_STATUS.CONNECTING;
|
|
18843
|
+
this.stopConnectTimeout();
|
|
18844
|
+
this.connectTimeoutTimer = setTimeout(() => {
|
|
18845
|
+
if (!this.ws || this.status !== WS_STATUS.CONNECTING) return;
|
|
18846
|
+
console.warn(`${this.logPrefix} 连接超时,已主动关闭`, {
|
|
18847
|
+
timeoutMs: connectTimeout,
|
|
18848
|
+
platform: getWSPlatform(),
|
|
18849
|
+
siteId: this.siteId
|
|
18850
|
+
});
|
|
18851
|
+
try {
|
|
18852
|
+
this.ws.close();
|
|
18853
|
+
} catch (error) {
|
|
18854
|
+
console.error(`${this.logPrefix} 连接超时关闭失败`, error);
|
|
18855
|
+
}
|
|
18856
|
+
this.status = WS_STATUS.CLOSED;
|
|
18857
|
+
this.stopConnectTimeout();
|
|
18858
|
+
reject(/* @__PURE__ */ new Error(`WebSocket 连接超时(${connectTimeout}ms)`));
|
|
18859
|
+
}, connectTimeout);
|
|
18627
18860
|
this.ws.onopen = (event) => {
|
|
18628
18861
|
this.status = WS_STATUS.OPEN;
|
|
18629
18862
|
this.reconnectCount = 0;
|
|
18863
|
+
this.stopConnectTimeout();
|
|
18630
18864
|
console.info(`${this.logPrefix} 连接已建立`, {
|
|
18631
18865
|
platform: getWSPlatform(),
|
|
18632
18866
|
siteId: this.siteId,
|
|
@@ -18647,6 +18881,10 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
18647
18881
|
if (!rawData || rawData === "null") return;
|
|
18648
18882
|
try {
|
|
18649
18883
|
const data = JSON.parse(rawData);
|
|
18884
|
+
this.trace("message:receive", {
|
|
18885
|
+
controller: data === null || data === void 0 ? void 0 : data.controller,
|
|
18886
|
+
action: data === null || data === void 0 ? void 0 : data.action
|
|
18887
|
+
});
|
|
18650
18888
|
this.emit("message", data);
|
|
18651
18889
|
} catch (_unused) {
|
|
18652
18890
|
console.warn("收到非 JSON WebSocket 消息,已忽略:", rawData);
|
|
@@ -18654,15 +18892,18 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
18654
18892
|
};
|
|
18655
18893
|
this.ws.onerror = (error) => {
|
|
18656
18894
|
this.status = WS_STATUS.CLOSED;
|
|
18895
|
+
this.stopConnectTimeout();
|
|
18657
18896
|
console.error(`${this.logPrefix} 连接异常`, error);
|
|
18658
18897
|
this.emit("error", error);
|
|
18659
18898
|
reject(error);
|
|
18660
18899
|
};
|
|
18661
18900
|
this.ws.onclose = (event) => {
|
|
18662
18901
|
this.status = WS_STATUS.CLOSED;
|
|
18902
|
+
this.stopConnectTimeout();
|
|
18663
18903
|
this.stopHeartbeat();
|
|
18664
18904
|
this.emit("close", event);
|
|
18665
|
-
const
|
|
18905
|
+
const maxReconnectCount = this.getMaxReconnectCount();
|
|
18906
|
+
const canReconnect = this.presenceAction === "onConnect" && this.reconnectCount < maxReconnectCount;
|
|
18666
18907
|
console.warn(`${this.logPrefix} 连接关闭`, {
|
|
18667
18908
|
code: event.code,
|
|
18668
18909
|
reason: event.reason,
|
|
@@ -18673,7 +18914,7 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
18673
18914
|
});
|
|
18674
18915
|
if (canReconnect) this.scheduleReconnect(token, this.userId, this.phone);
|
|
18675
18916
|
else if (this.presenceAction === "offLine") console.info(`${this.logPrefix} 当前为 offLine 状态,已停止自动重连`);
|
|
18676
|
-
else console.error(`${this.logPrefix} 重连次数超过最大限制,停止重连`, { maxReconnectCount
|
|
18917
|
+
else console.error(`${this.logPrefix} 重连次数超过最大限制,停止重连`, { maxReconnectCount });
|
|
18677
18918
|
};
|
|
18678
18919
|
} catch (error) {
|
|
18679
18920
|
reject(error);
|
|
@@ -18696,6 +18937,10 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
18696
18937
|
}
|
|
18697
18938
|
try {
|
|
18698
18939
|
this.ws.send(message);
|
|
18940
|
+
if (typeof data !== "string") this.trace("message:send", {
|
|
18941
|
+
controller: data.controller,
|
|
18942
|
+
action: data.action
|
|
18943
|
+
});
|
|
18699
18944
|
return true;
|
|
18700
18945
|
} catch (error) {
|
|
18701
18946
|
console.error("WebSocket发送消息失败:", error);
|
|
@@ -18706,7 +18951,7 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
18706
18951
|
* 发送控制器动作消息(使用当前配置的 controller)
|
|
18707
18952
|
*/
|
|
18708
18953
|
sendControllerMessage(action, param = {}) {
|
|
18709
|
-
const controller =
|
|
18954
|
+
const controller = getWSProtocolController();
|
|
18710
18955
|
return this.send({
|
|
18711
18956
|
controller,
|
|
18712
18957
|
action,
|
|
@@ -18730,7 +18975,8 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
18730
18975
|
return false;
|
|
18731
18976
|
}
|
|
18732
18977
|
}
|
|
18733
|
-
|
|
18978
|
+
const runtimeAction = this.resolveProtocolAction(action);
|
|
18979
|
+
return this.sendControllerMessage(runtimeAction, param);
|
|
18734
18980
|
}
|
|
18735
18981
|
tryReconnectFromManualOnline() {
|
|
18736
18982
|
if (this.status === WS_STATUS.CONNECTING) {
|
|
@@ -18773,8 +19019,8 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
18773
19019
|
this.heartbeatTimer = setInterval(() => {
|
|
18774
19020
|
if (this.status === WS_STATUS.OPEN && this.ws) {
|
|
18775
19021
|
const heartbeatData = {
|
|
18776
|
-
controller:
|
|
18777
|
-
action: "heartbeat",
|
|
19022
|
+
controller: getWSProtocolController(),
|
|
19023
|
+
action: this.resolveProtocolAction("heartbeat"),
|
|
18778
19024
|
param: {
|
|
18779
19025
|
userId: this.userId,
|
|
18780
19026
|
platform: getWSPlatform(),
|
|
@@ -18784,15 +19030,15 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
18784
19030
|
};
|
|
18785
19031
|
this.send(heartbeatData);
|
|
18786
19032
|
}
|
|
18787
|
-
},
|
|
19033
|
+
}, this.getHeartbeatInterval());
|
|
18788
19034
|
}
|
|
18789
19035
|
/**
|
|
18790
19036
|
* 发送连接/状态消息
|
|
18791
19037
|
*/
|
|
18792
19038
|
sendConnectMessage() {
|
|
18793
19039
|
const connectData = {
|
|
18794
|
-
controller:
|
|
18795
|
-
action: this.presenceAction,
|
|
19040
|
+
controller: getWSProtocolController(),
|
|
19041
|
+
action: this.resolveProtocolAction(this.presenceAction),
|
|
18796
19042
|
param: {
|
|
18797
19043
|
userId: this.userId,
|
|
18798
19044
|
platform: getWSPlatform(),
|
|
@@ -18824,10 +19070,12 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
18824
19070
|
}
|
|
18825
19071
|
this.reconnectCount++;
|
|
18826
19072
|
const attempt = this.reconnectCount;
|
|
19073
|
+
const maxReconnectCount = this.getMaxReconnectCount();
|
|
19074
|
+
const reconnectInterval = this.getReconnectInterval();
|
|
18827
19075
|
console.info(`${this.logPrefix} 准备重连`, {
|
|
18828
19076
|
attempt,
|
|
18829
|
-
maxReconnectCount
|
|
18830
|
-
retryInMs:
|
|
19077
|
+
maxReconnectCount,
|
|
19078
|
+
retryInMs: reconnectInterval
|
|
18831
19079
|
});
|
|
18832
19080
|
this.reconnectTimer = setTimeout(() => {
|
|
18833
19081
|
if (this.presenceAction === "offLine") {
|
|
@@ -18846,7 +19094,7 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
18846
19094
|
}
|
|
18847
19095
|
console.info(`${this.logPrefix} 发起重连`, {
|
|
18848
19096
|
attempt,
|
|
18849
|
-
maxReconnectCount
|
|
19097
|
+
maxReconnectCount
|
|
18850
19098
|
});
|
|
18851
19099
|
this.connect(token, userId, phone, this.siteId).catch((error) => {
|
|
18852
19100
|
console.error(`${this.logPrefix} 重连失败`, {
|
|
@@ -18854,7 +19102,7 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
18854
19102
|
error
|
|
18855
19103
|
});
|
|
18856
19104
|
});
|
|
18857
|
-
},
|
|
19105
|
+
}, reconnectInterval);
|
|
18858
19106
|
}
|
|
18859
19107
|
/**
|
|
18860
19108
|
* 发送消息队列中的消息
|
|
@@ -18878,6 +19126,7 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
18878
19126
|
clearTimeout(this.reconnectTimer);
|
|
18879
19127
|
this.reconnectTimer = null;
|
|
18880
19128
|
}
|
|
19129
|
+
this.stopConnectTimeout();
|
|
18881
19130
|
if (this.ws) {
|
|
18882
19131
|
this.ws.onopen = null;
|
|
18883
19132
|
this.ws.onmessage = null;
|
|
@@ -18901,7 +19150,7 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
18901
19150
|
disconnect() {
|
|
18902
19151
|
console.info(`${this.logPrefix} 主动断开连接`);
|
|
18903
19152
|
this.destroyConnection();
|
|
18904
|
-
this.reconnectCount =
|
|
19153
|
+
this.reconnectCount = this.getMaxReconnectCount();
|
|
18905
19154
|
this.messageQueue = [];
|
|
18906
19155
|
}
|
|
18907
19156
|
/**
|
|
@@ -18989,27 +19238,46 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
18989
19238
|
} }).mount(container);
|
|
18990
19239
|
}
|
|
18991
19240
|
function validateModeContract() {
|
|
18992
|
-
var _config$api$prefix, _config$ws$
|
|
19241
|
+
var _config$api$prefix, _config$ws$protocol, _config$ws$platform;
|
|
18993
19242
|
const config = getConfig();
|
|
18994
19243
|
const apiPrefix = (_config$api$prefix = config.api.prefix) === null || _config$api$prefix === void 0 ? void 0 : _config$api$prefix.trim();
|
|
18995
|
-
const wsController = (_config$ws$
|
|
19244
|
+
const wsController = (config.ws.controller || ((_config$ws$protocol = config.ws.protocol) === null || _config$ws$protocol === void 0 ? void 0 : _config$ws$protocol.controller) || "").trim();
|
|
18996
19245
|
const wsPlatform = (_config$ws$platform = config.ws.platform) === null || _config$ws$platform === void 0 ? void 0 : _config$ws$platform.trim();
|
|
18997
19246
|
if (!apiPrefix) throw new Error("IMSDK 初始化失败:缺少 api.prefix,请使用 @zjw-jszn/platform-imsdk 或 @zjw-jszn/store-imsdk,或显式配置前缀");
|
|
18998
19247
|
if (!wsController || !wsPlatform) throw new Error("IMSDK 初始化失败:缺少 ws.controller 或 ws.platform,请按文档约定配置后重试");
|
|
18999
19248
|
if (wsPlatform !== wsPlatform.toLowerCase()) throw new Error(`IMSDK 初始化失败:ws.platform 必须为小写,当前为 ${wsPlatform}`);
|
|
19000
19249
|
if (wsController.toLowerCase() !== wsPlatform) throw new Error(`IMSDK 初始化失败:ws.controller (${wsController}) 与 ws.platform (${wsPlatform}) 不匹配`);
|
|
19001
19250
|
}
|
|
19251
|
+
function normalizeText(value) {
|
|
19252
|
+
return typeof value === "string" ? value.trim() : "";
|
|
19253
|
+
}
|
|
19254
|
+
function mergeAuthorizedUserInfo(authData, inputPhone) {
|
|
19255
|
+
var _config$auth;
|
|
19256
|
+
const authorizationPayload = ((_config$auth = getConfig().auth) === null || _config$auth === void 0 ? void 0 : _config$auth.authorizationPayload) || {};
|
|
19257
|
+
const payloadUsername = normalizeText(authorizationPayload.username);
|
|
19258
|
+
const payloadAvatar = normalizeText(authorizationPayload.avatar);
|
|
19259
|
+
const resolvedPhone = normalizeText(authData.phone) || inputPhone;
|
|
19260
|
+
const resolvedUsername = normalizeText(authData.username) || payloadUsername;
|
|
19261
|
+
const resolvedName = normalizeText(authData.name) || resolvedUsername;
|
|
19262
|
+
const resolvedAvatar = normalizeText(authData.avatar) || normalizeText(authData.cover) || payloadAvatar;
|
|
19263
|
+
return _objectSpread2(_objectSpread2({}, authData), {}, {
|
|
19264
|
+
phone: resolvedPhone,
|
|
19265
|
+
username: resolvedUsername,
|
|
19266
|
+
name: resolvedName,
|
|
19267
|
+
avatar: resolvedAvatar
|
|
19268
|
+
});
|
|
19269
|
+
}
|
|
19002
19270
|
function initIM() {
|
|
19003
19271
|
return _initIM.apply(this, arguments);
|
|
19004
19272
|
}
|
|
19005
19273
|
function _initIM() {
|
|
19006
19274
|
_initIM = _asyncToGenerator(function* (config = {}) {
|
|
19007
19275
|
if (initInFlight) {
|
|
19008
|
-
var _config$api, _config$ws, _config$ws2;
|
|
19276
|
+
var _config$api, _config$ws$controller, _config$ws, _config$ws2, _config$ws3;
|
|
19009
19277
|
const currentConfig = getConfig();
|
|
19010
19278
|
const nextApiPrefix = (_config$api = config.api) === null || _config$api === void 0 ? void 0 : _config$api.prefix;
|
|
19011
|
-
const nextWSController = (_config$ws = config.ws) === null || _config$ws === void 0 ? void 0 : _config$ws.controller;
|
|
19012
|
-
const nextWSPlatform = (_config$
|
|
19279
|
+
const nextWSController = (_config$ws$controller = (_config$ws = config.ws) === null || _config$ws === void 0 ? void 0 : _config$ws.controller) !== null && _config$ws$controller !== void 0 ? _config$ws$controller : (_config$ws2 = config.ws) === null || _config$ws2 === void 0 || (_config$ws2 = _config$ws2.protocol) === null || _config$ws2 === void 0 ? void 0 : _config$ws2.controller;
|
|
19280
|
+
const nextWSPlatform = (_config$ws3 = config.ws) === null || _config$ws3 === void 0 ? void 0 : _config$ws3.platform;
|
|
19013
19281
|
if (nextApiPrefix && nextApiPrefix !== currentConfig.api.prefix || nextWSController && nextWSController !== currentConfig.ws.controller || nextWSPlatform && nextWSPlatform !== currentConfig.ws.platform) throw new Error("IMSDK 正在以其他模式初始化,请等待当前初始化完成后重试");
|
|
19014
19282
|
return initInFlight;
|
|
19015
19283
|
}
|
|
@@ -19022,11 +19290,11 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
19022
19290
|
}
|
|
19023
19291
|
};
|
|
19024
19292
|
if (isInitialized.value && httpClient.getAuth()) {
|
|
19025
|
-
var _config$api2, _config$
|
|
19293
|
+
var _config$api2, _config$ws$controller2, _config$ws4, _config$ws5, _config$ws6;
|
|
19026
19294
|
const currentConfig = getConfig();
|
|
19027
19295
|
const nextApiPrefix = (_config$api2 = config.api) === null || _config$api2 === void 0 ? void 0 : _config$api2.prefix;
|
|
19028
|
-
const nextWSController = (_config$
|
|
19029
|
-
const nextWSPlatform = (_config$
|
|
19296
|
+
const nextWSController = (_config$ws$controller2 = (_config$ws4 = config.ws) === null || _config$ws4 === void 0 ? void 0 : _config$ws4.controller) !== null && _config$ws$controller2 !== void 0 ? _config$ws$controller2 : (_config$ws5 = config.ws) === null || _config$ws5 === void 0 || (_config$ws5 = _config$ws5.protocol) === null || _config$ws5 === void 0 ? void 0 : _config$ws5.controller;
|
|
19297
|
+
const nextWSPlatform = (_config$ws6 = config.ws) === null || _config$ws6 === void 0 ? void 0 : _config$ws6.platform;
|
|
19030
19298
|
if (nextApiPrefix && nextApiPrefix !== currentConfig.api.prefix || nextWSController && nextWSController !== currentConfig.ws.controller || nextWSPlatform && nextWSPlatform !== currentConfig.ws.platform) throw new Error("IMSDK 已初始化为其他模式,请刷新页面后再切换平台/门店");
|
|
19031
19299
|
mountIMApp();
|
|
19032
19300
|
console.warn("IMSDK 已初始化且已鉴权,本次调用将复用现有实例");
|
|
@@ -19036,13 +19304,30 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
19036
19304
|
if (config.api) updateConfig({ api: config.api });
|
|
19037
19305
|
if (config.sound) updateConfig({ sound: config.sound });
|
|
19038
19306
|
if (config.auth) updateConfig({ auth: config.auth });
|
|
19307
|
+
if (config.chat) {
|
|
19308
|
+
var _config$chat$platform;
|
|
19309
|
+
const currentChat = getConfig().chat;
|
|
19310
|
+
updateConfig({ chat: { platformServicePhone: (_config$chat$platform = config.chat.platformServicePhone) !== null && _config$chat$platform !== void 0 ? _config$chat$platform : currentChat.platformServicePhone } });
|
|
19311
|
+
}
|
|
19039
19312
|
if (config.runtimeApi) updateConfig({ runtimeApi: config.runtimeApi });
|
|
19040
19313
|
if (config.ws) {
|
|
19041
|
-
var _config$ws$
|
|
19314
|
+
var _ref, _config$ws$controller3, _config$ws$protocol2, _config$ws$url, _config$ws$platform2, _config$ws$reconnectI, _config$ws$heartbeatI, _config$ws$maxReconne, _config$ws$connectTim, _config$ws$traceEnabl, _config$ws$protocol$c, _config$ws$protocol3, _config$ws$protocol4, _config$ws$protocol$h, _config$ws$protocol5;
|
|
19042
19315
|
const currentWS = getConfig().ws;
|
|
19316
|
+
const nextWSController = (_ref = (_config$ws$controller3 = config.ws.controller) !== null && _config$ws$controller3 !== void 0 ? _config$ws$controller3 : (_config$ws$protocol2 = config.ws.protocol) === null || _config$ws$protocol2 === void 0 ? void 0 : _config$ws$protocol2.controller) !== null && _ref !== void 0 ? _ref : currentWS.controller;
|
|
19043
19317
|
updateConfig({ ws: {
|
|
19044
|
-
|
|
19045
|
-
|
|
19318
|
+
url: (_config$ws$url = config.ws.url) !== null && _config$ws$url !== void 0 ? _config$ws$url : currentWS.url,
|
|
19319
|
+
controller: nextWSController,
|
|
19320
|
+
platform: (_config$ws$platform2 = config.ws.platform) !== null && _config$ws$platform2 !== void 0 ? _config$ws$platform2 : currentWS.platform,
|
|
19321
|
+
reconnectInterval: (_config$ws$reconnectI = config.ws.reconnectInterval) !== null && _config$ws$reconnectI !== void 0 ? _config$ws$reconnectI : currentWS.reconnectInterval,
|
|
19322
|
+
heartbeatInterval: (_config$ws$heartbeatI = config.ws.heartbeatInterval) !== null && _config$ws$heartbeatI !== void 0 ? _config$ws$heartbeatI : currentWS.heartbeatInterval,
|
|
19323
|
+
maxReconnectAttempts: (_config$ws$maxReconne = config.ws.maxReconnectAttempts) !== null && _config$ws$maxReconne !== void 0 ? _config$ws$maxReconne : currentWS.maxReconnectAttempts,
|
|
19324
|
+
connectTimeout: (_config$ws$connectTim = config.ws.connectTimeout) !== null && _config$ws$connectTim !== void 0 ? _config$ws$connectTim : currentWS.connectTimeout,
|
|
19325
|
+
traceEnabled: (_config$ws$traceEnabl = config.ws.traceEnabled) !== null && _config$ws$traceEnabl !== void 0 ? _config$ws$traceEnabl : currentWS.traceEnabled,
|
|
19326
|
+
protocol: _objectSpread2(_objectSpread2(_objectSpread2({}, currentWS.protocol), config.ws.protocol || {}), {}, {
|
|
19327
|
+
controller: (_config$ws$protocol$c = (_config$ws$protocol3 = config.ws.protocol) === null || _config$ws$protocol3 === void 0 ? void 0 : _config$ws$protocol3.controller) !== null && _config$ws$protocol$c !== void 0 ? _config$ws$protocol$c : nextWSController,
|
|
19328
|
+
action: _objectSpread2(_objectSpread2({}, currentWS.protocol.action), ((_config$ws$protocol4 = config.ws.protocol) === null || _config$ws$protocol4 === void 0 ? void 0 : _config$ws$protocol4.action) || {}),
|
|
19329
|
+
heartbeatSignals: (_config$ws$protocol$h = (_config$ws$protocol5 = config.ws.protocol) === null || _config$ws$protocol5 === void 0 ? void 0 : _config$ws$protocol5.heartbeatSignals) !== null && _config$ws$protocol$h !== void 0 ? _config$ws$protocol$h : currentWS.protocol.heartbeatSignals
|
|
19330
|
+
})
|
|
19046
19331
|
} });
|
|
19047
19332
|
}
|
|
19048
19333
|
httpClient.setBaseURL(getConfig().api.baseURL);
|
|
@@ -19052,11 +19337,14 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
19052
19337
|
if (!normalizedPhone) throw new Error("IMSDK 初始化失败:缺少鉴权参数 phone");
|
|
19053
19338
|
try {
|
|
19054
19339
|
const authData = yield getAuthorization({ phone: normalizedPhone });
|
|
19055
|
-
|
|
19056
|
-
if (!
|
|
19057
|
-
|
|
19340
|
+
const normalizedToken = normalizeText(authData.token);
|
|
19341
|
+
if (!normalizedToken) throw new Error("鉴权返回 token 为空");
|
|
19342
|
+
const mergedAuthData = mergeAuthorizedUserInfo(authData, normalizedPhone);
|
|
19343
|
+
mergedAuthData.token = normalizedToken;
|
|
19344
|
+
userInfo.value = mergedAuthData;
|
|
19345
|
+
httpClient.setAuth(normalizedToken, "");
|
|
19058
19346
|
const sdkConfig = getConfig();
|
|
19059
|
-
wsClient.connect(
|
|
19347
|
+
wsClient.connect(normalizedToken, mergedAuthData.id, mergedAuthData.phone, sdkConfig.api.siteId).catch((error) => {
|
|
19060
19348
|
console.error("WebSocket连接失败:", error);
|
|
19061
19349
|
});
|
|
19062
19350
|
} catch (error) {
|
|
@@ -19082,17 +19370,21 @@ Expected function or array of functions, received type ${typeof value}.`);
|
|
|
19082
19370
|
//#endregion
|
|
19083
19371
|
//#region src/mode.ts
|
|
19084
19372
|
function warnModeOverrides(scope, config, defaults) {
|
|
19373
|
+
var _wsConfig$protocol;
|
|
19085
19374
|
const apiConfig = config.api;
|
|
19086
19375
|
const wsConfig = config.ws;
|
|
19087
19376
|
if ((apiConfig === null || apiConfig === void 0 ? void 0 : apiConfig.prefix) && apiConfig.prefix !== defaults.api.prefix) console.warn(`[${scope}] 已忽略 api.prefix=${apiConfig.prefix},当前模式固定为 ${defaults.api.prefix}`);
|
|
19088
19377
|
if ((apiConfig === null || apiConfig === void 0 ? void 0 : apiConfig.userType) !== void 0 && apiConfig.userType !== defaults.api.userType) console.warn(`[${scope}] 已忽略 api.userType=${apiConfig.userType},当前模式固定为 ${defaults.api.userType}`);
|
|
19089
19378
|
if ((wsConfig === null || wsConfig === void 0 ? void 0 : wsConfig.controller) && wsConfig.controller !== defaults.ws.controller) console.warn(`[${scope}] 已忽略 ws.controller=${wsConfig.controller},当前模式固定为 ${defaults.ws.controller}`);
|
|
19090
19379
|
if ((wsConfig === null || wsConfig === void 0 ? void 0 : wsConfig.platform) && wsConfig.platform !== defaults.ws.platform) console.warn(`[${scope}] 已忽略 ws.platform=${wsConfig.platform},当前模式固定为 ${defaults.ws.platform}`);
|
|
19380
|
+
const protocolController = wsConfig === null || wsConfig === void 0 || (_wsConfig$protocol = wsConfig.protocol) === null || _wsConfig$protocol === void 0 ? void 0 : _wsConfig$protocol.controller;
|
|
19381
|
+
if (protocolController && protocolController !== defaults.ws.controller) console.warn(`[${scope}] 已忽略 ws.protocol.controller=${protocolController},当前模式固定为 ${defaults.ws.controller}`);
|
|
19091
19382
|
}
|
|
19092
19383
|
function applyModeDefaults(config, defaults) {
|
|
19384
|
+
var _config$ws;
|
|
19093
19385
|
return _objectSpread2(_objectSpread2({}, config), {}, {
|
|
19094
19386
|
api: _objectSpread2(_objectSpread2({}, config.api || {}), defaults.api),
|
|
19095
|
-
ws: _objectSpread2(_objectSpread2({}, config.ws || {}), defaults.ws)
|
|
19387
|
+
ws: _objectSpread2(_objectSpread2(_objectSpread2({}, config.ws || {}), defaults.ws), {}, { protocol: _objectSpread2(_objectSpread2({}, ((_config$ws = config.ws) === null || _config$ws === void 0 ? void 0 : _config$ws.protocol) || {}), {}, { controller: defaults.ws.controller }) })
|
|
19096
19388
|
});
|
|
19097
19389
|
}
|
|
19098
19390
|
//#endregion
|