From 9618e07bc6dfb4c0d664d77c12b3b726f8268323 Mon Sep 17 00:00:00 2001
From: Andrei <amborn02@gmail.com>
Date: Sun, 26 Jan 2025 19:07:27 -0600
Subject: [PATCH] refactoring pointer events and input handling improvements

---
 src/App.vue                                   |  9 +-
 src/components/gameMaster/mapEditor/Map.vue   | 29 +-----
 .../mapEditor/mapPartials/MapEventTiles.vue   | 34 ++++---
 .../mapEditor/mapPartials/MapTiles.vue        | 99 +++++++++++--------
 .../mapPartials/PlacedMapObjects.vue          | 23 +++--
 .../mapEditor/partials/CreateMap.vue          |  3 +-
 .../mapEditor/partials/MapSettings.vue        |  2 +-
 .../gameMaster/mapEditor/partials/Toolbar.vue |  6 +-
 src/components/screens/MapEditor.vue          | 32 +++---
 .../useMapEditorPointerHandlers.ts            |  6 +-
 src/composables/useMapEditorComposable.ts     | 38 -------
 11 files changed, 123 insertions(+), 158 deletions(-)

diff --git a/src/App.vue b/src/App.vue
index b2a2de4..b948b35 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -2,7 +2,7 @@
   <Debug />
   <Notifications />
   <BackgroundImageLoader />
-  <GmPanel v-if="gameStore.character?.role === 'gm'" @open-map-editor="isEditorShown = true"/>
+  <GmPanel v-if="gameStore.character?.role === 'gm'" @open-map-editor="mapEditor.active.value = true"/>
   <component :is="currentScreen" />
 </template>
 
@@ -22,21 +22,20 @@ import { computed, ref, useTemplateRef, watch } from 'vue'
 import { useMapEditorComposable } from '@/composables/useMapEditorComposable'
 
 const gameStore = useGameStore()
-
-const isEditorShown = ref(false)
+const mapEditor = useMapEditorComposable()
 
 const currentScreen = computed(() => {
   if (!gameStore.game.isLoaded) return Loading
   if (!gameStore.connection) return Login
   if (!gameStore.token) return Login
   if (!gameStore.character) return Characters
-  if (isEditorShown.value) return MapEditor
+  if (mapEditor.active.value) return MapEditor
   return Game
 })
 
 // Watch mapEditor.active and empty gameStore.game.loadedAssets
 watch(
-  () => isEditorShown.value,
+  () => mapEditor.active.value,
   () => {
     gameStore.game.loadedTextures = []
   }
diff --git a/src/components/gameMaster/mapEditor/Map.vue b/src/components/gameMaster/mapEditor/Map.vue
index 8bd81f7..3485224 100644
--- a/src/components/gameMaster/mapEditor/Map.vue
+++ b/src/components/gameMaster/mapEditor/Map.vue
@@ -1,5 +1,5 @@
 <template>
-  <MapTiles ref="mapTiles" :tileMap="tileMap" @tileMap:create="tileMap = $event" />
+  <MapTiles ref="mapTiles" @tileMap:create="tileMap = $event" />
   <PlacedMapObjects ref="mapObjects" v-if="tileMap" :tileMap="tileMap as Phaser.Tilemaps.Tilemap" />
   <MapEventTiles ref="eventTiles" v-if="tileMap" :tileMap="tileMap as Phaser.Tilemaps.Tilemap" />
 </template>
@@ -11,25 +11,16 @@ import MapEventTiles from '@/components/gameMaster/mapEditor/mapPartials/MapEven
 import MapTiles from '@/components/gameMaster/mapEditor/mapPartials/MapTiles.vue'
 import PlacedMapObjects from '@/components/gameMaster/mapEditor/mapPartials/PlacedMapObjects.vue'
 import { useMapEditorComposable } from '@/composables/useMapEditorComposable'
-import { onMounted, onUnmounted, shallowRef } from 'vue'
+import { onUnmounted, shallowRef, useTemplateRef} from 'vue'
 
-const mapEditor = useMapEditorComposable()
 const tileMap = shallowRef<Phaser.Tilemaps.Tilemap>()
-
-const selectedMap = ref<MapT>()
-const mapEditorStore = useMapEditorStore()
 const mapEditor = useMapEditorComposable()
 
 const mapTiles = useTemplateRef('mapTiles')
 const mapObjects = useTemplateRef('mapObjects')
 const eventTiles = useTemplateRef('eventTiles')
 
-const scene = useScene()
-
-
-
 function handlePointer(pointer: Phaser.Input.Pointer) {
-  if (!mapTiles.value || !mapObjects.value || !eventTiles.value) return
   // Check if left mouse button is pressed
   if (!pointer.isDown) return
 
@@ -40,26 +31,16 @@ function handlePointer(pointer: Phaser.Input.Pointer) {
   if (!pointer.event.altKey) return
 
   // Check if draw mode is tile
-  switch (mapEditorStore.drawMode) {
+  switch (mapEditor.drawMode.value) {
     case 'tile':
-      mapTiles.value.handlePointer(pointer)
+      mapTiles.value?.handlePointer(pointer)
     // case 'map_object':
     //   mapObjects.value.handlePointer(pointer)
     case 'event tile':
-      eventTiles.value.handlePointer(pointer)
+      eventTiles.value?.handlePointer(pointer)
   }
 }
 
-watch(() => mapEditor.currentMap, async (map) => {
-  if (!map.value) return
-  selectedMap.value = map.value
-})
-
-onMounted(() => {
-  scene.input.on(Phaser.Input.Events.POINTER_MOVE, handlePointer)
-  scene.input.on(Phaser.Input.Events.POINTER_DOWN, handlePointer)
-})
-
 onUnmounted(() => {
   mapEditor.reset()
 })
diff --git a/src/components/gameMaster/mapEditor/mapPartials/MapEventTiles.vue b/src/components/gameMaster/mapEditor/mapPartials/MapEventTiles.vue
index 2eb24f7..d63d711 100644
--- a/src/components/gameMaster/mapEditor/mapPartials/MapEventTiles.vue
+++ b/src/components/gameMaster/mapEditor/mapPartials/MapEventTiles.vue
@@ -6,13 +6,12 @@
 import { MapEventTileType, type MapEventTile } from '@/application/types'
 import { uuidv4 } from '@/application/utilities'
 import { getTile, tileToWorldX, tileToWorldY } from '@/composables/mapComposable'
-import { useMapEditorStore } from '@/stores/mapEditorStore'
 import { Image, useScene } from 'phavuer'
 import { type Map as MapT } from "@/application/types"
 import { useMapEditorComposable } from '@/composables/useMapEditorComposable'
-import { shallowRef, watch } from 'vue'
+import { onMounted, onUnmounted, shallowRef, watch } from 'vue'
 
-const mapEditorStore = useMapEditorStore()
+const scene = useScene()
 const mapEditor = useMapEditorComposable()
 
 defineExpose({handlePointer})
@@ -44,22 +43,22 @@ function pencil(pointer: Phaser.Input.Pointer, map: MapT) {
   if (existingEventTile) return
 
   // If teleport, check if there is a selected map
-  if (mapEditorStore.drawMode === 'teleport' && !mapEditorStore.teleportSettings.toMapId) return
+  if (mapEditor.drawMode.value === 'teleport' && !mapEditor.teleportSettings.value.toMapId) return
 
   const newEventTile = {
     id: uuidv4(),
     mapId: map?.id,
     map: map?.id,
-    type: mapEditorStore.drawMode === 'blocking tile' ? MapEventTileType.BLOCK : MapEventTileType.TELEPORT,
+    type: mapEditor.drawMode.value === 'blocking tile' ? MapEventTileType.BLOCK : MapEventTileType.TELEPORT,
     positionX: tile.x,
     positionY: tile.y,
     teleport:
-      mapEditorStore.drawMode === 'teleport'
+      mapEditor.drawMode.value === 'teleport'
         ? {
-            toMap: mapEditorStore.teleportSettings.toMapId,
-            toPositionX: mapEditorStore.teleportSettings.toPositionX,
-            toPositionY: mapEditorStore.teleportSettings.toPositionY,
-            toRotation: mapEditorStore.teleportSettings.toRotation
+            toMap: mapEditor.teleportSettings.value.toMapId,
+            toPositionX: mapEditor.teleportSettings.value.toPositionX,
+            toPositionY: mapEditor.teleportSettings.value.toPositionY,
+            toRotation: mapEditor.teleportSettings.value.toRotation
           }
         : undefined
   }
@@ -91,12 +90,23 @@ function handlePointer(pointer: Phaser.Input.Pointer) {
   // Check if shift is not pressed, this means we are moving the camera
   if (pointer.event.shiftKey) return
 
-  if (mapEditorStore.drawMode !== 'blocking tile' && mapEditorStore.drawMode !== 'teleport') return
+  if (mapEditor.drawMode.value !== 'blocking tile' && mapEditor.drawMode.value !== 'teleport') return
 
-  switch (mapEditorStore.tool) {
+  switch (mapEditor.tool.value) {
     case 'pencil': pencil(pointer, map)
     case 'eraser': erase(pointer, map)
   }
 }
 
+onMounted(() => {
+  scene.input.on(Phaser.Input.Events.POINTER_MOVE, handlePointer)
+  scene.input.on(Phaser.Input.Events.POINTER_DOWN, handlePointer)
+})
+
+onUnmounted(() => {
+  scene.input.off(Phaser.Input.Events.POINTER_MOVE, handlePointer)
+  scene.input.off(Phaser.Input.Events.POINTER_DOWN, handlePointer)
+})
+
+
 </script>
diff --git a/src/components/gameMaster/mapEditor/mapPartials/MapTiles.vue b/src/components/gameMaster/mapEditor/mapPartials/MapTiles.vue
index 6ac5493..347222a 100644
--- a/src/components/gameMaster/mapEditor/mapPartials/MapTiles.vue
+++ b/src/components/gameMaster/mapEditor/mapPartials/MapTiles.vue
@@ -34,7 +34,9 @@ function createTileMap() {
     format: Phaser.Tilemaps.Formats.ARRAY_2D
   })
 
-  return new Phaser.Tilemaps.Tilemap(scene, mapData)
+  const newTileMap = new Phaser.Tilemaps.Tilemap(scene, mapData)
+  emit('tileMap:create', newTileMap)
+  return newTileMap
 }
 
 async function createTileLayer(currentTileMap: Phaser.Tilemaps.Tilemap) {
@@ -55,81 +57,88 @@ async function createTileLayer(currentTileMap: Phaser.Tilemaps.Tilemap) {
   return layer
 }
 
-function pencil(pointer: Phaser.Input.Pointer, tileMap: Phaser.Tilemaps.Tilemap, tileLayer: Phaser.Tilemaps.TilemapLayer) {
-  var map = mapEditor.currentMap.value
-  if (!map) return
-
-  // Check if there is a tile
-  const tile = tileLayer.getTileAtWorldXY(pointer.worldX, pointer.worldY)
-  if (!tile) return
-
-  // Place tile
-  placeTile(tileMap, tileLayer, tile.x, tile.y, mapEditorStore.selectedTile)
-
-  // Adjust mapEditorStore.map.tiles
-  tileMap.tiles[tile.y][tile.x] = map.tiles[tile.y][tile.x]
-}
-
-function eraser(pointer: Phaser.Input.Pointer, tileMap: Phaser.Tilemaps.Tilemap, tileLayer: Phaser.Tilemaps.TilemapLayer) {
+function pencil(pointer: Phaser.Input.Pointer) {
   let map = mapEditor.currentMap.value
   if (!map) return
 
+  // Check if there is a selected tile
+  if (!mapEditor.selectedTile.value) return
+
+  console.log(tileMap.value, tileLayer.value)
+
+  if (!tileMap.value || !tileLayer.value) return
+
   // Check if there is a tile
-  const tile = getTile(tileLayer, pointer.worldX, pointer.worldY)
+  const tile = getTile(tileLayer.value, pointer.worldX, pointer.worldY)
   if (!tile) return
 
   // Place tile
-  placeTile(tileMap, tileLayer, tile.x, tile.y, 'blank_tile')
+  placeTile(tileMap.value, tileLayer.value, tile.x, tile.y, mapEditor.selectedTile.value)
+
+  // Adjust mapEditorStore.map.tiles
+  map.tiles[tile.y][tile.x] = map.tiles[tile.y][tile.x]
+}
+
+function eraser(pointer: Phaser.Input.Pointer) {
+  let map = mapEditor.currentMap.value
+  if (!map) return
+
+  if (!tileMap.value || !tileLayer.value) return
+
+  // Check if there is a tile
+  const tile = getTile(tileLayer.value, pointer.worldX, pointer.worldY)
+  if (!tile) return
+
+  // Place tile
+  placeTile(tileMap.value, tileLayer.value, tile.x, tile.y, 'blank_tile')
 
   // Adjust mapEditorStore.map.tiles
   map.tiles[tile.y][tile.x] = 'blank_tile'
 }
 
-function paint(pointer: Phaser.Input.Pointer, tileMap: Phaser.Tilemaps.Tilemap, tileLayer: Phaser.Tilemaps.TilemapLayer) {
+function paint(pointer: Phaser.Input.Pointer) {
+  if (!tileMap.value || !tileLayer.value) return
   // Set new tileArray with selected tile
-  setLayerTiles(tileMap, tileLayer, createTileArray(tileMap.width, tileMap.height, mapEditorStore.selectedTile))
+  const tileArray = createTileArray(tileMap.value.width, tileMap.value.height, mapEditor.selectedTile.value)
+  setLayerTiles(tileMap.value, tileLayer.value, tileArray)
 
   // Adjust mapEditorStore.map.tiles
   if (mapEditor.currentMap.value) {
-    mapEditor.currentMap.value.tiles = createTileArray(tileMap.width, tileMap.height, mapEditorStore.selectedTile)
+    mapEditor.currentMap.value.tiles = tileArray
   }
 }
 
 // When alt is pressed, and the pointer is down, select the tile that the pointer is over
-function tilePicker(pointer: Phaser.Input.Pointer, tileLayer: Phaser.Tilemaps.TilemapLayer) {
+function tilePicker(pointer: Phaser.Input.Pointer) {
   let map = mapEditor.currentMap.value
   if (!map) return
 
   // Check if there is a tile
-  const tile = getTile(tileLayer, pointer.worldX, pointer.worldY)
+  const tile = getTile(tileLayer.value!, pointer.worldX, pointer.worldY)
   if (!tile) return
 
   // Select the tile
-  mapEditorStore.setSelectedTile(map.tiles[tile.y][tile.x])
+  mapEditor.setSelectedTile(map.tiles[tile.y][tile.x])
 }
 
 watch(
-  () => mapEditorStore.shouldClearTiles,
+  () => mapEditor.shouldClearTiles,
   (shouldClear) => {
     if (shouldClear && mapEditor.currentMap.value && tileMap.value && tileLayer.value) {
       const blankTiles = createTileArray(tileLayer.value.width, tileLayer.value.height, 'blank_tile')
       setLayerTiles(tileMap.value, tileLayer.value, blankTiles)
       mapEditor.currentMap.value.tiles = blankTiles
-      mapEditorStore.resetClearTilesFlag()
+      mapEditor.resetClearTilesFlag()
     }
   }
 )
 
 function handlePointer(pointer: Phaser.Input.Pointer) {
-  if (!mapEditor.currentMap.value) return
 
   if (!tileMap.value || !tileLayer.value) return
 
   // Check if tool is pencil
-  if (mapEditorStore.drawMode !== 'tile') return
-
-  // Check if there is a selected tile
-  if (!mapEditorStore.selectedTile) return
+  if (mapEditor.drawMode.value !== 'tile') return
 
   // Check if left mouse button is pressed
   if (!pointer.isDown) return
@@ -138,24 +147,26 @@ function handlePointer(pointer: Phaser.Input.Pointer) {
   if (pointer.event.shiftKey) return
 
   // Check if alt is pressed
-  if (!pointer.event.altKey) return
-
+  if (pointer.event.altKey) return
   // Check if draw mode is tile
-  switch (mapEditorStore.tool) {
+  switch (mapEditor.tool.value) {
     case 'pencil':
-      pencil(pointer, tileMap.value, tileLayer.value)
+      pencil(pointer)
+      break
     case 'eraser':
-      eraser(pointer, tileMap.value, tileLayer.value)
+      eraser(pointer)
+      break
     case 'paint':
-      paint(pointer, tileMap.value, tileLayer.value)
+      paint(pointer)
+      break
     case 'tile picker':
-      tilePicker(pointer, tileLayer.value)
+      tilePicker(pointer)
+      break
   }
 }
 
 onMounted(async () => {
-  if (!mapEditor.currentMap.value?.tiles) return
-  console.log(mapEditor.currentMap.value)
+  if (!mapEditor.currentMap.value) return
 
   tileMap.value = createTileMap()
   tileLayer.value = await createTileLayer(tileMap.value)
@@ -174,9 +185,15 @@ onMounted(async () => {
   }
 
   setLayerTiles(tileMap.value, tileLayer.value, blankTiles)
+
+  scene.input.on(Phaser.Input.Events.POINTER_MOVE, handlePointer)
+  scene.input.on(Phaser.Input.Events.POINTER_DOWN, handlePointer)
 })
 
 onUnmounted(() => {
+  scene.input.off(Phaser.Input.Events.POINTER_MOVE, handlePointer)
+  scene.input.off(Phaser.Input.Events.POINTER_DOWN, handlePointer)
+
   if (tileMap.value) {
     tileMap.value.destroyLayer('tiles')
     tileMap.value.removeAllLayers()
diff --git a/src/components/gameMaster/mapEditor/mapPartials/PlacedMapObjects.vue b/src/components/gameMaster/mapEditor/mapPartials/PlacedMapObjects.vue
index fb30685..871d85b 100644
--- a/src/components/gameMaster/mapEditor/mapPartials/PlacedMapObjects.vue
+++ b/src/components/gameMaster/mapEditor/mapPartials/PlacedMapObjects.vue
@@ -1,6 +1,6 @@
 <template>
   <SelectedPlacedMapObjectComponent v-if="selectedPlacedMapObject" :placedMapObject="selectedPlacedMapObject" @move="moveMapObject" @rotate="rotatePlacedMapObject" @delete="deletePlacedMapObject" />
-  <PlacedMapObject v-for="placedMapObject in mapEditor.currentMap.value?.placedMapObjects" :tilemap="tileMap" :placedMapObject :selectedPlacedMapObject :movingPlacedMapObject @pointerup="clickPlacedMapObject(placedMapObject)" />
+  <PlacedMapObject v-for="placedMapObject in mapEditor.currentMap.value?.placedMapObjects" :tileMap="tileMap" :placedMapObject :selectedPlacedMapObject :movingPlacedMapObject @pointerup="clickPlacedMapObject(placedMapObject)" />
 </template>
 
 <script setup lang="ts">
@@ -15,7 +15,6 @@ import { ref, watch } from 'vue'
 import { useMapEditorComposable } from '@/composables/useMapEditorComposable'
 
 const scene = useScene()
-const mapEditorStore = useMapEditorStore()
 const mapEditor = useMapEditorComposable()
 const selectedPlacedMapObject = ref<PlacedMapObjectT | null>(null)
 const movingPlacedMapObject = ref<PlacedMapObjectT | null>(null)
@@ -39,7 +38,7 @@ function pencil(pointer: Phaser.Input.Pointer, tileMapLayer: Phaser.Tilemaps.Til
     id: uuidv4(),
     depth: 0,
     map: map,
-    mapObject: mapEditorStore.selectedMapObject!,
+    mapObject: mapEditor.selectedMapObject.value!,
     isRotated: false,
     positionX: tile.x,
     positionY: tile.y
@@ -72,7 +71,7 @@ function objectPicker(pointer: Phaser.Input.Pointer, tileMapLayer: Phaser.Tilema
   if (!existingPlacedMapObject) return
 
   // Select the object
-  mapEditorStore.setSelectedMapObject(existingPlacedMapObject.mapObject)
+  mapEditor.setSelectedMapObject(existingPlacedMapObject.mapObject)
 }
 
 function moveMapObject(id: string, tileMapLayer: Phaser.Tilemaps.TilemapLayer, map: MapT) {
@@ -120,7 +119,7 @@ function clickPlacedMapObject(placedMapObject: PlacedMapObjectT) {
 
   // If alt is pressed, select the object
   if (scene.input.activePointer.event.altKey) {
-    mapEditorStore.setSelectedMapObject(placedMapObject.mapObject)
+    mapEditor.setSelectedMapObject(placedMapObject.mapObject)
   }
 }
 
@@ -128,7 +127,7 @@ function handlePointer(pointer: Phaser.Input.Pointer, tileMapLayer: Phaser.Tilem
   const map = mapEditor.currentMap.value
   if (!map) return
 
-  if (mapEditorStore.drawMode !== 'map_object') return
+  if (mapEditor.drawMode.value !== 'map_object') return
 
   // Check if left mouse button is pressed
   if (!pointer.isDown) return
@@ -140,9 +139,9 @@ function handlePointer(pointer: Phaser.Input.Pointer, tileMapLayer: Phaser.Tilem
   if (pointer.event.altKey) return
 
   // Check if tool is pencil
-  switch (mapEditorStore.tool) {
+  switch (mapEditor.tool.value) {
     case 'pencil':
-      if (mapEditorStore.selectedMapObject) pencil(pointer, tileMapLayer, map)
+      if (mapEditor.selectedMapObject.value) pencil(pointer, tileMapLayer, map)
     case 'eraser':
       eraser(pointer, tileMapLayer, map)
     case 'object picker':
@@ -176,11 +175,11 @@ watch(
     map.placedMapObjects = [...map.placedMapObjects, ...updatedMapObjects]
 
     // Update mapObject if it's set
-    if (mapEditorStore.selectedMapObject) {
-      const updatedMapObject = map.placedMapObjects.find((obj) => obj.id === mapEditorStore.selectedMapObject?.id)
+    if (mapEditor.selectedMapObject.value) {
+      const updatedMapObject = map.placedMapObjects.find((obj) => obj.id === mapEditor.selectedMapObject.value?.id)
       if (updatedMapObject) {
-        mapEditorStore.setSelectedMapObject({
-          ...mapEditorStore.selectedMapObject,
+        mapEditor.setSelectedMapObject({
+          ...mapEditor.selectedMapObject.value,
           originX: updatedMapObject.positionX,
           originY: updatedMapObject.positionY
         })
diff --git a/src/components/gameMaster/mapEditor/partials/CreateMap.vue b/src/components/gameMaster/mapEditor/partials/CreateMap.vue
index 21fe438..0d775b1 100644
--- a/src/components/gameMaster/mapEditor/partials/CreateMap.vue
+++ b/src/components/gameMaster/mapEditor/partials/CreateMap.vue
@@ -40,12 +40,11 @@ import Modal from '@/components/utilities/Modal.vue'
 import { MapStorage } from '@/storage/storages'
 import { useGameStore } from '@/stores/gameStore'
 import { useMapEditorComposable } from '@/composables/useMapEditorComposable'
-import { ref } from 'vue'
+import { ref, useTemplateRef } from 'vue'
 
 const emit = defineEmits(['create'])
 
 const gameStore = useGameStore()
-const mapEditor = useMapEditorComposable()
 const mapStorage = new MapStorage()
 const modalRef = useTemplateRef('modalRef')
 
diff --git a/src/components/gameMaster/mapEditor/partials/MapSettings.vue b/src/components/gameMaster/mapEditor/partials/MapSettings.vue
index 13fb4ce..a3b7e47 100644
--- a/src/components/gameMaster/mapEditor/partials/MapSettings.vue
+++ b/src/components/gameMaster/mapEditor/partials/MapSettings.vue
@@ -51,7 +51,7 @@ import type { UUID } from '@/application/types'
 import { uuidv4 } from '@/application/utilities'
 import Modal from '@/components/utilities/Modal.vue'
 import { useMapEditorComposable } from '@/composables/useMapEditorComposable'
-import { ref, watch } from 'vue'
+import { ref, useTemplateRef, watch } from 'vue'
 
 const mapEditor = useMapEditorComposable()
 const screen = ref('settings')
diff --git a/src/components/gameMaster/mapEditor/partials/Toolbar.vue b/src/components/gameMaster/mapEditor/partials/Toolbar.vue
index dcad6b5..78baa2d 100644
--- a/src/components/gameMaster/mapEditor/partials/Toolbar.vue
+++ b/src/components/gameMaster/mapEditor/partials/Toolbar.vue
@@ -39,7 +39,7 @@
           <img class="invert w-5 h-5" src="/assets/icons/mapEditor/eraser.svg" alt="Eraser" /> <span class="h-5" :class="{ 'ml-2.5': mapEditor.tool.value !== 'eraser' }">(E)</span>
           <div class="select" v-if="mapEditor.tool.value === 'eraser'">
             <div class="select-trigger group capitalize flex gap-3.5" :class="{ open: selectEraserOpen }">
-              {{ mapEditor.eraserMode.value.replace('_', ' ') }}
+              {{ mapEditor.drawMode.value.replace('_', ' ') }}
               <img class="group-[.open]:rotate-180 invert w-5 h-5 rotate-0 transition ease-in-out duration-200" src="/assets/icons/mapEditor/chevron.svg" />
             </div>
             <div class="flex flex-col absolute bottom-full mb-5 left-1/2 -translate-x-1/2 bg-gray rounded min-w-28 border border-gray-500 border-solid text-left" v-show="selectEraserOpen">
@@ -113,7 +113,7 @@ function setDrawMode(value: string) {
 
 // drawMode
 function setEraserMode(value: string) {
-  mapEditorStore.setTool('eraser')
+  mapEditor.setTool('eraser')
   selectEraserOpen.value = false
 }
 
@@ -130,7 +130,7 @@ function handleClick(tool: string) {
 
 function cycleToolMode(tool: 'pencil' | 'eraser') {
   const modes = ['tile', 'object', 'teleport', 'blocking tile']
-  const currentIndex = modes.indexOf(mapEditorStore.drawMode)
+  const currentIndex = modes.indexOf(mapEditor.drawMode.value)
   const nextIndex = (currentIndex + 1) % modes.length
   const nextMode = modes[nextIndex]
 
diff --git a/src/components/screens/MapEditor.vue b/src/components/screens/MapEditor.vue
index 222292f..ce8199c 100644
--- a/src/components/screens/MapEditor.vue
+++ b/src/components/screens/MapEditor.vue
@@ -4,7 +4,7 @@
       <Scene name="main" @preload="preloadScene">
         <div v-if="!isLoaded" class="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 text-white text-3xl font-ui">Loading...</div>
         <div v-else>
-          <Map :key="currentMap?.id" />
+          <Map :key="mapEditor.currentMap.value?.id" />
           <Toolbar ref="toolbar" @save="save" @clear="clear" @open-maps="mapModal?.open()" @open-settings="mapSettingsModal?.open()"
                    @close-editor="$emit('close-editor')"
                    @open-tile-list="tileModal?.open()"
@@ -36,13 +36,11 @@ import { useMapEditorComposable } from '@/composables/useMapEditorComposable'
 import { MapStorage } from '@/storage/storages'
 import { useGameStore } from '@/stores/gameStore'
 import { Game, Scene } from 'phavuer'
-import { provide, ref, useTemplateRef, watch } from 'vue'
+import { ref, useTemplateRef, watch } from 'vue'
 
 const mapStorage = new MapStorage()
 const mapEditor = useMapEditorComposable()
 const gameStore = useGameStore()
-const mapEditorStore = useMapEditorStore()
-const currentMap = ref<MapT | null>(null)
 
 const toolbar = useTemplateRef("toolbar")
 const mapModal = useTemplateRef("mapModal")
@@ -88,18 +86,19 @@ const preloadScene = async (scene: Phaser.Scene) => {
 }
 
 function save() {
-  if (!currentMap.value) return
+  const currentMap = mapEditor.currentMap.value
+  if (!currentMap) return
 
   const data = {
-    mapId: currentMap.value.id,
-    name: currentMap.value.name,
-    width: currentMap.value.width,
-    height: currentMap.value.height,
-    tiles: currentMap.value.tiles,
-    pvp: currentMap.value.pvp,
-    mapEffects: currentMap.value.mapEffects?.map(({ id, effect, strength }) => ({ id, effect, strength })) ?? [],
-    mapEventTiles: currentMap.value.mapEventTiles?.map(({ id, type, positionX, positionY, teleport }) => ({ id, type, positionX, positionY, teleport })) ?? [],
-    placedMapObjects: currentMap.value.placedMapObjects?.map(({ id, mapObject, depth, isRotated, positionX, positionY }) => ({ id, mapObject, depth, isRotated, positionX, positionY })) ?? []
+    mapId: currentMap.id,
+    name: currentMap.name,
+    width: currentMap.width,
+    height: currentMap.height,
+    tiles: currentMap.tiles,
+    pvp: currentMap.pvp,
+    mapEffects: currentMap.mapEffects?.map(({ id, effect, strength }) => ({ id, effect, strength })) ?? [],
+    mapEventTiles: currentMap.mapEventTiles?.map(({ id, type, positionX, positionY, teleport }) => ({ id, type, positionX, positionY, teleport })) ?? [],
+    placedMapObjects: currentMap.placedMapObjects?.map(({ id, mapObject, depth, isRotated, positionX, positionY }) => ({ id, mapObject, depth, isRotated, positionX, positionY })) ?? []
   }
 
   gameStore.connection?.emit('gm:map:update', data, (response: MapT) => {
@@ -107,13 +106,10 @@ function save() {
   })
 }
 
-watch(() => mapEditor.currentMap, (value) => { currentMap.value = value.value })
-
 function clear() {
-  if (!currentMap.value) return
+  if (!mapEditor.currentMap.value) return
 
   // Clear placed objects, event tiles and tiles
   mapEditor.clearMap()
-  mapEditor.triggerClearTiles()
 }
 </script>
diff --git a/src/composables/pointerHandlers/useMapEditorPointerHandlers.ts b/src/composables/pointerHandlers/useMapEditorPointerHandlers.ts
index 77f1522..79a5c6c 100644
--- a/src/composables/pointerHandlers/useMapEditorPointerHandlers.ts
+++ b/src/composables/pointerHandlers/useMapEditorPointerHandlers.ts
@@ -28,7 +28,7 @@ export function useMapEditorPointerHandlers(scene: Phaser.Scene, layer: Phaser.T
   }
 
   function handlePointerDown(pointer: Phaser.Input.Pointer) {
-    pointerStartPosition.value = pointer.position
+    pointerStartPosition.value = { x: pointer.x, y: pointer.y }
     if (isMoveTool.value || pointer.event.shiftKey) {
       gameStore.setPlayerDraggingCamera(true)
     }
@@ -37,9 +37,11 @@ export function useMapEditorPointerHandlers(scene: Phaser.Scene, layer: Phaser.T
   function dragMap(pointer: Phaser.Input.Pointer) {
     if (!gameStore.game.isPlayerDraggingCamera) return
 
+    const distance = Phaser.Math.Distance.Between(pointerStartPosition.value.x, pointerStartPosition.value.y, pointer.x, pointer.y)
+
     // If the distance is less than the drag threshold, return
     // We do this to prevent the camera from scrolling too quickly
-    const distance = Phaser.Math.Distance.Between(pointerStartPosition.value.x, pointerStartPosition.value.y, pointer.x, pointer.y)
+
     if (distance <= dragThreshold) return
 
     camera.setScroll(camera.scrollX - (pointer.x - pointer.prevPosition.x) / camera.zoom, camera.scrollY - (pointer.y - pointer.prevPosition.y) / camera.zoom)
diff --git a/src/composables/useMapEditorComposable.ts b/src/composables/useMapEditorComposable.ts
index f3b3d6b..bd1328e 100644
--- a/src/composables/useMapEditorComposable.ts
+++ b/src/composables/useMapEditorComposable.ts
@@ -12,14 +12,8 @@ const currentMap = ref<Map | null>(null)
 const active = ref(false)
 const tool = ref('move')
 const drawMode = ref('tile')
-const eraserMode = ref('tile')
 const selectedTile = ref('')
 const selectedMapObject = ref<MapObject | null>(null)
-const isTileListModalShown = ref(false)
-const isMapObjectListModalShown = ref(false)
-const isMapListModalShown = ref(false)
-const isCreateMapModalShown = ref(false)
-const isSettingsModalShown = ref(false)
 const shouldClearTiles = ref(false)
 const teleportSettings = ref<TeleportSettings>({
   toMapId: '',
@@ -59,10 +53,6 @@ export function useMapEditorComposable() {
     drawMode.value = mode
   }
 
-  const setEraserMode = (mode: string) => {
-    eraserMode.value = mode
-  }
-
   const setSelectedTile = (tile: string) => {
     selectedTile.value = tile
   }
@@ -71,19 +61,6 @@ export function useMapEditorComposable() {
     selectedMapObject.value = object
   }
 
-  const toggleSettingsModal = () => {
-    isSettingsModalShown.value = !isSettingsModalShown.value
-  }
-
-  const toggleMapListModal = () => {
-    isMapListModalShown.value = !isMapListModalShown.value
-    isCreateMapModalShown.value = false
-  }
-
-  const toggleCreateMapModal = () => {
-    isCreateMapModalShown.value = !isCreateMapModalShown.value
-  }
-
   const setTeleportSettings = (settings: TeleportSettings) => {
     teleportSettings.value = settings
   }
@@ -101,11 +78,6 @@ export function useMapEditorComposable() {
     drawMode.value = 'tile'
     selectedTile.value = ''
     selectedMapObject.value = null
-    isTileListModalShown.value = false
-    isMapObjectListModalShown.value = false
-    isSettingsModalShown.value = false
-    isMapListModalShown.value = false
-    isCreateMapModalShown.value = false
     shouldClearTiles.value = false
   }
 
@@ -115,14 +87,8 @@ export function useMapEditorComposable() {
     active,
     tool,
     drawMode,
-    eraserMode,
     selectedTile,
     selectedMapObject,
-    isTileListModalShown,
-    isMapObjectListModalShown,
-    isMapListModalShown,
-    isCreateMapModalShown,
-    isSettingsModalShown,
     shouldClearTiles,
     teleportSettings,
 
@@ -133,12 +99,8 @@ export function useMapEditorComposable() {
     toggleActive,
     setTool,
     setDrawMode,
-    setEraserMode,
     setSelectedTile,
     setSelectedMapObject,
-    toggleSettingsModal,
-    toggleMapListModal,
-    toggleCreateMapModal,
     setTeleportSettings,
     triggerClearTiles,
     resetClearTilesFlag,