[mirotalk] - whiteboard refactoring and fix

Fixed eraser mode issue and more...
This commit is contained in:
Miroslav Pejic
2025-12-13 14:08:40 +01:00
committed by GitHub
7 changed files with 114 additions and 116 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
# ====================================================
# MiroTalk P2P v.1.6.76 - Environment Configuration
# MiroTalk P2P v.1.6.77 - Environment Configuration
# ====================================================
# App environment
+1 -1
View File
@@ -2,7 +2,7 @@
/**
* ==============================================
* MiroTalk P2P v.1.6.76 - Configuration File
* MiroTalk P2P v.1.6.77 - Configuration File
* ==============================================
*
* Branding and customizations require a license:
+1 -1
View File
@@ -45,7 +45,7 @@ dependencies: {
* @license For commercial use or closed source, contact us at license.mirotalk@gmail.com or purchase directly from CodeCanyon
* @license CodeCanyon: https://codecanyon.net/item/mirotalk-p2p-webrtc-realtime-video-conferences/38376661
* @author Miroslav Pejic - miroslav.pejic.85@gmail.com
* @version 1.6.76
* @version 1.6.77
*
*/
+58 -58
View File
@@ -1,16 +1,16 @@
{
"name": "mirotalk",
"version": "1.6.76",
"version": "1.6.77",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "mirotalk",
"version": "1.6.76",
"version": "1.6.77",
"license": "AGPL-3.0",
"dependencies": {
"@mattermost/client": "11.1.0",
"@ngrok/ngrok": "1.6.0",
"@ngrok/ngrok": "1.6.1",
"@sentry/node": "^10.30.0",
"axios": "^1.13.2",
"chokidar": "^5.0.0",
@@ -340,33 +340,33 @@
}
},
"node_modules/@ngrok/ngrok": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok/-/ngrok-1.6.0.tgz",
"integrity": "sha512-TWC6nh4Kl16HjhG/bVhpYNP5UIyJc9oZetCrnO4r5+gq95eIxZKoLXzuAyC0gF/J+NEY3c1euFAET5Sn9wOWaw==",
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok/-/ngrok-1.6.1.tgz",
"integrity": "sha512-VFNXErZkehAfw5JLdb4FhSsQug0QmCZSJu2uV8BIMipl78ZEi9U+iLWHDFokYHzC/7FjXOgXW+IXctxI4vys1g==",
"license": "(MIT OR Apache-2.0)",
"engines": {
"node": ">= 10"
},
"optionalDependencies": {
"@ngrok/ngrok-android-arm64": "1.6.0",
"@ngrok/ngrok-darwin-arm64": "1.6.0",
"@ngrok/ngrok-darwin-universal": "1.6.0",
"@ngrok/ngrok-darwin-x64": "1.6.0",
"@ngrok/ngrok-freebsd-x64": "1.6.0",
"@ngrok/ngrok-linux-arm-gnueabihf": "1.6.0",
"@ngrok/ngrok-linux-arm64-gnu": "1.6.0",
"@ngrok/ngrok-linux-arm64-musl": "1.6.0",
"@ngrok/ngrok-linux-x64-gnu": "1.6.0",
"@ngrok/ngrok-linux-x64-musl": "1.6.0",
"@ngrok/ngrok-win32-arm64-msvc": "1.6.0",
"@ngrok/ngrok-win32-ia32-msvc": "1.6.0",
"@ngrok/ngrok-win32-x64-msvc": "1.6.0"
"@ngrok/ngrok-android-arm64": "1.6.1",
"@ngrok/ngrok-darwin-arm64": "1.6.1",
"@ngrok/ngrok-darwin-universal": "1.6.1",
"@ngrok/ngrok-darwin-x64": "1.6.1",
"@ngrok/ngrok-freebsd-x64": "1.6.1",
"@ngrok/ngrok-linux-arm-gnueabihf": "1.6.1",
"@ngrok/ngrok-linux-arm64-gnu": "1.6.1",
"@ngrok/ngrok-linux-arm64-musl": "1.6.1",
"@ngrok/ngrok-linux-x64-gnu": "1.6.1",
"@ngrok/ngrok-linux-x64-musl": "1.6.1",
"@ngrok/ngrok-win32-arm64-msvc": "1.6.1",
"@ngrok/ngrok-win32-ia32-msvc": "1.6.1",
"@ngrok/ngrok-win32-x64-msvc": "1.6.1"
}
},
"node_modules/@ngrok/ngrok-android-arm64": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-android-arm64/-/ngrok-android-arm64-1.6.0.tgz",
"integrity": "sha512-gOfVVjYq7ruPMgH108j99uaBUkwD1DxDpnk+RufQHzxRKL72MZad7QfaRwc1v8iRMyOh3EKYYvU2y8HSXDbSkA==",
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-android-arm64/-/ngrok-android-arm64-1.6.1.tgz",
"integrity": "sha512-s9WOaXfXFKNQ+f55Y1FMd0cQLjWQ+gdZR6pFVDtuwkFVc3AkkbVepYXzXpUZ4CfBOXl13Y5o3r8PFNgSiFSwpw==",
"cpu": [
"arm64"
],
@@ -380,9 +380,9 @@
}
},
"node_modules/@ngrok/ngrok-darwin-arm64": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-darwin-arm64/-/ngrok-darwin-arm64-1.6.0.tgz",
"integrity": "sha512-YdKlEkz0PHHnoy2UlEH2XMrupetmT6K6bLrF+MFWrKYKpIbOuGV4HcVioh1iu0NTmn7xJwrAbo/Mwx2E95/qdg==",
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-darwin-arm64/-/ngrok-darwin-arm64-1.6.1.tgz",
"integrity": "sha512-NKxjzd1JAhi1gtznvrfSmlMXhc6gboVMxpofOQaPzy+mYUn/5+w+wqV0AyehL303EM4jj5BG6G3JNZ+d4jUVcg==",
"cpu": [
"arm64"
],
@@ -396,9 +396,9 @@
}
},
"node_modules/@ngrok/ngrok-darwin-universal": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-darwin-universal/-/ngrok-darwin-universal-1.6.0.tgz",
"integrity": "sha512-yiUCkg10+vUKgvkD2rAZHlzvZmINUNF7mna7iL+ydh4pOx6jamSwDQ2QRseVAyxC9eZVy/rKFYLVnz2Ci+0D9w==",
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-darwin-universal/-/ngrok-darwin-universal-1.6.1.tgz",
"integrity": "sha512-R5f/B7sdPGfmFr1pwAT0nt9SW0R9tkg3uh+70c9J+iNzI89Ff1pgSIK4MdWcqJIJdSvzejgZBgYtGun+pzPClA==",
"license": "MIT",
"optional": true,
"os": [
@@ -409,9 +409,9 @@
}
},
"node_modules/@ngrok/ngrok-darwin-x64": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-darwin-x64/-/ngrok-darwin-x64-1.6.0.tgz",
"integrity": "sha512-a6LbwODDDCRpriILe+1lq+zuIjGbj+pR1A0KThTP8riVTQ538DMqR09kv5Oz7ZqcclS/IK+3ZLKkxHuPX9ob3g==",
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-darwin-x64/-/ngrok-darwin-x64-1.6.1.tgz",
"integrity": "sha512-6btheHdzIBU0BShEqyiF4En5EPpXQ/zMqdfUgOen1RB1EOMgVqA3UKhTry1BlsKgBbFlhnA3ills0MGPxGHo+A==",
"cpu": [
"x64"
],
@@ -425,9 +425,9 @@
}
},
"node_modules/@ngrok/ngrok-freebsd-x64": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-freebsd-x64/-/ngrok-freebsd-x64-1.6.0.tgz",
"integrity": "sha512-t77ayWr0zPrW75DstzvoE6Hwj7h1mpQSFKQ3I0B3iC9o7XZhcNkwFpX8QLbmQNkeHxz5UhlBtzOYPdzDJY+3uw==",
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-freebsd-x64/-/ngrok-freebsd-x64-1.6.1.tgz",
"integrity": "sha512-WFJQxM8bAdOyFZvcH+WJuO+/vUpswJ8pQMHDHFvkyTok4MYY7IntkP1HY3rw5zlsNz7OnBbx4ngDDEyAKLIiZA==",
"cpu": [
"x64"
],
@@ -441,9 +441,9 @@
}
},
"node_modules/@ngrok/ngrok-linux-arm-gnueabihf": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm-gnueabihf/-/ngrok-linux-arm-gnueabihf-1.6.0.tgz",
"integrity": "sha512-NBCJnPAbl44Ua3dpO+kOkyz4cGGLu2FiDcEHBES7OARiSscoui+DyNPLe5auZFjag5/0B3ZNiDgCcdRBAi+KNQ==",
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm-gnueabihf/-/ngrok-linux-arm-gnueabihf-1.6.1.tgz",
"integrity": "sha512-iTH/g1ZGdmb1v8qPfRmgutt1mjcxxeBVpl3Eb1+LVjXC5VqNYN3QgZsl93XDU6YTQEnowgB8NunGnCxg6r4V+g==",
"cpu": [
"arm"
],
@@ -457,9 +457,9 @@
}
},
"node_modules/@ngrok/ngrok-linux-arm64-gnu": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm64-gnu/-/ngrok-linux-arm64-gnu-1.6.0.tgz",
"integrity": "sha512-i65WIaeImO2/oyTfwUAVW1j/poLMzX/PAYsDRLXOac6/1DV6kIQX1kmr+CEs6NtmKgD76QiApbqtksd9MDlncg==",
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm64-gnu/-/ngrok-linux-arm64-gnu-1.6.1.tgz",
"integrity": "sha512-a4LRMFbn5nGwP1n8w54Td9OPmTgYz62IaUwgHzcnv8mzXq8YqR7bwjRtcASmLpqRRv2XM+E1bO5z2qtQEzT0qg==",
"cpu": [
"arm64"
],
@@ -473,9 +473,9 @@
}
},
"node_modules/@ngrok/ngrok-linux-arm64-musl": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm64-musl/-/ngrok-linux-arm64-musl-1.6.0.tgz",
"integrity": "sha512-7osqE43Pl6HiTeLZSEnSTtgbNQ1zqYovYjZ7lGgeKJHlgWXE6RvE7qhdjDw17ebUuT0IS8JPGZFnlyF6J0UKPQ==",
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm64-musl/-/ngrok-linux-arm64-musl-1.6.1.tgz",
"integrity": "sha512-KMj0SN9haYfMKTuIufDQ4GkMwIB07anVsj4PZoBuy61CW45YgeLzU6XbqYF1bUwfSeHiTvz7MUZT1FDDQxJsKg==",
"cpu": [
"arm64"
],
@@ -489,9 +489,9 @@
}
},
"node_modules/@ngrok/ngrok-linux-x64-gnu": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-x64-gnu/-/ngrok-linux-x64-gnu-1.6.0.tgz",
"integrity": "sha512-jP3enLStnTGTKLBXqctVt3wIVvGLP/BkLKYuXwrU1EqchtvDcsAhpspeUeX23SAtLXUgbX9vN1B6IvsAxWcyxw==",
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-x64-gnu/-/ngrok-linux-x64-gnu-1.6.1.tgz",
"integrity": "sha512-mjPC+XJazBuwXPD1VxbqrUKMigS7yJuqFq3waI9QjtiEUAVXk3lbouGfkR2UPXZ+soVhyh3amlthYGm/p3rzKA==",
"cpu": [
"x64"
],
@@ -505,9 +505,9 @@
}
},
"node_modules/@ngrok/ngrok-linux-x64-musl": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-x64-musl/-/ngrok-linux-x64-musl-1.6.0.tgz",
"integrity": "sha512-hrBrXCofgmY9pc36N0nfDS+bfomu5hOqt0N5IQkL4n0UaQcl48tKddIex2eR+mU3QBYh6p1XKxAwyAVjwplD2w==",
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-x64-musl/-/ngrok-linux-x64-musl-1.6.1.tgz",
"integrity": "sha512-n4GxqkqvTJp0mkFz2Qr4JTnJ//vIZa7wRQAWOL9P05zDFqiiBd3qHG5aVl6yBlN49lWMcZ1saI7A4OYyLOANlQ==",
"cpu": [
"x64"
],
@@ -521,9 +521,9 @@
}
},
"node_modules/@ngrok/ngrok-win32-arm64-msvc": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-win32-arm64-msvc/-/ngrok-win32-arm64-msvc-1.6.0.tgz",
"integrity": "sha512-EXJXFaXh/cNRaTqs02EmysILtcSImFWwC98mjG6PU5MEG+gqNz8AddnqFytY0RRxkR9SxwnC+7QAV3qYOSU6kA==",
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-win32-arm64-msvc/-/ngrok-win32-arm64-msvc-1.6.1.tgz",
"integrity": "sha512-9yR4ztXjVkzu6BwKxCNz7xXE4JKs1evF3+MFzy9aJvn7x0WBTj3I6pN8NQ8mUCsx817mjhgXrSnuWG3DUz4xTQ==",
"cpu": [
"arm64"
],
@@ -537,9 +537,9 @@
}
},
"node_modules/@ngrok/ngrok-win32-ia32-msvc": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-win32-ia32-msvc/-/ngrok-win32-ia32-msvc-1.6.0.tgz",
"integrity": "sha512-R+5WB6ONT4ynHFusxRw8kbXx2SBYftl6XUiNQNmwwCdwdNO7fPzdwhbmbzgfCEjQrYQrXD1vs5J+zJJeSaAicw==",
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-win32-ia32-msvc/-/ngrok-win32-ia32-msvc-1.6.1.tgz",
"integrity": "sha512-BpXjR6+Y6/gydEpdT5DBAyr7LBdW4KvtZ+5N2l4UTnH+j4yHyhQ0PZOKSOxLJToDobJcCRVQQuNn6Xdj7yVysw==",
"cpu": [
"ia32"
],
@@ -553,9 +553,9 @@
}
},
"node_modules/@ngrok/ngrok-win32-x64-msvc": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-win32-x64-msvc/-/ngrok-win32-x64-msvc-1.6.0.tgz",
"integrity": "sha512-4QViW0GSPsjmghYPExO0Jt9DtIybK23MXPP0BltOuoFP0iyA15vb03QXAI4223zlSLWSWYnOx+qnCuzV1qT0lQ==",
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-win32-x64-msvc/-/ngrok-win32-x64-msvc-1.6.1.tgz",
"integrity": "sha512-zk4vA4JvRh7srIM3s9dDKFeaa9pjpEgVGku4+rZFI83o5ZvkQ1csRV+2nJIOKs5+hWVm0bIij2JLH+WvWcmPZQ==",
"cpu": [
"x64"
],
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "mirotalk",
"version": "1.6.76",
"version": "1.6.77",
"description": "A free WebRTC browser-based video call",
"main": "server.js",
"scripts": {
@@ -42,7 +42,7 @@
"homepage": "https://github.com/miroslavpejic85/mirotalk",
"dependencies": {
"@mattermost/client": "11.1.0",
"@ngrok/ngrok": "1.6.0",
"@ngrok/ngrok": "1.6.1",
"@sentry/node": "^10.30.0",
"axios": "^1.13.2",
"chokidar": "^5.0.0",
+1 -1
View File
@@ -77,7 +77,7 @@ let brand = {
},
about: {
imageUrl: '../images/mirotalk-logo.gif',
title: 'WebRTC P2P v1.6.76',
title: 'WebRTC P2P v1.6.77',
html: `
<button
id="support-button"
+50 -52
View File
@@ -15,7 +15,7 @@
* @license For commercial use or closed source, contact us at license.mirotalk@gmail.com or purchase directly from CodeCanyon
* @license CodeCanyon: https://codecanyon.net/item/mirotalk-p2p-webrtc-realtime-video-conferences/38376661
* @author Miroslav Pejic - miroslav.pejic.85@gmail.com
* @version 1.6.76
* @version 1.6.77
*
*/
@@ -668,7 +668,9 @@ let wbIsLock = false;
let wbIsDrawing = false;
let wbIsOpen = false;
let wbIsRedoing = false;
let wbIsObject = false;
let wbIsEraser = false;
let wbIsPencil = false;
let wbIsVanishing = false;
let wbIsBgTransparent = false;
let wbPop = [];
@@ -5937,15 +5939,18 @@ function setMyWhiteboardBtn() {
handleWhiteboardToggle();
});
whiteboardPencilBtn.addEventListener('click', (e) => {
whiteboardIsDrawingMode(true);
whiteboardResetAllMode();
whiteboardIsPencilMode(true);
});
whiteboardObjectBtn.addEventListener('click', (e) => {
whiteboardIsDrawingMode(false);
whiteboardResetAllMode();
whiteboardIsObjectMode(true);
});
whiteboardStickyNoteBtn.addEventListener('click', (e) => {
whiteboardAddObj('stickyNote');
});
whiteboardVanishingBtn.addEventListener('click', (e) => {
whiteboardResetAllMode();
whiteboardIsVanishingMode(true);
});
whiteboardUndoBtn.addEventListener('click', (e) => {
@@ -5987,7 +5992,8 @@ function setMyWhiteboardBtn() {
whiteboardAddObj('circle');
});
whiteboardEraserBtn.addEventListener('click', (e) => {
whiteboardIsEraser(true);
whiteboardResetAllMode();
whiteboardIsEraserMode(true);
});
whiteboardCleanBtn.addEventListener('click', (e) => {
confirmCleanBoard();
@@ -6003,7 +6009,8 @@ function setMyWhiteboardBtn() {
});
wbDrawingColorEl.addEventListener('change', (e) => {
wbCanvas.freeDrawingBrush.color = wbDrawingColorEl.value;
whiteboardIsDrawingMode(true);
whiteboardResetAllMode();
whiteboardIsPencilMode(true);
});
wbBackgroundColorEl.addEventListener('change', (e) => {
setWhiteboardBgColor(wbBackgroundColorEl.value);
@@ -11318,7 +11325,7 @@ function setupWhiteboardCanvas() {
wbCanvas = new fabric.Canvas('wbCanvas');
wbCanvas.freeDrawingBrush.color = '#FFFFFF';
wbCanvas.freeDrawingBrush.width = 3;
whiteboardIsDrawingMode(true);
whiteboardIsPencilMode(true);
}
/**
@@ -11403,62 +11410,48 @@ function setWhiteboardBgColor(color) {
}
/**
* Whiteboard: drawing mode
* @param {boolean} status of drawing mode
* Reset all whiteboard mode
*/
function whiteboardIsDrawingMode(status) {
wbCanvas.isDrawingMode = status;
if (status) {
setColor(whiteboardPencilBtn, 'green');
setColor(whiteboardVanishingBtn, 'white');
setColor(whiteboardObjectBtn, 'white');
setColor(whiteboardEraserBtn, 'white');
wbIsEraser = false;
wbIsVanishing = false;
} else {
setColor(whiteboardPencilBtn, 'white');
setColor(whiteboardVanishingBtn, 'white');
setColor(whiteboardObjectBtn, 'green');
}
function whiteboardResetAllMode() {
whiteboardIsPencilMode(false);
whiteboardIsVanishingMode(false);
whiteboardIsObjectMode(false);
whiteboardIsEraserMode(false);
}
/**
* Whiteboard: vanishing mode
* @param {boolean} status if vanishing mode on
* Set whiteboard Pencil mode
*/
function whiteboardIsPencilMode(status) {
wbCanvas.isDrawingMode = status;
wbIsPencil = status;
setColor(whiteboardPencilBtn, wbIsPencil ? 'green' : 'white');
}
/**
* Set whiteboard Vanishing mode
*/
function whiteboardIsVanishingMode(status) {
wbCanvas.isDrawingMode = status;
wbIsVanishing = status;
if (status) {
setColor(whiteboardVanishingBtn, 'green');
setColor(whiteboardPencilBtn, 'white');
setColor(whiteboardObjectBtn, 'white');
setColor(whiteboardEraserBtn, 'white');
wbIsEraser = false;
} else {
setColor(whiteboardVanishingBtn, 'white');
wbCanvas.isDrawingMode = false;
setColor(whiteboardObjectBtn, 'green');
}
wbCanvas.freeDrawingBrush.color = wbIsVanishing ? 'yellow' : wbDrawingColorEl.value;
setColor(whiteboardVanishingBtn, wbIsVanishing ? 'green' : 'white');
}
/**
* Whiteboard: eraser
* @param {boolean} status if eraser on
* Set whiteboard Object mode
*/
function whiteboardIsEraser(status) {
if (status) {
wbCanvas.isDrawingMode = false;
wbIsVanishing = false;
setColor(whiteboardPencilBtn, 'white');
setColor(whiteboardVanishingBtn, 'white');
setColor(whiteboardObjectBtn, 'white');
setColor(whiteboardEraserBtn, 'green');
} else {
setColor(whiteboardEraserBtn, 'white');
setColor(whiteboardObjectBtn, 'green');
}
function whiteboardIsObjectMode(status) {
wbIsObject = status;
setColor(whiteboardObjectBtn, status ? 'green' : 'white');
}
/**
* Set whiteboard Eraser mode
*/
function whiteboardIsEraserMode(status) {
wbIsEraser = status;
setColor(whiteboardEraserBtn, wbIsEraser ? 'green' : 'white');
}
/**
@@ -11475,6 +11468,8 @@ function setColor(elem, color) {
* @param {string} type of object to add
*/
function whiteboardAddObj(type) {
wbCanvas.freeDrawingBrush.color = wbDrawingColorEl.value;
switch (type) {
case 'imgUrl':
Swal.fire({
@@ -11842,7 +11837,8 @@ async function renderPdfToCanvas(wbCanvasPdf) {
reader.onload = async function (event) {
wbCanvas.requestRenderAll();
await pdfToImage(event.target.result, wbCanvas);
whiteboardIsDrawingMode(false);
whiteboardResetAllMode();
whiteboardIsObjectMode(false);
wbCanvasToJson();
};
reader.readAsDataURL(wbCanvasPdf);
@@ -11932,7 +11928,8 @@ async function pdfToImage(pdfData, canvas) {
function addWbCanvasObj(obj) {
if (obj) {
wbCanvas.add(obj).setActiveObject(obj);
whiteboardIsDrawingMode(false);
whiteboardResetAllMode();
whiteboardIsObjectMode(true);
wbCanvasToJson();
} else {
console.error('Invalid input. Expected an obj of canvas elements');
@@ -12395,6 +12392,7 @@ function setupWhiteboardShortcuts() {
event.preventDefault();
break;
case 'KeyV': // Vanishing Pen
whiteboardResetAllMode();
whiteboardIsVanishingMode(!wbIsVanishing);
event.preventDefault();
break;
@@ -13229,7 +13227,7 @@ function showAbout() {
Swal.fire({
background: swBg,
position: 'center',
title: brand.about?.title && brand.about.title.trim() !== '' ? brand.about.title : 'WebRTC P2P v1.6.76',
title: brand.about?.title && brand.about.title.trim() !== '' ? brand.about.title : 'WebRTC P2P v1.6.77',
imageUrl: brand.about?.imageUrl && brand.about.imageUrl.trim() !== '' ? brand.about.imageUrl : images.about,
customClass: { image: 'img-about' },
html: `