Skip to content
Snippets Groups Projects
app.js 2.11 KiB
Newer Older
import { line, curveBasis } from "d3-shape"
import {
  canvas,
  connectedPeers,
  peerButton,
  peerIDElem,
  userIDElem,
} from "./elements.js"
import { connect } from "./room.js"

const pathElems = new Map()

const addOrUpdatePathElem = (id, points) => {
  const lineFn = line()
    .x((d) => d[0])
    .y((d) => d[1])
    .curve(curveBasis)

  let pathElem = pathElems.get(id)

  if (pathElem == null) {
    pathElem = document.createElementNS("http://www.w3.org/2000/svg", "path")
    pathElem.setAttribute("stroke", "blue")
    pathElem.setAttribute("stroke-width", 3)
    pathElem.setAttribute("fill", "none")
    pathElem.setAttribute("pointer-events", "none")
    canvas.appendChild(pathElem)
    pathElems.set(id, pathElem)
  if (points.length == 0) {
    pathElem.removeAttribute("d")
    return pathElem
  }
  pathElem.setAttribute("d", lineFn(points))
  return pathElem
}
connect("imperial").then((room) => {
  let painting = false
  let currentPathID = null
  userIDElem.value = room.ownID || ""
  room.addEventListener("allocateOwnID", ({ detail: id }) => {
    userIDElem.value = id
  })
  room.addEventListener("userJoin", ({ detail: id }) => {
    const peerElem = document.createElement("li")
    peerElem.innerHTML = id
    connectedPeers.appendChild(peerElem)
  })
  room.addEventListener("userLeave", ({ detail: id }) => {
    for (const peerElem of connectedPeers.children) {
      if (peerElem.innerHTML == id) {
        connectedPeers.removeChild(peerElem)
      }
  room.addEventListener("addOrUpdatePath", ({ detail: { id, points } }) => {
    addOrUpdatePathElem(id, points)
  })
  canvas.addEventListener("mousedown", (e) => {
    currentPathID = room.addPath([e.offsetX, e.offsetY])
  canvas.addEventListener("mouseup", () => {
  canvas.addEventListener("mousemove", (e) => {
      room.extendPath(currentPathID, [e.offsetX, e.offsetY])
  peerButton.addEventListener("click", () => {
    const peerID = peerIDElem.value
    if (peerID == "") {
      return
    room.inviteUser(peerID)
    peerIDElem.value = ""