From bf07570a3e6b9f8d431702c358285705f19d2993 Mon Sep 17 00:00:00 2001
From: Yuriy Maksymets <iurii.maksymets@gmail.com>
Date: Thu, 31 Oct 2019 15:48:00 +0000
Subject: [PATCH] Room event dispatch refactoring

---
 src/room.js | 72 +++++++++++++++++++++++++++++------------------------
 1 file changed, 39 insertions(+), 33 deletions(-)

diff --git a/src/room.js b/src/room.js
index 60d23cd..441e635 100644
--- a/src/room.js
+++ b/src/room.js
@@ -145,60 +145,66 @@ class Room extends EventTarget {
         mergeIntervals: "Map",
       },
     })
+
+    const dispatchRemovedIntervalsEvent = (lineEvent) => {
+      const id = lineEvent.name
+      const intervals = this._generateRemovedIntervals(id)
+      const points = this._generatePath(id)
+      const detail = { id, intervals, points }
+      this.dispatchEvent(
+        new CustomEvent("removedIntervalsChange", {
+          detail,
+        }),
+      )
+    }
+
+    const dispatchPathUpdateEvent = (lineEvent) => {
+      const id = lineEvent.name
+      const points = this._generatePath(id)
+      const detail = { id, points }
+      this.dispatchEvent(new CustomEvent("addOrUpdatePath", { detail }))
+    }
+
     this._y.share.strokeAdd.observe((lineEvent) => {
       if (lineEvent.type == "add") {
-        const points = this._generatePath(lineEvent.name)
-        const detail = { id: lineEvent.name, points }
-        this.dispatchEvent(new CustomEvent("addOrUpdatePath", { detail }))
+        dispatchPathUpdateEvent(lineEvent)
+
         lineEvent.value.observe((pointEvent) => {
           if (pointEvent.type == "insert") {
-            const points = this._generatePath(lineEvent.name)
-            const detail = { id: lineEvent.name, points }
-            this.dispatchEvent(new CustomEvent("addOrUpdatePath", { detail }))
+            dispatchPathUpdateEvent(lineEvent)
           }
         })
       }
     })
     this._y.share.strokeErase.observe((lineEvent) => {
       if (lineEvent.type == "add") {
-        const points = this._generatePath(lineEvent.name)
-        const detail = { id: lineEvent.name, points }
-        this.dispatchEvent(new CustomEvent("addOrUpdatePath", { detail }))
+        dispatchPathUpdateEvent(lineEvent)
+
         lineEvent.value.observe((pointEvent) => {
           if (pointEvent.type == "add") {
-            const points = this._generatePath(lineEvent.name)
-            const detail = { id: lineEvent.name, points }
-            this.dispatchEvent(new CustomEvent("addOrUpdatePath", { detail }))
+            dispatchPathUpdateEvent(lineEvent)
           }
         })
       }
     })
     this.sharedMergeIntervals.observe((lineEvent) => {
-      if (lineEvent.type == "add") {
-        const dispatchEvent = () => {
-          const id = lineEvent.name
-          const intervals = this._generateRemovedIntervals(id)
-          const points = this._generatePath(lineEvent.name)
-
-          this.dispatchEvent(
-            new CustomEvent("removedIntervalsChange", {
-              detail: { id, intervals, points },
-            }),
-          )
-        }
+      if (lineEvent.type != "add") {
+        return
+      }
 
-        dispatchEvent()
+      dispatchRemovedIntervalsEvent(lineEvent)
 
-        lineEvent.value.observe((pointEvent) => {
-          if (pointEvent.type == "add") {
-            dispatchEvent()
+      lineEvent.value.observe((pointEvent) => {
+        if (pointEvent.type != "add") {
+          return
+        }
 
-            pointEvent.value.observe(() => {
-              dispatchEvent()
-            })
-          }
+        dispatchRemovedIntervalsEvent(lineEvent)
+
+        pointEvent.value.observe(() => {
+          dispatchRemovedIntervalsEvent(lineEvent)
         })
-      }
+      })
     })
   }
 }
-- 
GitLab