11<script setup lang="ts">
22import { capitalize } from ' es-toolkit'
3- import { computed , onMounted , provide , ref , toRef , watch } from ' vue'
3+ import { computed , provide , ref , toRef , watch } from ' vue'
44
55import { useWidgetValue } from ' @/composables/graph/useWidgetValue'
66import { useTransformCompatOverlayProps } from ' @/composables/useTransformCompatOverlayProps'
77import { t } from ' @/i18n'
8+ import { useMediaAssets } from ' @/platform/assets/composables/media/useMediaAssets'
89import { useToastStore } from ' @/platform/updates/common/toastStore'
910import FormDropdown from ' @/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.vue'
1011import { AssetKindKey } from ' @/renderer/extensions/vueNodes/widgets/components/form/dropdown/types'
@@ -19,9 +20,9 @@ import { useAssetWidgetData } from '@/renderer/extensions/vueNodes/widgets/compo
1920import type { ResultItemType } from ' @/schemas/apiSchema'
2021import { api } from ' @/scripts/api'
2122import { useAssetsStore } from ' @/stores/assetsStore'
22- import { useOutputsStore } from ' @/stores/outputsStore'
2323import type { SimplifiedWidget } from ' @/types/simplifiedWidget'
2424import type { AssetKind } from ' @/types/widgetTypes'
25+ import { getMediaTypeFromFilename } from ' @/utils/formatUtil'
2526import {
2627 PANEL_EXCLUDED_PROPS ,
2728 filterWidgetProps
@@ -56,7 +57,7 @@ const { localValue, onChange } = useWidgetValue({
5657
5758const toastStore = useToastStore ()
5859
59- const outputsStore = useOutputsStore ( )
60+ const outputMediaAssets = useMediaAssets ( ' output ' )
6061
6162const transformCompatProps = useTransformCompatOverlayProps ()
6263
@@ -120,34 +121,42 @@ const inputItems = computed<DropdownItem[]>(() => {
120121 }))
121122})
122123const 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+
151160const 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 >
0 commit comments