@tencentcloud/roomkit-web-vue3
Version:
<h1 align="center"> TUIRoomKit</h1> Conference (TUIRoomKit) is a product suitable for multi-person audio and video conversation scenarios such as business meetings, webinars, and online education. By integrating this product, you can add room management,
130 lines (129 loc) • 4.81 kB
JavaScript
var __defProp = Object.defineProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
import { EventType } from "../types.mjs";
class WaterMark {
constructor(service) {
__publicField(this, "service");
__publicField(this, "isWatermarkEnabled", false);
__publicField(this, "handleRoomStart", () => {
this.updateWatermarkVisibility(true);
});
__publicField(this, "handleRoomJoin", () => {
this.updateWatermarkVisibility(true);
});
this.service = service;
this.bindEvent();
}
bindEvent() {
this.service.on(EventType.ROOM_START, this.handleRoomStart);
this.service.on(EventType.ROOM_JOIN, this.handleRoomJoin);
}
dispose() {
this.service.off(EventType.ROOM_START, this.handleRoomStart);
this.service.off(EventType.ROOM_JOIN, this.handleRoomJoin);
}
toggleWatermark(enabled) {
this.isWatermarkEnabled = enabled;
this.updateWatermarkVisibility(enabled);
}
updateWatermarkVisibility(enabled) {
const watermarkContainer = document.querySelector(".watermark-container");
if (!enabled || !this.isWatermarkEnabled) {
watermarkContainer == null ? void 0 : watermarkContainer.remove();
return;
}
if (!watermarkContainer) {
const videoElement = document.querySelector(".content-container");
const { userId, userName } = this.service.basicStore;
this.addWatermark(videoElement, `${userName}(${userId})`);
}
}
addStyles() {
const styles = `
.watermark-container {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
}
.watermark {
font-size: 16px;
position: absolute;
transform: rotate(-45deg);
opacity: 0.3;
word-wrap: break-word;
text-align: center;
color: #99A2B2;
max-width: 400px;
font-weight: 500;
}
`;
const styleElement = document.createElement("style");
styleElement.type = "text/css";
styleElement.appendChild(document.createTextNode(styles));
document.head.appendChild(styleElement);
}
addWatermark(targetElement, watermarkText) {
if (!targetElement) return;
this.addStyles();
let watermarkContainer = document.createElement("div");
watermarkContainer.classList.add("watermark-container");
targetElement.appendChild(watermarkContainer);
const addWatermarkElements = () => {
watermarkContainer.innerHTML = "";
const maxWidth = 200;
const watermarkSpacing = maxWidth + 25;
for (let y = -225; y < watermarkContainer.offsetHeight + watermarkSpacing; y += watermarkSpacing) {
for (let x = -225; x < watermarkContainer.offsetWidth + watermarkSpacing; x += watermarkSpacing) {
const watermarkElement = document.createElement("div");
watermarkElement.classList.add("watermark");
watermarkElement.textContent = watermarkText;
watermarkElement.style.left = `${x}px`;
watermarkElement.style.top = `${y}px`;
watermarkContainer.appendChild(watermarkElement);
}
}
};
addWatermarkElements();
const resizeObserver = new ResizeObserver(addWatermarkElements);
resizeObserver.observe(watermarkContainer);
const observerCallback = (mutations, observer) => {
mutations.forEach((mutation) => {
if (mutation.removedNodes.length > 0) {
const removedWatermark = Array.from(mutation.removedNodes).some(
(node) => {
var _a;
return (_a = node.classList) == null ? void 0 : _a.contains("watermark-container");
}
);
if (removedWatermark) {
watermarkContainer = document.createElement("div");
watermarkContainer.classList.add("watermark-container");
targetElement.appendChild(watermarkContainer);
addWatermarkElements();
observer.disconnect();
observeChanges();
}
}
if (mutation.type === "attributes" && mutation.attributeName === "style") {
watermarkContainer.style.display = "";
}
});
};
const observeChanges = () => {
const observer = new MutationObserver(observerCallback);
observer.observe(targetElement, { childList: true });
observer.observe(watermarkContainer, {
attributes: true,
attributeFilter: ["style"]
});
};
observeChanges();
}
}
export {
WaterMark
};