diff --git a/apps/frontend/src/components/ui/create-project-version/stages/DetailsStage.vue b/apps/frontend/src/components/ui/create-project-version/stages/DetailsStage.vue index 6aa337c5..60cf4e0b 100644 --- a/apps/frontend/src/components/ui/create-project-version/stages/DetailsStage.vue +++ b/apps/frontend/src/components/ui/create-project-version/stages/DetailsStage.vue @@ -9,6 +9,7 @@ :items="['release', 'beta', 'alpha']" :never-empty="true" :capitalize="true" + :disabled="isUploading" />
@@ -18,6 +19,7 @@
@@ -44,6 +47,7 @@ v-model="draftVersion.changelog" :on-image-upload="onImageUpload" :min-height="150" + :disabled="isUploading" />
@@ -56,7 +60,7 @@ import { Chips, MarkdownEditor } from '@modrinth/ui' import { useImageUpload } from '~/composables/image-upload.ts' import { injectManageVersionContext } from '~/providers/version/manage-version-modal' -const { draftVersion } = injectManageVersionContext() +const { draftVersion, isUploading } = injectManageVersionContext() async function onImageUpload(file: File) { const response = await useImageUpload(file, { context: 'version' }) diff --git a/apps/frontend/src/providers/version/manage-version-modal.ts b/apps/frontend/src/providers/version/manage-version-modal.ts index 1b448065..cf162ebc 100644 --- a/apps/frontend/src/providers/version/manage-version-modal.ts +++ b/apps/frontend/src/providers/version/manage-version-modal.ts @@ -78,7 +78,7 @@ export interface ManageVersionContextValue { dependencyVersions: Ref> projectsFetchLoading: Ref handlingNewFiles: Ref - suggestedDependencies: Ref + suggestedDependencies: Ref visibleSuggestedDependencies: ComputedRef primaryFile: ComputedRef @@ -177,7 +177,7 @@ export function createManageVersionContext( const dependencyProjects = ref>({}) const dependencyVersions = ref>({}) const projectsFetchLoading = ref(false) - const suggestedDependencies = ref([]) + const suggestedDependencies = ref(null) const isSubmitting = ref(false) const isUploading = ref(false) @@ -238,7 +238,7 @@ export function createManageVersionContext( return existing.version_id === dep.version_id }) - return suggestedDependencies.value + return (suggestedDependencies.value ?? []) .filter((dep) => !isDuplicateSuggestion(dep)) .filter((dep) => !isAlreadyAdded(dep)) .sort((a, b) => (a.name ?? '').localeCompare(b.name ?? '')) @@ -559,20 +559,20 @@ export function createManageVersionContext( async (loaders) => { if (noDependenciesProject.value) return try { - suggestedDependencies.value = [] - - if (!loaders?.length) return - const projectId = draftVersion.value.project_id if (!projectId) return try { - const versions = await labrinth.versions_v3.getProjectVersions(projectId, { + let versions = await labrinth.versions_v3.getProjectVersions(projectId, { loaders, }) + if (!versions || versions.length === 0) { + versions = await labrinth.versions_v3.getProjectVersions(projectId) + } // Get the most recent matching version and extract its dependencies if (versions.length > 0) { + suggestedDependencies.value = [] const mostRecentVersion = versions[0] for (const dep of mostRecentVersion.dependencies) { suggestedDependencies.value.push({ @@ -582,12 +582,14 @@ export function createManageVersionContext( file_name: dep.file_name, }) } + } else { + suggestedDependencies.value = null } } catch (error: any) { console.error(`Failed to get versions for project ${projectId}:`, error) } - for (const dep of suggestedDependencies.value) { + for (const dep of suggestedDependencies.value ?? []) { try { if (dep.project_id) { const proj = await getProject(dep.project_id) diff --git a/apps/frontend/src/providers/version/stages/dependencies-stage.ts b/apps/frontend/src/providers/version/stages/dependencies-stage.ts index 0f003431..de31a3e8 100644 --- a/apps/frontend/src/providers/version/stages/dependencies-stage.ts +++ b/apps/frontend/src/providers/version/stages/dependencies-stage.ts @@ -10,7 +10,7 @@ export const stageConfig: StageConfigInput = { id: 'add-dependencies', stageContent: markRaw(DependenciesStage), title: (ctx) => (ctx.editingVersion.value ? 'Edit dependencies' : 'Dependencies'), - skip: true, + skip: (ctx) => ctx.suggestedDependencies.value != null, leftButtonConfig: (ctx) => ctx.editingVersion.value ? { diff --git a/apps/frontend/src/providers/version/stages/details-stage.ts b/apps/frontend/src/providers/version/stages/details-stage.ts index ef80de6f..04910965 100644 --- a/apps/frontend/src/providers/version/stages/details-stage.ts +++ b/apps/frontend/src/providers/version/stages/details-stage.ts @@ -11,6 +11,7 @@ export const stageConfig: StageConfigInput = { stageContent: markRaw(DetailsStage), title: (ctx) => (ctx.editingVersion.value ? 'Edit details' : 'Details'), maxWidth: '744px', + disableClose: (ctx) => ctx.isUploading.value, leftButtonConfig: (ctx) => ctx.editingVersion.value ? { @@ -21,6 +22,7 @@ export const stageConfig: StageConfigInput = { : { label: 'Back', icon: LeftArrowIcon, + disabled: ctx.isUploading.value, onClick: () => ctx.modal.value?.prevStage(), }, rightButtonConfig: (ctx) => ({ @@ -29,7 +31,7 @@ export const stageConfig: StageConfigInput = { : ctx.isUploading.value ? ctx.uploadProgress.value.progress >= 1 ? 'Creating version' - : `Uploading version ${Math.round(ctx.uploadProgress.value.progress * 100)}%` + : `Uploading ${Math.round(ctx.uploadProgress.value.progress * 100)}%` : 'Create version', icon: ctx.isSubmitting.value ? SpinnerIcon : ctx.editingVersion.value ? SaveIcon : PlusIcon, iconPosition: 'before', diff --git a/packages/ui/src/components/base/MultiStageModal.vue b/packages/ui/src/components/base/MultiStageModal.vue index d5ee0dd0..296d1b75 100644 --- a/packages/ui/src/components/base/MultiStageModal.vue +++ b/packages/ui/src/components/base/MultiStageModal.vue @@ -7,6 +7,7 @@ :closable="true" :close-on-click-outside="false" :width="resolvedMaxWidth" + :disable-close="resolveCtxFn(currentStage.disableClose, context)" >