From d6a64cadb8eb9c90505a3f5629696c60736ea4a8 Mon Sep 17 00:00:00 2001
From: Alexander Brown <448862+DrJKL@users.noreply.github.com>
Date: Fri, 16 Jan 2026 14:12:27 -0800
Subject: [PATCH] feat(assetsStore): add updateAssetMetadata with optimistic
cache update
---
.../assets/components/AssetBrowserModal.vue | 2 +-
.../components/modelInfo/ModelInfoPanel.vue | 24 +++++++-
src/stores/assetsStore.ts | 57 +++++++++++++++++--
3 files changed, 77 insertions(+), 6 deletions(-)
diff --git a/src/platform/assets/components/AssetBrowserModal.vue b/src/platform/assets/components/AssetBrowserModal.vue
index 7f417f46e7..01e03782ba 100644
--- a/src/platform/assets/components/AssetBrowserModal.vue
+++ b/src/platform/assets/components/AssetBrowserModal.vue
@@ -68,7 +68,7 @@
-
+
diff --git a/src/platform/assets/components/modelInfo/ModelInfoPanel.vue b/src/platform/assets/components/modelInfo/ModelInfoPanel.vue
index a073f1a6ee..2800394c5f 100644
--- a/src/platform/assets/components/modelInfo/ModelInfoPanel.vue
+++ b/src/platform/assets/components/modelInfo/ModelInfoPanel.vue
@@ -130,6 +130,7 @@
diff --git a/src/stores/assetsStore.ts b/src/stores/assetsStore.ts
index a387aea7d3..369b842667 100644
--- a/src/stores/assetsStore.ts
+++ b/src/stores/assetsStore.ts
@@ -339,12 +339,58 @@ export const useAssetsStore = defineStore('assets', () => {
return updateModelsForKey(key, () => assetService.getAssetsByTag(tag))
}
+ /**
+ * Optimistically update an asset in the cache
+ * @param assetId The asset ID to update
+ * @param updates Partial asset data to merge
+ * @param cacheKey Optional cache key to target (nodeType or 'tag:xxx')
+ */
+ function updateAssetInCache(
+ assetId: string,
+ updates: Partial,
+ cacheKey?: string
+ ) {
+ const keysToCheck = cacheKey
+ ? [cacheKey]
+ : Array.from(modelAssetsByNodeType.keys())
+
+ for (const key of keysToCheck) {
+ const assets = modelAssetsByNodeType.get(key)
+ if (!assets) continue
+
+ const index = assets.findIndex((a) => a.id === assetId)
+ if (index !== -1) {
+ const updatedAsset = { ...assets[index], ...updates }
+ const newAssets = [...assets]
+ newAssets[index] = updatedAsset
+ modelAssetsByNodeType.set(key, newAssets)
+ if (cacheKey) return
+ }
+ }
+ }
+
+ /**
+ * Update asset metadata with optimistic cache update
+ * @param assetId The asset ID to update
+ * @param userMetadata The user_metadata to save
+ * @param cacheKey Optional cache key to target for optimistic update
+ */
+ async function updateAssetMetadata(
+ assetId: string,
+ userMetadata: Record,
+ cacheKey?: string
+ ) {
+ updateAssetInCache(assetId, { user_metadata: userMetadata }, cacheKey)
+ await assetService.updateAsset(assetId, { user_metadata: userMetadata })
+ }
+
return {
modelAssetsByNodeType,
modelLoadingByNodeType,
modelErrorByNodeType,
updateModelsForNodeType,
- updateModelsForTag
+ updateModelsForTag,
+ updateAssetMetadata
}
}
@@ -353,7 +399,8 @@ export const useAssetsStore = defineStore('assets', () => {
modelLoadingByNodeType: shallowReactive(new Map()),
modelErrorByNodeType: shallowReactive(new Map()),
updateModelsForNodeType: async () => [],
- updateModelsForTag: async () => []
+ updateModelsForTag: async () => [],
+ updateAssetMetadata: async () => {}
}
}
@@ -362,7 +409,8 @@ export const useAssetsStore = defineStore('assets', () => {
modelLoadingByNodeType,
modelErrorByNodeType,
updateModelsForNodeType,
- updateModelsForTag
+ updateModelsForTag,
+ updateAssetMetadata
} = getModelState()
// Watch for completed downloads and refresh model caches
@@ -427,6 +475,7 @@ export const useAssetsStore = defineStore('assets', () => {
modelLoadingByNodeType,
modelErrorByNodeType,
updateModelsForNodeType,
- updateModelsForTag
+ updateModelsForTag,
+ updateAssetMetadata
}
})