Skip to content

Commit 705947d

Browse files
authored
refactor: use media assets in fix: dropdown widget fetching output files (#6809)
┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-6809-refactor-use-media-assets-in-fix-dropdown-widget-fetching-output-files-2b26d73d365081139a7af77a79693010) by [Unito](https://www.unito.io)
1 parent d2d5505 commit 705947d

File tree

3 files changed

+36
-97
lines changed

3 files changed

+36
-97
lines changed

src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.vue

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
<script setup lang="ts">
22
import { capitalize } from 'es-toolkit'
3-
import { computed, onMounted, provide, ref, toRef, watch } from 'vue'
3+
import { computed, provide, ref, toRef, watch } from 'vue'
44
55
import { useWidgetValue } from '@/composables/graph/useWidgetValue'
66
import { useTransformCompatOverlayProps } from '@/composables/useTransformCompatOverlayProps'
77
import { t } from '@/i18n'
8+
import { useMediaAssets } from '@/platform/assets/composables/media/useMediaAssets'
89
import { useToastStore } from '@/platform/updates/common/toastStore'
910
import FormDropdown from '@/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.vue'
1011
import { AssetKindKey } from '@/renderer/extensions/vueNodes/widgets/components/form/dropdown/types'
@@ -19,9 +20,9 @@ import { useAssetWidgetData } from '@/renderer/extensions/vueNodes/widgets/compo
1920
import type { ResultItemType } from '@/schemas/apiSchema'
2021
import { api } from '@/scripts/api'
2122
import { useAssetsStore } from '@/stores/assetsStore'
22-
import { useOutputsStore } from '@/stores/outputsStore'
2323
import type { SimplifiedWidget } from '@/types/simplifiedWidget'
2424
import type { AssetKind } from '@/types/widgetTypes'
25+
import { getMediaTypeFromFilename } from '@/utils/formatUtil'
2526
import {
2627
PANEL_EXCLUDED_PROPS,
2728
filterWidgetProps
@@ -56,7 +57,7 @@ const { localValue, onChange } = useWidgetValue({
5657
5758
const toastStore = useToastStore()
5859
59-
const outputsStore = useOutputsStore()
60+
const outputMediaAssets = useMediaAssets('output')
6061
6162
const transformCompatProps = useTransformCompatOverlayProps()
6263
@@ -120,34 +121,42 @@ const inputItems = computed<DropdownItem[]>(() => {
120121
}))
121122
})
122123
const outputItems = computed<DropdownItem[]>(() => {
123-
if (!['image', 'video'].includes(props.assetKind ?? '')) return []
124-
125-
const outputFiles = ((): string[] => {
126-
switch (props.assetKind) {
127-
case 'image':
128-
return outputsStore.outputImages
129-
case 'video':
130-
return outputsStore.outputVideos
131-
case 'audio':
132-
return outputsStore.outputAudios
133-
default:
134-
return []
135-
}
136-
})()
124+
if (!['image', 'video', 'audio'].includes(props.assetKind ?? '')) return []
125+
126+
// Filter assets by media type using getMediaTypeFromFilename
127+
const outputFiles = outputMediaAssets.media.value.filter((asset) => {
128+
const mediaType = getMediaTypeFromFilename(asset.name)
129+
return toAssertType(mediaType) === props.assetKind
130+
})
137131
138-
return outputFiles.map((filename, index) => {
132+
return outputFiles.map((asset, index) => {
139133
// Add [output] annotation so the preview component knows the type
140-
const annotatedPath = `${filename} [output]`
134+
const annotatedPath = `${asset.name} [output]`
141135
return {
142136
id: `output-${index}`,
143-
mediaSrc: getMediaUrl(filename, 'output'),
137+
mediaSrc: asset.preview_url || getMediaUrl(asset.name, 'output'),
144138
name: annotatedPath,
145139
label: getDisplayLabel(annotatedPath),
146140
metadata: ''
147141
}
148142
})
149143
})
150144
145+
function toAssertType(
146+
mediaType: ReturnType<typeof getMediaTypeFromFilename>
147+
): AssetKind {
148+
switch (mediaType) {
149+
case 'image':
150+
case 'video':
151+
case 'audio':
152+
return mediaType
153+
case '3D':
154+
return 'model'
155+
default:
156+
return 'unknown'
157+
}
158+
}
159+
151160
const allItems = computed<DropdownItem[]>(() => {
152161
if (props.isAssetMode && assetData) {
153162
return assetData.dropdownItems.value
@@ -336,10 +345,11 @@ function getMediaUrl(
336345
return `/api/view?filename=${encodeURIComponent(filename)}&type=${type}`
337346
}
338347
339-
// Fetch output files on component mount
340-
onMounted(() => {
341-
outputsStore.fetchOutputFiles()
342-
})
348+
function handleIsOpenUpdate(isOpen: boolean) {
349+
if (isOpen && !outputMediaAssets.loading) {
350+
outputMediaAssets.refresh()
351+
}
352+
}
343353
</script>
344354

345355
<template>
@@ -358,6 +368,7 @@ onMounted(() => {
358368
class="w-full"
359369
@update:selected="updateSelectedItems"
360370
@update:files="handleFilesUpdate"
371+
@update:is-open="handleIsOpenUpdate"
361372
/>
362373
</WidgetLayoutField>
363374
</template>

src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ const props = withDefaults(defineProps<Props>(), {
5555
searcher: defaultSearcher
5656
})
5757
58+
const isOpen = defineModel<boolean>('isOpen', { default: false })
5859
const selected = defineModel<Set<SelectedKey>>('selected', {
5960
default: new Set()
6061
})
@@ -75,7 +76,6 @@ const isQuerying = ref(false)
7576
const toastStore = useToastStore()
7677
const popoverRef = ref<InstanceType<typeof Popover>>()
7778
const triggerRef = useTemplateRef('triggerRef')
78-
const isOpen = ref(false)
7979
8080
const maxSelectable = computed(() => {
8181
if (props.multiple === true) return Infinity

src/stores/outputsStore.ts

Lines changed: 0 additions & 72 deletions
This file was deleted.

0 commit comments

Comments
 (0)