From 2d7d598c942ee15ef469e0e3323cf595acc71d27 Mon Sep 17 00:00:00 2001
From: Dennis Postma <dennis@directonline.io>
Date: Tue, 18 Feb 2025 16:37:21 +0100
Subject: [PATCH] #366 : Add storage logic to asset manager

---
 .../characterHair/CharacterHairDetails.vue    | 18 ++++++-------
 .../characterType/CharacterTypeDetails.vue    | 18 ++++++-------
 .../partials/mapObject/MapObjectDetails.vue   | 22 +++++++---------
 .../partials/sprite/SpriteDetails.vue         | 26 +++++++++----------
 .../partials/tile/TileDetails.vue             | 14 +++++-----
 src/components/screens/MapEditor.vue          |  4 +--
 6 files changed, 50 insertions(+), 52 deletions(-)

diff --git a/src/components/gameMaster/assetManager/partials/characterHair/CharacterHairDetails.vue b/src/components/gameMaster/assetManager/partials/characterHair/CharacterHairDetails.vue
index 5f959d0..f277d4d 100644
--- a/src/components/gameMaster/assetManager/partials/characterHair/CharacterHairDetails.vue
+++ b/src/components/gameMaster/assetManager/partials/characterHair/CharacterHairDetails.vue
@@ -64,21 +64,21 @@ if (selectedCharacterHair.value) {
   characterSpriteId.value = selectedCharacterHair.value.sprite?.id
 }
 
-function removeCharacterHair() {
+async function removeCharacterHair() {
   if (!selectedCharacterHair.value) return
 
-  socketManager.emit(SocketEvent.GM_CHARACTERHAIR_REMOVE, { id: selectedCharacterHair.value.id }, (response: boolean) => {
+  socketManager.emit(SocketEvent.GM_CHARACTERHAIR_REMOVE, { id: selectedCharacterHair.value.id }, async (response: boolean) => {
     if (!response) {
       console.error('Failed to remove character hair')
       return
     }
 
-    downloadCache('character_hair', new CharacterHairStorage())
-    refreshCharacterHairList()
+    await downloadCache('character_hair', new CharacterHairStorage())
+    await refreshCharacterHairList()
   })
 }
 
-function refreshCharacterHairList(unsetSelectedCharacterHair = true) {
+async function refreshCharacterHairList(unsetSelectedCharacterHair = true) {
   socketManager.emit(SocketEvent.GM_CHARACTERHAIR_LIST, {}, (response: CharacterHair[]) => {
     assetManagerStore.setCharacterHairList(response)
 
@@ -88,7 +88,7 @@ function refreshCharacterHairList(unsetSelectedCharacterHair = true) {
   })
 }
 
-function saveCharacterHair() {
+async function saveCharacterHair() {
   const characterHairData = {
     id: selectedCharacterHair.value!.id,
     name: characterName.value,
@@ -97,14 +97,14 @@ function saveCharacterHair() {
     spriteId: characterSpriteId.value
   }
 
-  socketManager.emit(SocketEvent.GM_CHARACTERHAIR_UPDATE, characterHairData, (response: boolean) => {
+  socketManager.emit(SocketEvent.GM_CHARACTERHAIR_UPDATE, characterHairData, async (response: boolean) => {
     if (!response) {
       console.error('Failed to save character type')
       return
     }
 
-    downloadCache('character_hair', new CharacterHairStorage())
-    refreshCharacterHairList(false)
+    await downloadCache('character_hair', new CharacterHairStorage())
+    await refreshCharacterHairList(false)
   })
 }
 
diff --git a/src/components/gameMaster/assetManager/partials/characterType/CharacterTypeDetails.vue b/src/components/gameMaster/assetManager/partials/characterType/CharacterTypeDetails.vue
index 1948954..6907e42 100644
--- a/src/components/gameMaster/assetManager/partials/characterType/CharacterTypeDetails.vue
+++ b/src/components/gameMaster/assetManager/partials/characterType/CharacterTypeDetails.vue
@@ -73,21 +73,21 @@ if (selectedCharacterType.value) {
   characterSpriteId.value = selectedCharacterType.value.sprite?.id
 }
 
-function removeCharacterType() {
+async function removeCharacterType() {
   if (!selectedCharacterType.value) return
 
-  socketManager.emit(SocketEvent.GM_CHARACTERTYPE_REMOVE, { id: selectedCharacterType.value.id }, (response: boolean) => {
+  socketManager.emit(SocketEvent.GM_CHARACTERTYPE_REMOVE, { id: selectedCharacterType.value.id }, async (response: boolean) => {
     if (!response) {
       console.error('Failed to remove character type')
       return
     }
 
-    downloadCache('character_types', new CharacterTypeStorage())
-    refreshCharacterTypeList()
+    await downloadCache('character_types', new CharacterTypeStorage())
+    await refreshCharacterTypeList()
   })
 }
 
-function refreshCharacterTypeList(unsetSelectedCharacterType = true) {
+async function refreshCharacterTypeList(unsetSelectedCharacterType = true) {
   socketManager.emit(SocketEvent.GM_CHARACTERTYPE_LIST, {}, (response: CharacterType[]) => {
     assetManagerStore.setCharacterTypeList(response)
 
@@ -97,7 +97,7 @@ function refreshCharacterTypeList(unsetSelectedCharacterType = true) {
   })
 }
 
-function saveCharacterType() {
+async function saveCharacterType() {
   const characterTypeData = {
     id: selectedCharacterType.value!.id,
     name: characterName.value,
@@ -107,14 +107,14 @@ function saveCharacterType() {
     spriteId: characterSpriteId.value
   }
 
-  socketManager.emit(SocketEvent.GM_CHARACTERTYPE_UPDATE, characterTypeData, (response: boolean) => {
+  socketManager.emit(SocketEvent.GM_CHARACTERTYPE_UPDATE, characterTypeData, async (response: boolean) => {
     if (!response) {
       console.error('Failed to save character type')
       return
     }
 
-    downloadCache('character_types', new CharacterTypeStorage())
-    refreshCharacterTypeList(false)
+    await downloadCache('character_types', new CharacterTypeStorage())
+    await refreshCharacterTypeList(false)
   })
 }
 
diff --git a/src/components/gameMaster/assetManager/partials/mapObject/MapObjectDetails.vue b/src/components/gameMaster/assetManager/partials/mapObject/MapObjectDetails.vue
index 4dab46d..795f77b 100644
--- a/src/components/gameMaster/assetManager/partials/mapObject/MapObjectDetails.vue
+++ b/src/components/gameMaster/assetManager/partials/mapObject/MapObjectDetails.vue
@@ -62,7 +62,7 @@ import type { MapObject } from '@/application/types'
 import { downloadCache } from '@/application/utilities'
 import ChipsInput from '@/components/forms/ChipsInput.vue'
 import { socketManager } from '@/managers/SocketManager'
-import { CharacterTypeStorage, MapObjectStorage } from '@/storage/storages'
+import { MapObjectStorage } from '@/storage/storages'
 import { useAssetManagerStore } from '@/stores/assetManagerStore'
 import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'
 
@@ -81,7 +81,6 @@ const mapObjectFrameHeight = ref(0)
 const imageRef = ref<HTMLImageElement | null>(null)
 const isDragging = ref(false)
 const draggedPointIndex = ref(-1)
-const mapObjectStorage = new MapObjectStorage()
 
 if (!selectedMapObject.value) {
   console.error('No map mapObject selected')
@@ -98,21 +97,20 @@ if (selectedMapObject.value) {
   mapObjectFrameHeight.value = selectedMapObject.value.frameHeight
 }
 
-function removeObject() {
+async function removeObject() {
   if (!selectedMapObject.value) return
-
-  socketManager.emit(SocketEvent.GM_MAPOBJECT_REMOVE, { mapObject: selectedMapObject.value.id }, (response: boolean) => {
+  socketManager.emit(SocketEvent.GM_MAPOBJECT_REMOVE, { mapObjectId: selectedMapObject.value.id }, async (response: boolean) => {
     if (!response) {
       console.error('Failed to remove mapObject')
       return
     }
 
-    downloadCache('map_object', new MapObjectStorage())
-    refreshObjectList()
+    await downloadCache('map_objects', new MapObjectStorage())
+    await refreshObjectList()
   })
 }
 
-function refreshObjectList(unsetSelectedMapObject = true) {
+async function refreshObjectList(unsetSelectedMapObject = true) {
   socketManager.emit(SocketEvent.GM_MAPOBJECT_LIST, {}, (response: MapObject[]) => {
     assetManagerStore.setMapObjectList(response)
 
@@ -122,7 +120,7 @@ function refreshObjectList(unsetSelectedMapObject = true) {
   })
 }
 
-function saveObject() {
+async function saveObject() {
   if (!selectedMapObject.value) {
     console.error('No mapObject selected')
     return
@@ -141,14 +139,14 @@ function saveObject() {
       frameWidth: mapObjectFrameWidth.value,
       frameHeight: mapObjectFrameHeight.value
     },
-    (response: boolean) => {
+    async (response: boolean) => {
       if (!response) {
         console.error('Failed to save mapObject')
         return
       }
 
-      downloadCache('map_object', new MapObjectStorage())
-      refreshObjectList(false)
+      await downloadCache('map_objects', new MapObjectStorage())
+      await refreshObjectList(false)
     }
   )
 }
diff --git a/src/components/gameMaster/assetManager/partials/sprite/SpriteDetails.vue b/src/components/gameMaster/assetManager/partials/sprite/SpriteDetails.vue
index 386a9ee..9351fa6 100644
--- a/src/components/gameMaster/assetManager/partials/sprite/SpriteDetails.vue
+++ b/src/components/gameMaster/assetManager/partials/sprite/SpriteDetails.vue
@@ -97,31 +97,31 @@ if (selectedSprite.value) {
   spriteActions.value = sortSpriteActions(selectedSprite.value.spriteActions)
 }
 
-function deleteSprite() {
-  socketManager.emit(SocketEvent.GM_SPRITE_DELETE, { id: selectedSprite.value?.id }, (response: boolean) => {
+async function deleteSprite() {
+  socketManager.emit(SocketEvent.GM_SPRITE_DELETE, { id: selectedSprite.value?.id }, async (response: boolean) => {
     if (!response) {
       console.error('Failed to delete sprite')
       return
     }
 
-    downloadCache('sprite', new SpriteStorage())
-    refreshSpriteList()
+    await downloadCache('sprite', new SpriteStorage())
+    await refreshSpriteList()
   })
 }
 
-function copySprite() {
-  socketManager.emit(SocketEvent.GM_SPRITE_COPY, { id: selectedSprite.value?.id }, (response: boolean) => {
+async function copySprite() {
+  socketManager.emit(SocketEvent.GM_SPRITE_COPY, { id: selectedSprite.value?.id }, async (response: boolean) => {
     if (!response) {
       console.error('Failed to copy sprite')
       return
     }
 
-    downloadCache('sprite', new SpriteStorage())
-    refreshSpriteList(false)
+    await downloadCache('sprite', new SpriteStorage())
+    await refreshSpriteList(false)
   })
 }
 
-function refreshSpriteList(unsetSelectedSprite = true) {
+async function refreshSpriteList(unsetSelectedSprite = true) {
   socketManager.emit(SocketEvent.GM_SPRITE_LIST, {}, (response: Sprite[]) => {
     assetManagerStore.setSpriteList(response)
 
@@ -131,7 +131,7 @@ function refreshSpriteList(unsetSelectedSprite = true) {
   })
 }
 
-function saveSprite() {
+async function saveSprite() {
   if (!selectedSprite.value) {
     console.error('No sprite selected')
     return
@@ -154,14 +154,14 @@ function saveSprite() {
       }) ?? []
   }
 
-  socketManager.emit(SocketEvent.GM_SPRITE_UPDATE, updatedSprite, (response: boolean) => {
+  socketManager.emit(SocketEvent.GM_SPRITE_UPDATE, updatedSprite, async (response: boolean) => {
     if (!response) {
       console.error('Failed to save sprite')
       return
     }
 
-    downloadCache('sprite', new SpriteStorage())
-    refreshSpriteList(false)
+    await downloadCache('sprite', new SpriteStorage())
+    await refreshSpriteList(false)
   })
 }
 
diff --git a/src/components/gameMaster/assetManager/partials/tile/TileDetails.vue b/src/components/gameMaster/assetManager/partials/tile/TileDetails.vue
index 585313d..6918d77 100644
--- a/src/components/gameMaster/assetManager/partials/tile/TileDetails.vue
+++ b/src/components/gameMaster/assetManager/partials/tile/TileDetails.vue
@@ -62,12 +62,12 @@ async function deleteTile() {
       return
     }
 
-    downloadCache('tile', new TileStorage())
-    refreshTileList()
+    await downloadCache('tiles', new TileStorage())
+    await refreshTileList()
   })
 }
 
-function refreshTileList(unsetSelectedTile = true) {
+async function refreshTileList(unsetSelectedTile = true) {
   socketManager.emit(SocketEvent.GM_TILE_LIST, {}, (response: Tile[]) => {
     assetManagerStore.setTileList(response)
 
@@ -77,7 +77,7 @@ function refreshTileList(unsetSelectedTile = true) {
   })
 }
 
-function saveTile() {
+async function saveTile() {
   if (!selectedTile.value) {
     console.error('No tile selected')
     return
@@ -90,14 +90,14 @@ function saveTile() {
       name: tileName.value,
       tags: tileTags.value
     },
-    (response: boolean) => {
+    async (response: boolean) => {
       if (!response) {
         console.error('Failed to save tile')
         return
       }
 
-      downloadCache('tile', new TileStorage())
-      refreshTileList(false)
+      await downloadCache('tiles', new TileStorage())
+      await refreshTileList(false)
     }
   )
 }
diff --git a/src/components/screens/MapEditor.vue b/src/components/screens/MapEditor.vue
index 7a4d36f..0b5e0f8 100644
--- a/src/components/screens/MapEditor.vue
+++ b/src/components/screens/MapEditor.vue
@@ -23,6 +23,7 @@ import { SocketEvent } from '@/application/enums'
 import { socketManager } from '@/managers/SocketManager'
 import 'phaser'
 import type { Map as MapT } from '@/application/types'
+import { downloadCache } from '@/application/utilities'
 import Map from '@/components/gameMaster/mapEditor/Map.vue'
 import MapList from '@/components/gameMaster/mapEditor/partials/MapList.vue'
 import MapObjectList from '@/components/gameMaster/mapEditor/partials/MapObjectList.vue'
@@ -32,10 +33,9 @@ import TileList from '@/components/gameMaster/mapEditor/partials/TileList.vue'
 import Toolbar from '@/components/gameMaster/mapEditor/partials/Toolbar.vue'
 import { useMapEditorComposable } from '@/composables/useMapEditorComposable'
 import { loadAllTileTextures } from '@/services/mapService'
-import {CharacterHairStorage, MapStorage} from '@/storage/storages'
+import { CharacterHairStorage, MapStorage } from '@/storage/storages'
 import { Game, Scene } from 'phavuer'
 import { ref, toRaw, useTemplateRef } from 'vue'
-import {downloadCache} from "@/application/utilities";
 
 const mapStorage = new MapStorage()
 const mapEditor = useMapEditorComposable()