UNPKG

vue-chat-button-simple

Version:

Vue 3 chat button components with badge support, modal popup, fixed positioning, environment configuration, and customizable themes

711 lines (678 loc) 38.7 kB
import { defineComponent, ref, watch, onMounted, onUnmounted, createBlock, openBlock, Teleport, createVNode, Transition, withCtx, createElementBlock, createCommentVNode, createElementVNode, withModifiers, normalizeStyle, normalizeClass, renderSlot, createTextVNode, toDisplayString, computed } from "vue"; const _imports_0$1 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAEDSURBVDiNrZRRdQIxEEVvomAlsA62CqAKSh0sDiIBFHCqBKqAVkHrIDgAB68/s5DmJBxKc/9mNnmZM/N2oICkTtIoaScp6kq0XJDUle6WxEImUuMkKdwS6uz1v7IrVivp8IDYxCEXW/9DbGIN4KzcCNzX5Nv0HgiNxACWHpg3EgN48cCQJVfAM3C0+Bt4AjbJmQ3QA/vs7kDW2K/pSzKokOQmf84sXuaTwQyaspA0JJejxSE5s7Vc7tuTMw8tGvXwwwPvjcQAPp31IzYQOwO9d84dswk+yptz7nyJ7twwNS7/sm9Q2R54/ZWRNEsssi1YqUSs7kMz6JjEnfmutrHH2sb+AerxVmZjoqAcAAAAAElFTkSuQmCC"; const detectEnvironment = () => { if (typeof window !== "undefined") { const hostname = window.location.hostname; const protocol = window.location.protocol; if (hostname === "localhost" || hostname === "127.0.0.1" || hostname.includes(".local") || hostname.includes(".dev") || protocol === "file:") { return "development"; } const urlParams = new URLSearchParams(window.location.search); if (urlParams.get("env") === "dev") { return "development"; } return "production"; } return "development"; }; const getEnvironmentConfig = (environment) => { const isProduction = environment === "production"; const defaultConfig = { isProduction, apiBaseUrl: isProduction ? "https://auth.szad.teehmoon.com" : "https://auth.dev.szad.teehmoon.com", timeout: 1e4, retryCount: 3 }; return { ...defaultConfig }; }; const _imports_0 = "data:image/png;base64,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"; const _imports_1 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAADrSURBVEiJ3ZWxDYMwEEU/EShDMI1LmIHxWAHT0TMDJdDSE8d2GiIh7OAPCg1XocN6zzL/TGSttbiwHlfCbyowwwAl5WGQkhJmGAhB10HVNeaypOFzWULVNUzXOe9ipyEE9DhCty1mAM+iCMJ12yLJMsRChAVYoDMQlKzhSZ5713gFjISB7wr2JCw8KPBJsDwzcACI2Kviu2sANBxnB81ME702eETYnLmZJjrClMD3QZkIU4JfaWHnZFcQiiIr8QrYnDMSR6CkPJTzteSdpu59ZDel+96qptm2g/WqKqv73unTg3a2bvjL/Hd9ALlkDqlLCybgAAAAAElFTkSuQmCC"; const _hoisted_1$2 = { class: "chat-modal-header" }; const _hoisted_2$2 = { class: "chat-modal-title center" }; const _hoisted_3$2 = { class: "chat-modal-content" }; const _hoisted_4 = ["src", "title"]; const _hoisted_5 = { key: 1, class: "chat-modal-placeholder" }; const _sfc_main$2 = /* @__PURE__ */ defineComponent({ __name: "ChatModal", props: { visible: { type: Boolean, default: false }, iframeUrl: { default: "" }, modalTitle: { default: "西之月客服" }, position: { default: "center" }, width: { default: "400px" }, height: { default: "600px" }, closeOnOverlay: { type: Boolean, default: false }, closeOnEscape: { type: Boolean, default: false } }, emits: ["update:visible", "close", "open"], setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const visible = ref(props.visible); watch( () => props.visible, (newValue) => { visible.value = newValue; } ); watch(visible, (newValue) => { emit("update:visible", newValue); if (newValue) { emit("open"); } else { emit("close"); } }); const closeModal = () => { visible.value = false; }; const handleOverlayClick = () => { if (props.closeOnOverlay) { closeModal(); } }; const handleKeydown = (event) => { if (event.key === "Escape" && visible.value && props.closeOnEscape) { event.preventDefault(); closeModal(); } }; __expose({ open: () => { visible.value = true; }, close: closeModal, toggle: () => { visible.value = !visible.value; } }); onMounted(() => { document.addEventListener("keydown", handleKeydown, true); }); onUnmounted(() => { document.removeEventListener("keydown", handleKeydown, true); }); return (_ctx, _cache) => { return openBlock(), createBlock(Teleport, { to: "body" }, [ createVNode(Transition, { name: "modal-fade" }, { default: withCtx(() => [ visible.value ? (openBlock(), createElementBlock("div", { key: 0, class: "chat-modal-overlay", onClick: handleOverlayClick }, [ createElementVNode("div", { class: normalizeClass(["chat-modal-container", _ctx.position]), style: normalizeStyle({ "--modal-width": _ctx.width, "--modal-height": _ctx.height }), onClick: _cache[0] || (_cache[0] = withModifiers(() => { }, ["stop"])) }, [ createElementVNode("div", _hoisted_1$2, [ createElementVNode("div", _hoisted_2$2, [ _cache[1] || (_cache[1] = createElementVNode("img", { src: _imports_0, alt: "logo", class: "chat-modal-logo" }, null, -1)), renderSlot(_ctx.$slots, "title", {}, () => [ createTextVNode(toDisplayString(_ctx.modalTitle), 1) ]) ]), createElementVNode("button", { class: "chat-modal-close", onClick: closeModal }, _cache[2] || (_cache[2] = [ createElementVNode("img", { src: _imports_1, alt: "close" }, null, -1) ])) ]), createElementVNode("div", _hoisted_3$2, [ _ctx.iframeUrl ? (openBlock(), createElementBlock("iframe", { key: 0, src: _ctx.iframeUrl, title: _ctx.modalTitle, class: "chat-modal-iframe", frameborder: "0", allowfullscreen: "" }, null, 8, _hoisted_4)) : (openBlock(), createElementBlock("div", _hoisted_5, [ renderSlot(_ctx.$slots, "content", {}, () => [ _cache[3] || (_cache[3] = createElementVNode("p", null, "请设置 iframe URL", -1)) ]) ])) ]) ], 6) ])) : createCommentVNode("", true) ]), _: 3 }) ]); }; } }); const _hoisted_1$1 = { class: "chat-icon" }; const _hoisted_2$1 = ["src"]; const _hoisted_3$1 = { key: 1, src: _imports_0$1, alt: "chat icon" }; const _sfc_main$1 = /* @__PURE__ */ defineComponent({ __name: "ChatButtonWithBadge", props: { autoFetch: { type: Boolean, default: true }, fetchInterval: { default: 3e4 }, enablePolling: { type: Boolean, default: true }, pollingInterval: { default: 3e4 }, params: { default: void 0 }, iconUrl: { default: "" }, themeColor: { default: "#1890ff" }, badgeColor: { default: "#ff3860" }, environment: { default: "development" }, showBadge: { type: Boolean, default: true }, modalUrl: { default: "http://localhost:5666/chatWindow?SDKAppID=1600100157&userId=%E5%BC%A0%E4%B8%89&UserSig=eJwtjEsLgkAURv-LbA276txMoYXUQnQWMYkYuJFmjIs9xEcY0X-PVPg23zlwPiwRJ-OlG*Yz2wS2mj4p-eiopAnnPZY25D3X4C2*VVVR16SYb20ArHHozkYPNTV65IhoA8BMO7r-mYvcA8cFZ6nQdcy3SgiRksR8XYXVM7ok2VnILQ-CfQQyNowhTW7vQxY7x2DHvj9vGTJW&type=order" }, modalTitle: { default: "西之月客服" }, modalPosition: { default: "center" }, modalWidth: { default: "600px" }, modalHeight: { default: "600px" }, closeOnOverlay: { type: Boolean, default: false }, closeOnEscape: { type: Boolean, default: false }, autoOpenModal: { type: Boolean, default: true }, isFixed: { type: Boolean, default: true }, fixedPosition: { default: "bottom-right" }, fixedOffset: { default: () => ({ x: 20, y: 60 }) }, autoPosition: { type: Boolean, default: true }, mobilePosition: { default: "bottom-right" }, desktopPosition: { default: "bottom-right" } }, emits: ["click", "badgeUpdate", "pollingStart", "pollingStop", "error"], setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emit = __emit; const badgeCount = ref(0); const isPolling = ref(false); const pollingTimer = ref(null); const currentInterval = ref(props.pollingInterval); const modalVisible = ref(false); const buttonStyle = computed(() => ({ background: props.themeColor, boxShadow: `0 4px 12px ${props.themeColor}30` })); const badgeStyle = computed(() => ({ background: props.badgeColor, boxShadow: `0 2px 4px ${props.badgeColor}30` })); const fixedStyle = computed(() => { if (!props.isFixed) return {}; const { x = 20, y = 20 } = props.fixedOffset || {}; let position = props.fixedPosition || "bottom-right"; if (props.autoPosition) { const isMobile = window.innerWidth <= 768; position = isMobile ? props.mobilePosition : props.desktopPosition; } const styles2 = { position: "fixed", zIndex: "9999" }; switch (position) { case "bottom-right": styles2.right = `${x}px`; styles2.bottom = `${y}px`; break; case "bottom-left": styles2.left = `${x}px`; styles2.bottom = `${y}px`; break; case "top-right": styles2.right = `${x}px`; styles2.top = `${y}px`; break; case "top-left": styles2.left = `${x}px`; styles2.top = `${y}px`; break; default: styles2.right = `${x}px`; styles2.bottom = `${y}px`; break; } return styles2; }); const handleClick = () => { emit("click"); if (props.autoOpenModal || props.modalUrl) { modalVisible.value = true; } }; const handleModalOpen = () => { console.log("Modal opened"); }; const handleModalClose = () => { console.log("Modal closed"); }; const fetchBadgeCount = async () => { try { const options = { method: "GET", headers: { "Content-Type": "application/json" }, body: props.params }; const envConfig = getEnvironmentConfig(props.environment); const apiUrl = `${envConfig.apiBaseUrl}/api/unread-count`; const response = await fetch(apiUrl, options); if (response.ok) { const data = await response.json(); const newCount = data.count || 0; badgeCount.value = newCount; emit("badgeUpdate", newCount); } else { throw new Error(`HTTP ${response.status}: ${response.statusText}`); } } catch (error) { emit("error", error); } }; const startPolling = () => { if (isPolling.value) return; isPolling.value = true; emit("pollingStart"); fetchBadgeCount(); pollingTimer.value = setInterval(fetchBadgeCount, currentInterval.value); }; const stopPolling = () => { if (pollingTimer.value) { clearInterval(pollingTimer.value); pollingTimer.value = null; } isPolling.value = false; emit("pollingStop"); }; const updatePollingInterval = (newInterval) => { if (isPolling.value) { stopPolling(); currentInterval.value = newInterval; startPolling(); } }; watch( () => props.enablePolling, (newValue) => { if (newValue && props.autoFetch) { startPolling(); } else { stopPolling(); } } ); watch( () => props.pollingInterval, (newValue) => { if (isPolling.value) { updatePollingInterval(newValue); } } ); onMounted(() => { if (props.autoFetch && props.enablePolling) { startPolling(); } else if (props.autoFetch) { fetchBadgeCount(); } }); onUnmounted(() => { stopPolling(); }); __expose({ fetchBadgeCount, setBadgeCount: (count) => { badgeCount.value = count; emit("badgeUpdate", count); }, startPolling, stopPolling, updatePollingInterval, isPolling: () => isPolling.value, // 弹窗相关方法 openModal: () => { modalVisible.value = true; }, closeModal: () => { modalVisible.value = false; }, toggleModal: () => { modalVisible.value = !modalVisible.value; } }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass(["chat-button-with-badge", { "fixed-bottom-right": _ctx.isFixed }]), style: normalizeStyle(fixedStyle.value) }, [ createElementVNode("div", { class: "chat-button", style: normalizeStyle(buttonStyle.value), onClick: handleClick }, [ createElementVNode("div", _hoisted_1$1, [ _ctx.iconUrl ? (openBlock(), createElementBlock("img", { key: 0, src: _ctx.iconUrl, alt: "chat icon" }, null, 8, _hoisted_2$1)) : (openBlock(), createElementBlock("img", _hoisted_3$1)) ]), _ctx.showBadge && badgeCount.value > 0 ? (openBlock(), createElementBlock("div", { key: 0, class: "badge", style: normalizeStyle(badgeStyle.value) }, toDisplayString(badgeCount.value > 99 ? "99+" : badgeCount.value), 5)) : createCommentVNode("", true) ], 4), createVNode(_sfc_main$2, { visible: modalVisible.value, "onUpdate:visible": _cache[0] || (_cache[0] = ($event) => modalVisible.value = $event), "iframe-url": _ctx.modalUrl, "modal-title": _ctx.modalTitle, position: _ctx.modalPosition, width: _ctx.modalWidth, height: _ctx.modalHeight, "close-on-overlay": _ctx.closeOnOverlay, "close-on-escape": _ctx.closeOnEscape, onOpen: handleModalOpen, onClose: handleModalClose }, null, 8, ["visible", "iframe-url", "modal-title", "position", "width", "height", "close-on-overlay", "close-on-escape"]) ], 6); }; } }); const _hoisted_1 = { class: "chat-icon" }; const _hoisted_2 = ["src"]; const _hoisted_3 = { key: 1, src: _imports_0$1, alt: "chat icon" }; const _sfc_main = /* @__PURE__ */ defineComponent({ __name: "ChatButtonSimple", props: { iconUrl: { default: "" }, themeColor: { default: "#1890ff" }, environment: { default: "development" } }, emits: ["click"], setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const buttonStyle = computed(() => ({ background: props.themeColor, boxShadow: `0 4px 12px ${props.themeColor}30` })); const handleClick = () => { emit("click"); }; onMounted(() => { }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: "chat-button-simple", onClick: handleClick }, [ createElementVNode("div", { class: "chat-button", style: normalizeStyle(buttonStyle.value) }, [ createElementVNode("div", _hoisted_1, [ _ctx.iconUrl ? (openBlock(), createElementBlock("img", { key: 0, src: _ctx.iconUrl, alt: "chat icon", class: "custom-icon" }, null, 8, _hoisted_2)) : (openBlock(), createElementBlock("img", _hoisted_3)) ]) ], 4) ]); }; } }); const styles = ` .chat-button-simple { position: relative; display: inline-block; } .chat-button { position: relative; display: flex; align-items: center; justify-content: center; width: 56px; height: 56px; cursor: pointer; border-radius: 12px; transition: all 0.3s ease; } .chat-button:hover { box-shadow: 0 6px 16px rgb(24 144 255 / 40%) !important; transform: translateY(-2px); } .chat-button:active { transform: translateY(0); } .chat-icon { display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; } .chat-icon svg { width: 20px; height: 20px; } .custom-icon { width: 20px; height: 20px; object-fit: contain; } .chat-button-with-badge { position: relative; display: inline-block; } .chat-button-with-badge.fixed-bottom-right { position: fixed; right: 20px; bottom: 20px; z-index: 9999; } @media (width <= 768px) { .chat-button-with-badge.fixed-bottom-right { right: 16px; bottom: 16px; } } .badge { position: absolute; top: -6px; right: -6px; display: flex; align-items: center; justify-content: center; min-width: 20px; height: 20px; padding: 0 6px; font-size: 12px; font-weight: 600; color: white; border-radius: 10px; animation: pulse 2s infinite; } @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.1); } 100% { transform: scale(1); } } .chat-modal-overlay { position: fixed; inset: 0; z-index: 9999; display: flex; align-items: center; justify-content: center; background: rgb(0 0 0 / 50%); } .chat-modal-container { display: flex; flex-direction: column; overflow: hidden; background: white; border-radius: 8px; box-shadow: 0 4px 20px rgb(0 0 0 / 15%); } .chat-modal-container.right { position: fixed; top: 0; right: 0; bottom: 0; width: var(--modal-width, 400px); height: 100vh; border-radius: 0; animation: slideInRight 0.3s ease-out; } .chat-modal-container.center { width: var(--modal-width, 400px); max-width: 90vw; height: var(--modal-height, 600px); max-height: 90vh; } .chat-modal-container.fullscreen { position: fixed; inset: 0; width: 100vw; height: 100vh; border-radius: 0; } .chat-modal-header { display: flex; align-items: center; justify-content: space-between; padding: 16px 20px; background: #fafafa; border-bottom: 1px solid #e8e8e8; } .chat-modal-title { font-size: 16px; font-weight: 600; color: #333; } .chat-modal-close { display: flex; align-items: center; justify-content: center; width: 32px; height: 32px; color: #666; cursor: pointer; background: transparent; border: none; border-radius: 4px; transition: all 0.2s; } .chat-modal-close:hover { color: #333; background: #f0f0f0; } .chat-modal-close svg { width: 16px; height: 16px; } .chat-modal-content { flex: 1; overflow: hidden; } .chat-modal-iframe { width: 100%; height: 100%; border: none; } .chat-modal-placeholder { display: flex; align-items: center; justify-content: center; height: 100%; font-size: 14px; color: #999; } .modal-fade-enter-active, .modal-fade-leave-active { transition: opacity 0.3s ease; } .modal-fade-enter-from, .modal-fade-leave-to { opacity: 0; } @keyframes slideInRight { from { transform: translateX(100%); } to { transform: translateX(0); } } @media (width <= 768px) { .chat-modal-container.right { width: 100vw; } .chat-modal-container.center { width: 95vw; height: 80vh; } } `; function injectStyles() { try { if (typeof document !== "undefined") { const styleId = "vue-chat-button-styles"; if (!document.getElementById(styleId)) { const style = document.createElement("style"); style.id = styleId; style.textContent = styles; document.head.appendChild(style); console.log("Vue Chat Button styles injected successfully"); } else { console.log("Vue Chat Button styles already injected"); } } } catch (error) { console.warn("Failed to inject Vue Chat Button styles:", error); } } const VueChatButton = { install(app) { injectStyles(); app.component("ChatButtonWithBadge", _sfc_main$1); app.component("ChatButtonSimple", _sfc_main); app.component("ChatModal", _sfc_main$2); if (app._context && app._context.provides) { app.provide("vue-chat-button-styles-injected", true); } } }; export { _sfc_main as ChatButtonSimple, _sfc_main$1 as ChatButtonWithBadge, _sfc_main$2 as ChatModal, VueChatButton as default, detectEnvironment, getEnvironmentConfig };