Files
knet/js/draw.js
JurajKubrican 70b0b70f65 nicer boxes
2025-08-04 19:39:13 +02:00

84 lines
2.8 KiB
JavaScript

"use strict";
(() => {
const drawElement = document.getElementById("drawDiv");
if (!drawElement) {
throw new Error("canvas not found");
}
const emitter = mitt();
let drawing = false;
let previous = null;
const socket = initSocket("/draw/ws");
const serializeDraw = ({ from, to }) => `${from.x},${from.y},${to.x},${to.y}`;
const deserializeDraw = (message) => {
const parts = message.split(",");
return {
from: { x: Number(parts[0]), y: Number(parts[1]) },
to: { x: Number(parts[2]), y: Number(parts[3]) },
};
};
emitter.on("mouseDraw", (e) => sendMessage(e));
const sendMessage = (e) => socket.send(serializeDraw(e));
const mouseDown = () => {
drawing = true;
previous = null;
};
const mouseUp = () => {
drawing = false;
};
const mouseMove = (e) => {
if (!drawing)
return;
if (previous) {
emitter.emit("mouseDraw", {
from: previous,
to: { x: e.offsetX, y: e.offsetY },
});
}
previous = { x: e.offsetX, y: e.offsetY };
};
const touchMove = (e) => {
e.preventDefault();
mouseMove({
offsetX: e.touches[0].clientX - drawElement.offsetLeft,
offsetY: e.touches[0].clientY - drawElement.offsetTop,
});
};
drawElement.addEventListener("mousedown", mouseDown);
drawElement.addEventListener("mouseup", mouseUp);
drawElement.addEventListener("mousemove", mouseMove);
drawElement.addEventListener("touchstart", mouseDown);
drawElement.addEventListener("touchend", mouseUp);
drawElement.addEventListener("touchmove", touchMove);
const receiveCanvas = document.getElementById("receiveCanvas");
const recCtx = receiveCanvas?.getContext("2d");
if (!recCtx || !receiveCanvas) {
throw new Error("canvas not found");
}
const render = (data) => {
const { from, to } = data;
if (recCtx.strokeStyle != "white") {
recCtx.lineWidth = 2;
recCtx.lineCap = "round";
recCtx.strokeStyle = "white";
}
recCtx.beginPath();
recCtx.moveTo(from.x, from.y);
recCtx.lineTo(to.x, to.y);
recCtx.closePath();
recCtx.stroke();
};
emitter.on("mouseDraw", render);
emitter.on("netDraw", render);
socket.addMessageListener((data) => {
if (data === "ping" || data.startsWith("pong"))
return;
emitter.emit("netDraw", deserializeDraw(data));
});
const resizeObserver = new ResizeObserver((entries) => {
const entry = entries.at(0);
receiveCanvas.height = entry?.contentRect.height ?? 500;
receiveCanvas.width = entry?.contentRect.width ?? 500;
});
resizeObserver.observe(drawElement);
})();