Skip to content
Snippets Groups Projects
app.js 3.22 KiB
Newer Older
  • Learn to ignore specific revisions
  • import { line, curveBasis } from "d3-shape"
    
    Nayeem Rahman's avatar
    Nayeem Rahman committed
    import uuidv4 from "uuid/v4"
    import yMemory from "y-memory"
    import yMap from "y-map"
    import yArray from "y-array"
    import Y from "yjs"
    
    Nayeem Rahman's avatar
    Nayeem Rahman committed
    import yWebrtc from "./y-webrtc/index.js"
    
    yMemory(Y)
    yMap(Y)
    yArray(Y)
    yWebrtc(Y)
    
      },
      connector: {
        name: "webrtc",
        host: "localhost",
        port: 3000,
    
      const userIDElem = document.getElementById("user-id")
      const peerIDElem = document.getElementById("peer-id")
      const peerButton = document.getElementById("peer-connect")
      const connectedP = document.getElementById("connected-peers")
    
      userIDElem.value = y.db.userId
    
      y.connector.onUserEvent(function(event) {
        switch (event.action) {
          case "userID":
            userIDElem.value = event.id
            break
          case "userJoined":
            var peerElem = document.createElement("li")
            peerElem.innerHTML = event.user
            connectedP.appendChild(peerElem)
            break
          case "userLeft":
            for (var peer of connectedP.children) {
              if (peer.innerHTML == event.user) {
                connectedP.removeChild(peer)
              }
            }
            break
        }
      })
    
      peerButton.onclick = function() {
        const peerID = peerIDElem.value
    
        if (peerID == "") {
          return
        }
    
        y.connector.connectToPeer(peerID)
    
        peerIDElem.value = ""
    
    
      const whiteboard = document.getElementById("whiteboard")
    
      var painting = false
      var paths = new Map()
      var pathID
    
      function createOrUpdatePath(uid, points) {
    
        const lineFn = line()
          .x((d) => d[0])
          .y((d) => d[1])
          .curve(curveBasis)
    
    
        var path = paths.get(uid)
    
        if (path === undefined) {
          path = document.createElementNS("http://www.w3.org/2000/svg", "path")
    
          path.setAttribute("stroke", "blue")
          path.setAttribute("stroke-width", 3)
          path.setAttribute("fill", "none")
          path.setAttribute("pointer-events", "none")
    
          whiteboard.appendChild(path)
    
          paths.set(uid, path)
        }
    
        points = points.toArray().filter((point) => point !== undefined)
    
        if (points.length <= 0) {
          path.removeAttribute("d")
    
          return path
        }
    
    
    
        return path
      }
    
      whiteboard.onmousedown = function(e) {
        painting = true
    
        const mouse = {
          x: e.offsetX,
          y: e.offsetY,
        }
    
        pathID = uuidv4()
    
        const sharedPath = y.share.drawing.set(pathID, Y.Array)
        sharedPath.push([[mouse.x, mouse.y]])
      }
    
      whiteboard.onmouseup = function() {
        painting = false
      }
    
      whiteboard.onmousemove = function(e) {
        const mouse = {
          x: e.offsetX,
          y: e.offsetY,
        }
    
        if (painting) {
          const sharedPath = y.share.drawing.get(pathID)
          sharedPath.push([[mouse.x, mouse.y]])
        }
      }
    
      y.share.drawing.observe(function(lineEvent) {
        const lineID = lineEvent.name
    
        switch (lineEvent.type) {
          case "add":
            createOrUpdatePath(lineID, lineEvent.value)
    
            lineEvent.value.observe(function(pointEvent) {
              switch (pointEvent.type) {
                case "insert":
                  createOrUpdatePath(lineID, pointEvent.object)
                  break
              }
            })
    
            break
        }
      })