diff --git a/src/app.js b/src/app.js
index 10ab8c2cac911c8c1075876b18683de8b32b6081..9f7061586ca60a2070ccb57922ca23f11c1d1b90 100644
--- a/src/app.js
+++ b/src/app.js
@@ -163,11 +163,6 @@ const onRoomConnect = (room_) => {
     HTML.fastUndoButton.classList.remove("disabled")
     HTML.undoButton.classList.remove("disabled")
   })
-
-  room.addEventListener("undoDisabled", () => {
-    HTML.fastUndoButton.classList.add("disabled")
-    HTML.undoButton.classList.add("disabled")
-  })
 }
 
 const tryRoomConnect = async (roomID) => {
@@ -208,11 +203,26 @@ const onRoomJoinEnter = () => {
 
 HTML.roomConnectButton.addEventListener("click", onRoomJoinEnter)
 
-HTML.fastUndoButton.addEventListener(
-  "click",
-  () => room != null && room.fastUndo(),
-)
-HTML.undoButton.addEventListener("click", () => room != null && room.undo())
+HTML.fastUndoButton.addEventListener("click", () => {
+  if (room == null) return
+
+  room.fastUndo()
+
+  if (!room.canUndo) {
+    HTML.fastUndoButton.classList.add("disabled")
+    HTML.undoButton.classList.add("disabled")
+  }
+})
+HTML.undoButton.addEventListener("click", () => {
+  if (room == null) return
+
+  room.undo()
+
+  if (!room.canUndo) {
+    HTML.fastUndoButton.classList.add("disabled")
+    HTML.undoButton.classList.add("disabled")
+  }
+})
 
 HTML.roomIDElem.addEventListener("keydown", (event) => {
   if (event.key == "Enter") {
diff --git a/src/room.js b/src/room.js
index c0325bb3e821168b29c82201da34d0443a99d3db..c8422ab6798ebf10d00712e256c32894ed69a0fc 100644
--- a/src/room.js
+++ b/src/room.js
@@ -72,10 +72,6 @@ class Room extends EventTarget {
     const [id, ...interval] = operation
 
     this.shared.eraseIntervals.get(id).merge([interval])
-
-    if (this.undoStack.length <= 0) {
-      this.dispatchEvent(new CustomEvent("undoDisabled"))
-    }
   }
 
   fastUndo() {
@@ -96,10 +92,10 @@ class Room extends EventTarget {
     this.undoStack = this.undoStack.slice(0, Math.max(0, from))
 
     this.shared.eraseIntervals.get(id).merge([[0, end]])
+  }
 
-    if (this.undoStack.length <= 0) {
-      this.dispatchEvent(new CustomEvent("undoDisabled"))
-    }
+  get canUndo() {
+    return this.undoStack.length > 0
   }
 
   getPaths() {