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
JavaScript
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
};