feat: polish loading state and tooltip

This commit is contained in:
tdgao
2026-07-03 12:10:26 -07:00
parent 42f2fc3bec
commit 75d4a7ca06
4 changed files with 42 additions and 10 deletions
@@ -119,6 +119,7 @@ const dependencyVersionIds = computed<string[]>(() => {
return [ return [
...new Set( ...new Set(
visibleResolvedDependencies.value visibleResolvedDependencies.value
.filter((dependency) => !('reason' in dependency))
.map((dependency) => dependency.version_id) .map((dependency) => dependency.version_id)
.filter((versionId): versionId is string => !!versionId), .filter((versionId): versionId is string => !!versionId),
), ),
@@ -186,14 +187,41 @@ const dependenciesByParentVersionId = computed(() => {
return map return map
}) })
const dependenciesLoaded = computed(() => {
if (!shouldResolveDependencies.value) return false
if (!dependencyResolution.value) return false
if (
dependencyResolution.value.primary.version_id &&
dependencyResolution.value.primary.version_id !== props.selectedVersion?.id
) {
return false
}
if (
!dependencyVersionIds.value.every((versionId) => dependencyVersionById.value.has(versionId))
) {
return false
}
if (
!dependencyProjectIds.value.every((projectId) => dependencyProjectById.value.has(projectId))
) {
return false
}
return true
})
const resolvedDependencyRows = computed<DownloadDependencyRow[]>(() => { const resolvedDependencyRows = computed<DownloadDependencyRow[]>(() => {
if (!dependenciesLoaded.value) return []
const primaryVersionId = const primaryVersionId =
dependencyResolution.value?.primary.version_id || props.selectedVersion?.id dependencyResolution.value?.primary.version_id || props.selectedVersion?.id
if (!primaryVersionId) return [] if (!primaryVersionId) return []
const dependencies = dependenciesByParentVersionId.value.get(primaryVersionId) || [] const dependencies = dependenciesByParentVersionId.value.get(primaryVersionId) || []
return dependencies.map((dependency) => createDependencyRow(dependency)) return dependencies.flatMap((dependency) => {
const row = createDependencyRow(dependency)
return row ? [row] : []
})
}) })
const dependencyRows = computed<DownloadDependencyRow[]>( const dependencyRows = computed<DownloadDependencyRow[]>(
@@ -208,25 +236,26 @@ function shouldShowDependency(dependency: ResolvedContent) {
return !('reason' in dependency && dependency.reason === 'quilt_fabric_api') return !('reason' in dependency && dependency.reason === 'quilt_fabric_api')
} }
function createDependencyRow(dependency: ResolvedContent): DownloadDependencyRow { function createDependencyRow(dependency: ResolvedContent): DownloadDependencyRow | null {
const versionId = dependency.version_id ?? undefined const versionId = dependency.version_id ?? undefined
const version = versionId ? dependencyVersionById.value.get(versionId) : undefined const version = versionId ? dependencyVersionById.value.get(versionId) : undefined
const project = dependencyProjectById.value.get(dependency.project_id) const project = dependencyProjectById.value.get(dependency.project_id)
if (!project) return null
const primaryFile = primaryFileForVersion(version) const primaryFile = primaryFileForVersion(version)
const unavailableTooltip = const unavailableTooltip =
'reason' in dependency && dependency.reason 'reason' in dependency && dependency.reason
? skippedReasonLabel(dependency.reason) ? skippedReasonLabel(dependency.reason)
: formatMessage(messages.unavailableDependency) : formatMessage(messages.unavailableDependency)
const name = const name = project.title
project?.title || version?.name || version?.version_number || versionId || dependency.project_id
return { return {
key: `${dependency.project_id}-${versionId ?? 'unresolved'}-${ key: `${dependency.project_id}-${versionId ?? 'unresolved'}-${
'reason' in dependency ? dependency.reason : 'resolved' 'reason' in dependency ? dependency.reason : 'resolved'
}`, }`,
name, name,
icon: project?.icon_url, icon: project.icon_url ?? undefined,
projectHref: project ? `/${project.project_type}/${project.slug || project.id}` : undefined, projectHref: `/${project.project_type}/${project.slug || project.id}`,
downloadHref: downloadHref:
'reason' in dependency || !primaryFile ? undefined : getDownloadUrl(primaryFile.url), 'reason' in dependency || !primaryFile ? undefined : getDownloadUrl(primaryFile.url),
filename: primaryFile?.filename, filename: primaryFile?.filename,
@@ -235,7 +264,10 @@ function createDependencyRow(dependency: ResolvedContent): DownloadDependencyRow
dependencies: (versionId && dependenciesByParentVersionId.value.get(versionId) dependencies: (versionId && dependenciesByParentVersionId.value.get(versionId)
? dependenciesByParentVersionId.value.get(versionId)! ? dependenciesByParentVersionId.value.get(versionId)!
: [] : []
).map((subDependency) => createDependencyRow(subDependency)), ).flatMap((subDependency) => {
const row = createDependencyRow(subDependency)
return row ? [row] : []
}),
} }
} }
@@ -1,5 +1,5 @@
<template> <template>
<div class="grid w-full grid-cols-1 gap-2 sm:grid-cols-2"> <div class="flex w-full gap-2">
<Combobox <Combobox
:model-value="currentGameVersion || undefined" :model-value="currentGameVersion || undefined"
class="w-full" class="w-full"
+1 -1
View File
@@ -4788,7 +4788,7 @@
"message": "View version" "message": "View version"
}, },
"version.download.download-dependency": { "version.download.download-dependency": {
"message": "Select a dependency to download" "message": "Select a version to download"
}, },
"version.download.no-primary-file": { "version.download.no-primary-file": {
"message": "Error: No primary file found" "message": "Error: No primary file found"
@@ -993,7 +993,7 @@ const messages = defineMessages({
}, },
downloadProject: { downloadProject: {
id: 'version.download.download-dependency', id: 'version.download.download-dependency',
defaultMessage: 'Select a dependency to download', defaultMessage: 'Select a version to download',
}, },
requiredResourcePack: { requiredResourcePack: {
id: 'version.download.required-resource-pack', id: 'version.download.required-resource-pack',