3131 :can-fetch-metadata =" canFetchMetadata"
3232 :can-upload-model =" canUploadModel"
3333 :upload-status =" uploadStatus"
34- :on- back =" goToPreviousStep"
35- :on- fetch-metadata =" handleFetchMetadata"
36- :on- upload =" handleUploadModel"
37- :on- close =" handleClose"
34+ @ back =" goToPreviousStep"
35+ @ fetch-metadata =" handleFetchMetadata"
36+ @ upload =" handleUploadModel"
37+ @ close =" handleClose"
3838 />
3939 </div >
4040</template >
4141
4242<script setup lang="ts">
43- import { computed , onMounted , ref , watch } from ' vue'
44-
45- import { st } from ' @/i18n'
4643import UploadModelConfirmation from ' @/platform/assets/components/UploadModelConfirmation.vue'
4744import UploadModelFooter from ' @/platform/assets/components/UploadModelFooter.vue'
4845import UploadModelProgress from ' @/platform/assets/components/UploadModelProgress.vue'
4946import UploadModelUrlInput from ' @/platform/assets/components/UploadModelUrlInput.vue'
50- import { useModelTypes } from ' @/platform/assets/composables/useModelTypes'
51- import type { AssetMetadata } from ' @/platform/assets/schemas/assetSchema'
52- import { assetService } from ' @/platform/assets/services/assetService'
47+ import { useUploadModelWizard } from ' @/platform/assets/composables/useUploadModelWizard'
5348import { useDialogStore } from ' @/stores/dialogStore'
5449
5550const dialogStore = useDialogStore ()
@@ -58,152 +53,35 @@ const emit = defineEmits<{
5853 ' upload-success' : []
5954}>()
6055
61- const currentStep = ref (1 )
62- const isFetchingMetadata = ref (false )
63- const isUploading = ref (false )
64- const uploadStatus = ref <' idle' | ' uploading' | ' success' | ' error' >(' idle' )
65- const uploadError = ref (' ' )
66-
67- const wizardData = ref <{
68- url: string
69- metadata: AssetMetadata | null
70- name: string
71- tags: string []
72- }>({
73- url: ' ' ,
74- metadata: null ,
75- name: ' ' ,
76- tags: []
77- })
78-
79- const selectedModelType = ref <string | undefined >(undefined )
80-
81- const { modelTypes, fetchModelTypes } = useModelTypes ()
82-
83- // Clear error when URL changes
84- watch (
85- () => wizardData .value .url ,
86- () => {
87- uploadError .value = ' '
88- }
89- )
90-
91- // Validation
92- const canFetchMetadata = computed (() => {
93- return wizardData .value .url .trim ().length > 0
94- })
95-
96- const canUploadModel = computed (() => {
97- return !! selectedModelType .value
98- })
56+ const {
57+ currentStep,
58+ isFetchingMetadata,
59+ isUploading,
60+ uploadStatus,
61+ uploadError,
62+ wizardData,
63+ selectedModelType,
64+ canFetchMetadata,
65+ canUploadModel,
66+ fetchMetadata,
67+ uploadModel,
68+ goToPreviousStep
69+ } = useUploadModelWizard ()
9970
10071async function handleFetchMetadata() {
101- if (! canFetchMetadata .value ) return
102-
103- // Validate that URL is from Civitai domain
104- const isCivitaiUrl = (url : string ): boolean => {
105- try {
106- const hostname = new URL (url ).hostname .toLowerCase ()
107- return hostname === ' civitai.com' || hostname .endsWith (' .civitai.com' )
108- } catch {
109- return false
110- }
111- }
112-
113- if (! isCivitaiUrl (wizardData .value .url )) {
114- uploadError .value = ' Only Civitai URLs are supported'
115- return
116- }
117-
118- isFetchingMetadata .value = true
119- try {
120- const metadata = await assetService .getAssetMetadata (wizardData .value .url )
121- wizardData .value .metadata = metadata
122-
123- // Pre-fill name from metadata
124- wizardData .value .name = metadata .filename || metadata .name || ' '
125-
126- // Pre-fill model type from metadata tags if available
127- if (metadata .tags && metadata .tags .length > 0 ) {
128- wizardData .value .tags = metadata .tags
129- // Try to detect model type from tags
130- const typeTag = metadata .tags .find ((tag ) =>
131- modelTypes .value .some ((type ) => type .value === tag )
132- )
133- if (typeTag ) {
134- selectedModelType .value = typeTag
135- }
136- }
137-
138- currentStep .value = 2
139- } catch (error ) {
140- console .error (' Failed to retrieve metadata:' , error )
141- uploadError .value =
142- error instanceof Error
143- ? error .message
144- : st (
145- ' assetBrowser.uploadModelFailedToRetrieveMetadata' ,
146- ' Failed to retrieve metadata. Please check the link and try again.'
147- )
148- currentStep .value = 1
149- } finally {
150- isFetchingMetadata .value = false
151- }
72+ await fetchMetadata ()
15273}
15374
15475async function handleUploadModel() {
155- if (! canUploadModel .value ) return
156-
157- isUploading .value = true
158- uploadStatus .value = ' uploading'
159-
160- try {
161- const tags = selectedModelType .value
162- ? [' models' , selectedModelType .value ]
163- : [' models' ]
164- const filename =
165- wizardData .value .metadata ?.filename ||
166- wizardData .value .metadata ?.name ||
167- ' model'
168-
169- await assetService .uploadAssetFromUrl ({
170- url: wizardData .value .url ,
171- name: filename ,
172- tags ,
173- user_metadata: {
174- source: ' civitai' ,
175- source_url: wizardData .value .url ,
176- model_type: selectedModelType .value
177- }
178- })
179-
180- uploadStatus .value = ' success'
181- currentStep .value = 3
76+ const success = await uploadModel ()
77+ if (success ) {
18278 emit (' upload-success' )
183- } catch (error ) {
184- console .error (' Failed to upload asset:' , error )
185- uploadStatus .value = ' error'
186- uploadError .value =
187- error instanceof Error ? error .message : ' Failed to upload model'
188- currentStep .value = 3
189- } finally {
190- isUploading .value = false
191- }
192- }
193-
194- function goToPreviousStep() {
195- if (currentStep .value > 1 ) {
196- currentStep .value = currentStep .value - 1
19779 }
19880}
19981
20082function handleClose() {
20183 dialogStore .closeDialog ({ key: ' upload-model' })
20284}
203-
204- onMounted (() => {
205- fetchModelTypes ()
206- })
20785 </script >
20886
20987<style scoped>
0 commit comments