diff --git a/packages/ui/src/layouts/shared/content-tab/components/ContentCardTable.vue b/packages/ui/src/layouts/shared/content-tab/components/ContentCardTable.vue
index d9bb586159..5d48a891d7 100644
--- a/packages/ui/src/layouts/shared/content-tab/components/ContentCardTable.vue
+++ b/packages/ui/src/layouts/shared/content-tab/components/ContentCardTable.vue
@@ -104,20 +104,24 @@ defineExpose({
})
// Selection logic
+const selectableItems = computed(() => props.items.filter((item) => !item.disabled))
+
const allSelected = computed(() => {
- if (props.items.length === 0) return false
- return props.items.every((item) => selectedIds.value.includes(item.id))
+ if (selectableItems.value.length === 0) return false
+ return selectableItems.value.every((item) => selectedIds.value.includes(item.id))
})
const someSelected = computed(() => {
- return props.items.some((item) => selectedIds.value.includes(item.id)) && !allSelected.value
+ return (
+ selectableItems.value.some((item) => selectedIds.value.includes(item.id)) && !allSelected.value
+ )
})
function toggleSelectAll() {
if (allSelected.value || someSelected.value) {
selectedIds.value = []
} else {
- selectedIds.value = props.items.map((item) => item.id)
+ selectedIds.value = selectableItems.value.map((item) => item.id)
}
}
@@ -132,7 +136,10 @@ function toggleItemSelection(
if (selected && event?.shiftKey && lastSelectedIndex.value !== null && index !== undefined) {
const start = Math.min(lastSelectedIndex.value, index)
const end = Math.max(lastSelectedIndex.value, index)
- const rangeIds = props.items.slice(start, end + 1).map((item) => item.id)
+ const rangeIds = props.items
+ .slice(start, end + 1)
+ .filter((item) => !item.disabled)
+ .map((item) => item.id)
const merged = new Set([...selectedIds.value, ...rangeIds])
selectedIds.value = [...merged]
} else if (selected) {
@@ -192,6 +199,7 @@ function handleSort(column: ContentCardTableSortColumn) {
:model-value="allSelected"
:indeterminate="someSelected"
:aria-label="formatMessage(commonMessages.selectAllLabel)"
+ :disabled="selectableItems.length === 0"
class="shrink-0"
@update:model-value="toggleSelectAll"
/>
@@ -266,6 +274,7 @@ function handleSort(column: ContentCardTableSortColumn) {
:owner="item.owner"
:enabled="item.enabled"
:installing="item.installing"
+ :install-progress="item.installProgress"
:has-update="item.hasUpdate"
:is-client-only="item.isClientOnly"
:client-warning="item.clientWarning"
@@ -329,6 +338,7 @@ function handleSort(column: ContentCardTableSortColumn) {
:owner="item.owner"
:enabled="item.enabled"
:installing="item.installing"
+ :install-progress="item.installProgress"
:has-update="item.hasUpdate"
:is-client-only="item.isClientOnly"
:client-warning="item.clientWarning"
diff --git a/packages/ui/src/layouts/shared/content-tab/layout.vue b/packages/ui/src/layouts/shared/content-tab/layout.vue
index bdee7c24a8..76852bea92 100644
--- a/packages/ui/src/layouts/shared/content-tab/layout.vue
+++ b/packages/ui/src/layouts/shared/content-tab/layout.vue
@@ -286,6 +286,7 @@ const tableItems = computed
(() => {
toggleDisabled: ctx.isBusy.value,
toggleDisabledTooltip: ctx.isBusy.value ? (ctx.busyMessage?.value ?? null) : null,
installing: item.installing === true,
+ installProgress: item.installProgress,
hasUpdate: base.hasUpdate ?? item.has_update,
isClientOnly:
isClientOnlyEnvironment(item.environment) ||
diff --git a/packages/ui/src/layouts/shared/content-tab/types.ts b/packages/ui/src/layouts/shared/content-tab/types.ts
index c92f8216a9..a94827b066 100644
--- a/packages/ui/src/layouts/shared/content-tab/types.ts
+++ b/packages/ui/src/layouts/shared/content-tab/types.ts
@@ -50,6 +50,7 @@ export interface ContentCardTableItem {
toggleDisabled?: boolean
toggleDisabledTooltip?: string | null
installing?: boolean
+ installProgress?: number | null
hasUpdate?: boolean
isClientOnly?: boolean
clientWarning?: ClientWarningType | null
@@ -85,6 +86,7 @@ export interface ContentItem extends Omit<
pack_client_retained?: boolean
pack_client_depends?: boolean
installing?: boolean
+ installProgress?: number | null
source_kind?: ContentSourceKind | null
external?: boolean
external_url?: string
diff --git a/packages/ui/src/layouts/shared/server-settings/pages/installation.vue b/packages/ui/src/layouts/shared/server-settings/pages/installation.vue
index 3d943bd823..82aa344ebe 100644
--- a/packages/ui/src/layouts/shared/server-settings/pages/installation.vue
+++ b/packages/ui/src/layouts/shared/server-settings/pages/installation.vue
@@ -107,9 +107,19 @@ import { injectFilePicker } from '#ui/providers/file-picker'
const debug = useDebugLogger('LoaderPage')
const client = injectModrinthClient()
-const { server, serverId, worldId, isSyncingContent, busyReasons } = injectModrinthServerContext()
+const {
+ beginInstallation,
+ busyReasons,
+ cancelOptimisticInstallation,
+ installation,
+ server,
+ serverId,
+ worldId,
+} = injectModrinthServerContext()
const { addNotification } = injectNotificationManager()
const queryClient = useQueryClient()
+const serverDetailQueryKey = ['servers', 'detail', serverId] as const
+const addonsQueryKey = ['content', 'list', 'v1', serverId] as const
const tags = injectTags()
const { formatMessage } = useVIntl()
const serverSettings = injectServerSettings()
@@ -202,19 +212,7 @@ const emit = defineEmits<{
'reinstall-failed': []
}>()
-const isInstalling = computed(() => {
- const val =
- server.value?.status === 'installing' || isSyncingContent.value || busyReasons.value.length > 0
- debug(
- 'isInstalling:',
- val,
- 'server.status:',
- server.value?.status,
- 'isSyncingContent:',
- isSyncingContent.value,
- )
- return val
-})
+const isInstalling = computed(() => busyReasons.value.length > 0)
const setupActionDisabled = computed(() => !canSetup.value || isInstalling.value)
const setupActionDisabledMessage = computed(() => {
if (!canSetup.value) return permissionDeniedMessage.value
@@ -236,14 +234,14 @@ function showResetServerModal() {
async function invalidateServerState() {
debug('invalidateServerState: starting')
await Promise.all([
- queryClient.invalidateQueries({ queryKey: ['servers', 'detail', serverId] }),
- queryClient.invalidateQueries({ queryKey: ['content', 'list', 'v1', serverId] }),
+ queryClient.invalidateQueries({ queryKey: serverDetailQueryKey }),
+ queryClient.invalidateQueries({ queryKey: addonsQueryKey }),
])
debug('invalidateServerState: complete')
}
const addonsQuery = useQuery({
- queryKey: computed(() => ['content', 'list', 'v1', serverId]),
+ queryKey: addonsQueryKey,
queryFn: () =>
client.archon.content_v1.getAddons(serverId, worldId.value!, { from_modpack: false }),
enabled: computed(() => worldId.value !== null),
@@ -395,6 +393,67 @@ function toApiLoader(loader: string): Archon.Content.v1.Modloader {
return loader as Archon.Content.v1.Modloader
}
+type InstallationCacheSnapshot = {
+ server: Archon.Servers.v0.Server | undefined
+ addons: Archon.Content.v1.Addons | undefined
+}
+
+async function applyOptimisticInstallation(
+ platform: string,
+ gameVersion: string,
+ loaderVersion: string | null,
+): Promise {
+ await Promise.all([
+ queryClient.cancelQueries({ queryKey: serverDetailQueryKey, exact: true }),
+ queryClient.cancelQueries({ queryKey: addonsQueryKey, exact: true }),
+ ])
+
+ const snapshot = {
+ server: queryClient.getQueryData(serverDetailQueryKey),
+ addons: queryClient.getQueryData(addonsQueryKey),
+ }
+ const resolvedLoaderVersion = platform === 'vanilla' ? null : loaderVersion
+ beginInstallation({
+ type: 'platform',
+ platform: platform as Extract<
+ Archon.Websocket.v0.InstallProgressKey,
+ { type: 'platform' }
+ >['platform'],
+ platform_version: resolvedLoaderVersion ?? '',
+ game_version: gameVersion,
+ })
+
+ queryClient.setQueryData(serverDetailQueryKey, (current) =>
+ current
+ ? {
+ ...current,
+ status: 'installing',
+ loader: formatLoaderLabel(platform) as Archon.Servers.v0.Loader,
+ loader_version: resolvedLoaderVersion,
+ mc_version: gameVersion,
+ }
+ : current,
+ )
+ queryClient.setQueryData(addonsQueryKey, (current) =>
+ current
+ ? {
+ ...current,
+ modloader: toApiLoader(platform),
+ modloader_version: resolvedLoaderVersion,
+ game_version: gameVersion,
+ }
+ : current,
+ )
+
+ return snapshot
+}
+
+function rollbackOptimisticInstallation(snapshot: InstallationCacheSnapshot) {
+ cancelOptimisticInstallation()
+ queryClient.setQueryData(serverDetailQueryKey, snapshot.server)
+ queryClient.setQueryData(addonsQueryKey, snapshot.addons)
+}
+
async function uploadLocalModpackWithSoftOverride() {
const picked = await filePicker.pickModpackFile()
if (!picked?.file) return false
@@ -406,8 +465,11 @@ async function uploadLocalModpackWithSoftOverride() {
{ softOverride: true },
)
await uploadProgressModal.value!.track(handle)
+ beginInstallation({
+ type: 'local_modpack',
+ filename: picked.file.name,
+ })
emit('reinstall')
- await invalidateServerState()
return true
}
@@ -567,6 +629,7 @@ provideInstallationSettings({
const gameVersionChanged = gameVersion !== (server.value?.mc_version ?? '')
const loaderVersionChanged =
loaderVersionId !== null && loaderVersionId !== (server.value?.loader_version ?? '')
+ if (!platformChanged && !gameVersionChanged && !loaderVersionChanged) return
let resolvedLoaderVersion = loaderVersionId
if (!resolvedLoaderVersion && platform !== 'vanilla') {
@@ -574,6 +637,7 @@ provideInstallationSettings({
resolvedLoaderVersion = versions[0]?.id ?? null
}
+ const snapshot = await applyOptimisticInstallation(platform, gameVersion, resolvedLoaderVersion)
debug('save: emitting reinstall before API call')
emit(
'reinstall',
@@ -596,10 +660,10 @@ provideInstallationSettings({
debug('save: game version only, calling applyGameVersionUpdate', gameVersion)
await client.archon.content_v1.applyGameVersionUpdate(serverId, worldId.value!, gameVersion)
}
- debug('save: succeeded, invalidating')
- invalidateServerState()
+ debug('save: succeeded')
} catch (err) {
debug('save: failed, emitting reinstall-failed', err)
+ rollbackOptimisticInstallation(snapshot)
emit('reinstall-failed')
addNotification({
type: 'error',
@@ -612,10 +676,10 @@ provideInstallationSettings({
async repair() {
if (setupActionDisabled.value) return
debug('repair: called')
+ beginInstallation({ type: 'unknown' })
try {
await client.archon.content_v1.repair(serverId, worldId.value!)
- debug('repair: API succeeded, invalidating')
- await invalidateServerState()
+ debug('repair: API succeeded')
addNotification({
type: 'success',
title: formatMessage(messages.repairStartedTitle),
@@ -623,6 +687,7 @@ provideInstallationSettings({
})
} catch (err) {
debug('repair: failed', err)
+ cancelOptimisticInstallation()
addNotification({
type: 'error',
text: err instanceof Error ? err.message : formatMessage(messages.failedToRepair),
@@ -654,6 +719,11 @@ provideInstallationSettings({
modpack.value.spec.version_id,
)
debug('reinstallModpack: emitting reinstall before API call')
+ beginInstallation({
+ type: 'modrinth_modpack',
+ project_id: modpack.value.spec.project_id,
+ version_id: modpack.value.spec.version_id,
+ })
emit('reinstall')
try {
await client.archon.content_v1.installContent(serverId, worldId.value!, {
@@ -665,10 +735,10 @@ provideInstallationSettings({
},
soft_override: true,
})
- debug('reinstallModpack: installContent succeeded, invalidating')
- invalidateServerState()
+ debug('reinstallModpack: installContent succeeded')
} catch (err) {
debug('reinstallModpack: failed, emitting reinstall-failed', err)
+ cancelOptimisticInstallation()
emit('reinstall-failed')
addNotification({
type: 'error',
@@ -718,14 +788,7 @@ provideInstallationSettings({
})
} finally {
debug('unlinkModpack: invalidating queries')
- await Promise.all([
- queryClient.invalidateQueries({
- queryKey: ['servers', 'detail', serverId],
- }),
- queryClient.invalidateQueries({
- queryKey: ['content', 'list', 'v1', serverId],
- }),
- ])
+ await invalidateServerState()
debug('unlinkModpack: invalidation complete')
}
},
@@ -769,6 +832,11 @@ provideInstallationSettings({
if (!modpackProjectId.value) return
debug('onModpackVersionConfirm: called, version:', version.id)
debug('onModpackVersionConfirm: emitting reinstall before API call')
+ beginInstallation({
+ type: 'modrinth_modpack',
+ project_id: modpackProjectId.value,
+ version_id: version.id,
+ })
emit('reinstall')
try {
await client.archon.content_v1.installContent(serverId, worldId.value!, {
@@ -780,10 +848,10 @@ provideInstallationSettings({
},
soft_override: true,
})
- debug('onModpackVersionConfirm: installContent succeeded, invalidating')
- invalidateServerState()
+ debug('onModpackVersionConfirm: installContent succeeded')
} catch (err) {
debug('onModpackVersionConfirm: failed, emitting reinstall-failed', err)
+ cancelOptimisticInstallation()
emit('reinstall-failed')
addNotification({
type: 'error',
@@ -865,6 +933,7 @@ provideInstallationSettings({
const versions = getLoaderVersionsForGameVersion(platform, gameVersion)
resolvedLoaderVersion = versions[0]?.id ?? null
}
+ const snapshot = await applyOptimisticInstallation(platform, gameVersion, resolvedLoaderVersion)
emit('reinstall', { loader: platform, lVersion: resolvedLoaderVersion, mVersion: gameVersion })
try {
const request: Archon.Content.v1.InstallWorldContent = {
@@ -876,10 +945,10 @@ provideInstallationSettings({
}
debug('saveWithoutAutoFix: calling installContent', request)
await client.archon.content_v1.installContent(serverId, worldId.value!, request)
- debug('saveWithoutAutoFix: succeeded, invalidating')
- invalidateServerState()
+ debug('saveWithoutAutoFix: succeeded')
} catch (err) {
debug('saveWithoutAutoFix: failed', err)
+ rollbackOptimisticInstallation(snapshot)
emit('reinstall-failed')
addNotification({
type: 'error',
@@ -930,10 +999,28 @@ watch(
)
function onReinstall(event?: unknown) {
- if (resetServerDisabled.value) return
+ if (resetServerDisabled.value && !installation.value) return
installationSettingsLayout.value?.cancelEditing()
modrinthServersConsole.clear()
queryClient.removeQueries({ queryKey: ['servers', 'ws-state', serverId] })
+ if (!installation.value) {
+ const args = event as
+ | { loader?: string; lVersion?: string; mVersion?: string | null }
+ | undefined
+ if (args?.loader && args.mVersion) {
+ beginInstallation({
+ type: 'platform',
+ platform: args.loader as Extract<
+ Archon.Websocket.v0.InstallProgressKey,
+ { type: 'platform' }
+ >['platform'],
+ platform_version: args.lVersion ?? '',
+ game_version: args.mVersion,
+ })
+ } else {
+ beginInstallation({ type: 'unknown' })
+ }
+ }
emit('reinstall', event)
serverSettings.closeModal?.()
}
diff --git a/packages/ui/src/layouts/wrapped/hosting/manage/content.vue b/packages/ui/src/layouts/wrapped/hosting/manage/content.vue
index bcfd4afc38..fd4c3c1564 100644
--- a/packages/ui/src/layouts/wrapped/hosting/manage/content.vue
+++ b/packages/ui/src/layouts/wrapped/hosting/manage/content.vue
@@ -116,7 +116,7 @@ const messages = defineMessages({
})
const client = injectModrinthClient()
-const { server, worldId, busyReasons, isSyncingContent, uploadState, cancelUpload } =
+const { server, worldId, busyReasons, installProgressItems, uploadState, cancelUpload } =
injectModrinthServerContext()
const contentUploadSession = useUploadSessionUpload({
client,
@@ -175,19 +175,11 @@ const setupActionDisabled = computed(() => !canSetup.value || busyReasons.value.
const setupActionBusyMessage = computed(() => {
if (!canSetup.value) return permissionDeniedMessage.value
- const bannerCoversInstalling =
- server.value?.status === 'installing' ||
- isSyncingContent.value ||
- busyReasons.value.some(
- (r) =>
- r.reason.id === 'servers.busy.installing' || r.reason.id === 'servers.busy.syncing-content',
- )
+ const bannerCoversInstalling = busyReasons.value.some(
+ (r) => r.reason.id === 'servers.busy.installing',
+ )
const filteredReasons = busyReasons.value.filter((r) => {
- if (
- bannerCoversInstalling &&
- (r.reason.id === 'servers.busy.installing' || r.reason.id === 'servers.busy.syncing-content')
- )
- return false
+ if (bannerCoversInstalling && r.reason.id === 'servers.busy.installing') return false
if (
r.reason.id === 'servers.busy.backup-creating' ||
r.reason.id === 'servers.busy.backup-restoring'
@@ -198,6 +190,25 @@ const setupActionBusyMessage = computed(() => {
return filteredReasons.length > 0 ? formatMessage(filteredReasons[0].reason) : null
})
+const currentWorldInstallProgressItems = computed(() =>
+ installProgressItems.value.filter((item) => item.world_id === worldId.value),
+)
+const hasActiveFileInstallProgress = computed(() =>
+ currentWorldInstallProgressItems.value.some(
+ (item) =>
+ item.key.type === 'file' &&
+ item.error == null &&
+ item.progress != null &&
+ item.progress < 100,
+ ),
+)
+
+const contentActionDisabled = computed(() => !canSetup.value || busyReasons.value.length > 0)
+const contentActionBusyMessage = computed(() => {
+ if (!canSetup.value) return permissionDeniedMessage.value
+ return busyReasons.value.length > 0 ? formatMessage(busyReasons.value[0].reason) : null
+})
+
const modpackProjectId = computed(() => {
const spec = contentQuery.data.value?.modpack?.spec
return spec?.platform === 'modrinth' ? spec.project_id : null
@@ -304,6 +315,8 @@ const modpack = computed(() => {
header: 'categories',
})) as ContentModpackCardCategory[],
hasUpdate: !!mp.has_update || !!newestModpackUpdateVersion.value,
+ disabled: setupActionDisabled.value,
+ disabledText: setupActionBusyMessage.value ?? formatMessage(commonMessages.installingLabel),
}
})
@@ -328,7 +341,98 @@ const addonLookup = computed(() => {
return map
})
+function normalizeInstallFilename(filename: string) {
+ return filename.endsWith('.disabled') ? filename.slice(0, -'.disabled'.length) : filename
+}
+
+const fileInstallProgressByFilename = computed(() => {
+ const progressByFilename = new Map()
+ for (const item of currentWorldInstallProgressItems.value) {
+ if (item.key.type === 'file') {
+ progressByFilename.set(normalizeInstallFilename(item.key.filename), item)
+ }
+ }
+ return progressByFilename
+})
+const completedInstallFilenames = ref>(new Set())
+
+watch(
+ fileInstallProgressByFilename,
+ (progressByFilename, previousProgressByFilename) => {
+ const completed = new Set(completedInstallFilenames.value)
+ let shouldRefreshContent = false
+ if (previousProgressByFilename) {
+ for (const filename of previousProgressByFilename.keys()) {
+ if (!progressByFilename.has(filename)) {
+ if (!completed.has(filename)) shouldRefreshContent = true
+ completed.add(filename)
+ }
+ }
+ }
+ for (const [filename, item] of progressByFilename) {
+ if (item.error != null || item.progress === 100) {
+ if (item.error == null && !completed.has(filename)) shouldRefreshContent = true
+ completed.add(filename)
+ } else {
+ completed.delete(filename)
+ }
+ }
+ completedInstallFilenames.value = completed
+ if (shouldRefreshContent && !contentQuery.isFetching.value) {
+ void contentQuery.refetch()
+ }
+ },
+ { immediate: true },
+)
+
+function getContentItemInstallFilename(item: ContentItem) {
+ const filename = item.version?.file_name || item.file_name
+ return normalizeInstallFilename(filename)
+}
+
+function getContentItemInstallProgress(item: ContentItem) {
+ return fileInstallProgressByFilename.value.get(getContentItemInstallFilename(item))
+}
+
+function fileInstallProgressToContentItem(
+ item: Archon.Websocket.v0.InstallProgressItem,
+ key: Archon.Websocket.v0.InstallProgressFileKey,
+): ContentItem {
+ const filename = key.filename
+ const extensionIndex = filename.lastIndexOf('.')
+ const title = extensionIndex > 0 ? filename.slice(0, extensionIndex) : filename
+ const projectType =
+ key.parent_directory === 'plugins'
+ ? 'plugin'
+ : key.parent_directory === 'datapacks'
+ ? 'datapack'
+ : 'mod'
+ return {
+ id: `installing:${item.id}`,
+ file_name: filename,
+ project: {
+ id: item.id,
+ slug: filename,
+ title,
+ },
+ version: {
+ id: item.id,
+ version_number: formatMessage(commonMessages.installingLabel),
+ file_name: filename,
+ },
+ enabled: true,
+ project_type: projectType,
+ has_update: false,
+ update_version_id: null,
+ installing: true,
+ installProgress: item.progress,
+ }
+}
+
const pendingServerContentInstalls = ref([])
+const isContentInstallActive = computed(
+ () => hasActiveFileInstallProgress.value || pendingServerContentInstalls.value.length > 0,
+)
const lastStableContentKeys = ref>(new Set())
const contentInstallBaselineKeys = ref | null>(null)
const contentInstallAddedKeys = ref>(new Set())
@@ -343,7 +447,19 @@ const { pause: pausePendingInstallPoll, resume: resumePendingInstallPoll } = use
)
function syncPendingServerContentInstalls() {
- pendingServerContentInstalls.value = readPendingServerContentInstalls(serverId, worldId.value)
+ const pendingInstalls = readPendingServerContentInstalls(serverId, worldId.value)
+ pendingServerContentInstalls.value = pendingInstalls
+
+ const completed = new Set(completedInstallFilenames.value)
+ let changed = false
+ for (const item of pendingInstalls) {
+ if (item.fileName) {
+ changed = completed.delete(normalizeInstallFilename(item.fileName)) || changed
+ }
+ }
+ if (changed) {
+ completedInstallFilenames.value = completed
+ }
}
function handlePendingServerContentInstallsChanged(event: Event) {
@@ -442,7 +558,7 @@ function syncContentInstallKeys(
addons: Archon.Content.v1.Addon[] = contentQuery.data.value?.addons ?? [],
) {
const currentKeys = getAddonInstallKeys(addons)
- if (isSyncingContent.value) {
+ if (isContentInstallActive.value) {
if (!contentInstallBaselineKeys.value) {
contentInstallBaselineKeys.value =
readPendingServerContentInstallBaseline(serverId, worldId.value) ??
@@ -571,12 +687,19 @@ const rawContentItems = computed(() => {
(addon.version?.id ? pendingInstallByVersionId.get(addon.version.id) : null) ??
pendingInstallByFileName.get(addon.filename) ??
null
- const installing = !!pendingItem || installingContentKeys.has(getAddonInstallKey(addon))
+ const installProgress = getContentItemInstallProgress(contentItem)
+ const installFilename = getContentItemInstallFilename(contentItem)
+ const installing =
+ installProgress != null
+ ? installProgress.error == null && installProgress.progress !== 100
+ : !completedInstallFilenames.value.has(installFilename) &&
+ (!!pendingItem || installingContentKeys.has(getAddonInstallKey(addon)))
if (!installing || !pendingItem) {
return {
...contentItem,
installing,
+ installProgress: installing ? installProgress?.progress : undefined,
}
}
@@ -602,10 +725,38 @@ const rawContentItems = computed(() => {
},
owner: pendingContentItem.owner ?? contentItem.owner,
installing,
+ installProgress: installProgress?.progress,
}
})
- return [...addonItems, ...pendingItems]
+ const pendingDisplayItems = pendingItems.map((item) => {
+ const installProgress = getContentItemInstallProgress(item)
+ const installing =
+ installProgress != null
+ ? installProgress.error == null && installProgress.progress !== 100
+ : !completedInstallFilenames.value.has(getContentItemInstallFilename(item))
+ return {
+ ...item,
+ installing,
+ installProgress: installing ? installProgress?.progress : undefined,
+ }
+ })
+ const displayedInstallFilenames = new Set(
+ [...addonItems, ...pendingDisplayItems].map(getContentItemInstallFilename),
+ )
+ const progressOnlyItems = currentWorldInstallProgressItems.value.flatMap((item) => {
+ if (
+ item.key.type !== 'file' ||
+ item.error != null ||
+ item.progress === 100 ||
+ displayedInstallFilenames.has(normalizeInstallFilename(item.key.filename))
+ ) {
+ return []
+ }
+ return [fileInstallProgressToContentItem(item, item.key)]
+ })
+
+ return [...addonItems, ...pendingDisplayItems, ...progressOnlyItems]
})
const displayedContentItems = ref([])
@@ -628,13 +779,31 @@ function getContentItemId(item: ContentItem) {
function mergeFragileContentItems(items: ContentItem[]) {
const nextItems = new Map(items.map((item) => [getContentItemDisplayKey(item), item]))
- const mergedItems = displayedContentItems.value.map((item) => {
- const key = getContentItemDisplayKey(item)
- const nextItem = nextItems.get(key)
- if (!nextItem) return item
+ const mergedItems = displayedContentItems.value.flatMap((item) => {
+ let nextKey = getContentItemDisplayKey(item)
+ let nextItem = nextItems.get(nextKey)
+ if (!nextItem && item.installing) {
+ const installFilename = getContentItemInstallFilename(item)
+ const matchingEntry = Array.from(nextItems.entries()).find(
+ ([, candidate]) => getContentItemInstallFilename(candidate) === installFilename,
+ )
+ if (matchingEntry) {
+ nextKey = matchingEntry[0]
+ nextItem = matchingEntry[1]
+ }
+ }
+ if (!nextItem) {
+ if (
+ item.installing &&
+ completedInstallFilenames.value.has(getContentItemInstallFilename(item))
+ ) {
+ return []
+ }
+ return [item]
+ }
- nextItems.delete(key)
- return nextItem
+ nextItems.delete(nextKey)
+ return [nextItem]
})
return [...mergedItems, ...nextItems.values()]
@@ -643,15 +812,13 @@ function mergeFragileContentItems(items: ContentItem[]) {
watch(
[
rawContentItems,
- isSyncingContent,
+ isContentInstallActive,
() => contentQuery.isFetching.value,
() => contentQuery.isLoading.value,
],
([items, syncing, isFetching, isLoading]) => {
if (syncing) {
- if (items.length > 0) {
- displayedContentItems.value = mergeFragileContentItems(items)
- }
+ displayedContentItems.value = mergeFragileContentItems(items)
return
}
@@ -663,7 +830,7 @@ watch(
)
watch(
- [isSyncingContent, () => contentQuery.data.value?.addons],
+ [isContentInstallActive, () => contentQuery.data.value?.addons],
([, addons]) => {
syncContentInstallKeys(addons ?? [])
},
@@ -693,6 +860,7 @@ watch(
watch(
worldId,
() => {
+ completedInstallFilenames.value = new Set()
syncPendingServerContentInstalls()
syncContentInstallKeys()
void flushStoredServerInstalls()
@@ -784,14 +952,14 @@ const toggleMutation = useMutation({
})
async function handleToggleEnabled(item: ContentItem) {
- if (setupActionDisabled.value) return
+ if (contentActionDisabled.value) return
const addon = addonLookup.value.get(item.file_name)
if (!addon) return
await toggleMutation.mutateAsync({ addon })
}
async function handleDeleteItem(item: ContentItem) {
- if (setupActionDisabled.value) return
+ if (contentActionDisabled.value) return
const addon = addonLookup.value.get(item.file_name)
if (!addon) return
await deleteMutation.mutateAsync({ addon })
@@ -799,6 +967,7 @@ async function handleDeleteItem(item: ContentItem) {
function itemsToAddonRequests(items: ContentItem[]): Archon.Content.v1.RemoveAddonRequest[] {
return items.flatMap((item) => {
+ if (item.installing) return []
const addon = addonLookup.value.get(item.file_name)
if (!addon) return []
return [{ filename: addon.filename, kind: addon.kind }]
@@ -806,7 +975,7 @@ function itemsToAddonRequests(items: ContentItem[]): Archon.Content.v1.RemoveAdd
}
async function handleBulkDelete(items: ContentItem[]) {
- if (setupActionDisabled.value) return
+ if (contentActionDisabled.value) return
const requests = itemsToAddonRequests(items)
if (requests.length === 0) return
try {
@@ -822,7 +991,7 @@ async function handleBulkDelete(items: ContentItem[]) {
}
async function handleBulkEnable(items: ContentItem[]) {
- if (setupActionDisabled.value) return
+ if (contentActionDisabled.value) return
const requests = itemsToAddonRequests(items)
if (requests.length === 0) return
try {
@@ -838,7 +1007,7 @@ async function handleBulkEnable(items: ContentItem[]) {
}
async function handleBulkDisable(items: ContentItem[]) {
- if (setupActionDisabled.value) return
+ if (contentActionDisabled.value) return
const requests = itemsToAddonRequests(items)
if (requests.length === 0) return
try {
@@ -907,7 +1076,7 @@ const currentLoader = computed(
)
function handleBrowseContent() {
- if (setupActionDisabled.value) return
+ if (contentActionDisabled.value) return
const contentType = type.value
if (browseServerContent && ['mod', 'plugin', 'datapack'].includes(contentType)) {
browseServerContent({
@@ -925,7 +1094,7 @@ function handleBrowseContent() {
}
function handleUploadFiles() {
- if (setupActionDisabled.value) return
+ if (contentActionDisabled.value) return
const input = document.createElement('input')
input.type = 'file'
input.multiple = true
@@ -1065,7 +1234,7 @@ async function handleViewModpackContent() {
}
async function handleModpackContentToggle(item: ContentItem) {
- if (setupActionDisabled.value) return
+ if (contentActionDisabled.value) return
const addon = addonLookup.value.get(item.file_name)
if (!addon) return
modpackContentModal.value?.updateItem(item.file_name, { disabled: true })
@@ -1096,7 +1265,7 @@ async function handleModpackContentToggle(item: ContentItem) {
}
async function handleModpackBulkToggle(items: ContentItem[], enable: boolean) {
- if (setupActionDisabled.value) return
+ if (contentActionDisabled.value) return
const requests = itemsToAddonRequests(items)
if (requests.length === 0) return
@@ -1163,9 +1332,9 @@ async function handleModpackUnlinkConfirm() {
}
async function handleBulkUpdate(items: ContentItem[]) {
- if (setupActionDisabled.value) return
+ if (contentActionDisabled.value) return
const addons = items
- .filter((item) => item.has_update)
+ .filter((item) => item.has_update && !item.installing)
.map((item) => ({
filename: item.file_name,
version_id: item.update_version_id ?? undefined,
@@ -1209,6 +1378,7 @@ async function handleSwitchVersion(item: ContentItem) {
}
async function handleModpackUpdate() {
+ if (setupActionDisabled.value) return
const mp = contentQuery.data.value?.modpack
if (!mp || mp.spec.platform !== 'modrinth') return
@@ -1263,8 +1433,8 @@ function resetUpdateState() {
}
function handleModalUpdate(selectedVersion: Labrinth.Versions.v2.Version, event?: MouseEvent) {
- if (setupActionDisabled.value) return
if (updatingModpack.value) {
+ if (setupActionDisabled.value) return
pendingModpackUpdateVersion.value = selectedVersion
const mpSpec = contentQuery.data.value?.modpack?.spec
@@ -1285,6 +1455,7 @@ function handleModalUpdate(selectedVersion: Labrinth.Versions.v2.Version, event?
return
}
+ if (contentActionDisabled.value) return
performUpdate(selectedVersion)
}
@@ -1301,7 +1472,11 @@ function setAddonInstalling(filename: string, installing: boolean) {
}
async function performUpdate(selectedVersion: Labrinth.Versions.v2.Version) {
- if (setupActionDisabled.value) return
+ if (
+ (updatingModpack.value && setupActionDisabled.value) ||
+ (!updatingModpack.value && contentActionDisabled.value)
+ )
+ return
const item = updatingProject.value
if (item) {
setAddonInstalling(item.file_name, true)
@@ -1380,8 +1555,8 @@ provideContentManager({
error: computed(() => contentQuery.error.value ?? null),
modpack,
isPackLocked: ref(false),
- isBusy: setupActionDisabled,
- busyMessage: setupActionBusyMessage,
+ isBusy: contentActionDisabled,
+ busyMessage: contentActionBusyMessage,
disableAddContent: computed(() => !canSetup.value),
disableAddContentTooltip: permissionDeniedMessage.value,
contentTypeLabel: type,
@@ -1453,8 +1628,8 @@ provideContentManager({
:modpack-name="modpack?.project.title"
:modpack-icon-url="modpack?.project.icon_url"
enable-toggle
- :action-disabled="setupActionDisabled"
- :action-disabled-tooltip="setupActionBusyMessage ?? undefined"
+ :action-disabled="contentActionDisabled"
+ :action-disabled-tooltip="contentActionBusyMessage ?? undefined"
@update:enabled="handleModpackContentToggle"
@bulk:enable="handleModpackBulkToggle($event, true)"
@bulk:disable="handleModpackBulkToggle($event, false)"
@@ -1485,8 +1660,10 @@ provideContentManager({
"
:loading="loadingVersions"
:loading-changelog="loadingChangelog"
- :action-disabled="setupActionDisabled"
- :action-disabled-tooltip="setupActionBusyMessage ?? undefined"
+ :action-disabled="updatingModpack ? setupActionDisabled : contentActionDisabled"
+ :action-disabled-tooltip="
+ (updatingModpack ? setupActionBusyMessage : contentActionBusyMessage) ?? undefined
+ "
@update="handleModalUpdate"
@cancel="resetUpdateState"
@version-select="handleVersionSelect"
diff --git a/packages/ui/src/layouts/wrapped/hosting/manage/root.vue b/packages/ui/src/layouts/wrapped/hosting/manage/root.vue
index c781570242..7a90fa36bf 100644
--- a/packages/ui/src/layouts/wrapped/hosting/manage/root.vue
+++ b/packages/ui/src/layouts/wrapped/hosting/manage/root.vue
@@ -173,7 +173,7 @@
-
+
-
+
@@ -245,96 +241,6 @@
:class="containedLayout ? 'flex min-h-0 flex-col overflow-hidden' : 'h-full'"
:style="{ '--si': 2 }"
>
-
-
-
-
-
-
-
-
- An invalid loader or Minecraft version was specified and could not be installed.
-
- -
- If this version of Minecraft was released recently, please check if Modrinth
- Hosting supports it.
-
- -
- If you've installed a modpack, it may have been packaged incorrectly or may
- not be compatible with the loader.
-
- -
- Your server may need to be reinstalled with a valid mod loader and version.
- You can change the loader by clicking the "Change Loader" button.
-
- -
- If you're stuck, please contact Modrinth Support with the information below:
-
-
-
-
-
-
-
- An internal error occurred while installing your server. Don't fret — try
- reinstalling your server, and if the problem persists, please contact Modrinth
- support with your server's debug information.
-
-
- An error occurred while installing your server because Modrinth Hosting does not
- support the version of Minecraft or the loader you specified. Try reinstalling
- your server with a different version or loader, and if the problem persists,
- please contact Modrinth Support with your server's debug information.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -402,10 +306,8 @@ import type { Archon, Labrinth } from '@modrinth/api-client'
import { getNodeWebSocketUrl, ModrinthApiError, NuxtModrinthClient } from '@modrinth/api-client'
import {
BoxesIcon,
- CheckIcon,
CopyIcon,
DatabaseBackupIcon,
- FileIcon,
FolderOpenIcon,
IssuesIcon,
LayoutTemplateIcon,
@@ -413,7 +315,6 @@ import {
LoaderCircleIcon,
LockIcon,
MoreVerticalIcon,
- RightArrowIcon,
ServerIcon as ServerAssetIcon,
SettingsIcon,
TimerIcon,
@@ -423,7 +324,7 @@ import {
XIcon,
} from '@modrinth/assets'
import { useQuery, useQueryClient } from '@tanstack/vue-query'
-import { useStorage, useTimeoutFn } from '@vueuse/core'
+import { useStorage } from '@vueuse/core'
import DOMPurify from 'dompurify'
import { Tooltip } from 'floating-vue'
import { computed, nextTick, onBeforeUnmount, onMounted, onUnmounted, ref, watch } from 'vue'
@@ -457,6 +358,10 @@ import {
} from '#ui/composables'
import { defineMessages, useVIntl } from '#ui/composables/i18n'
import { useServerBackupsQueue } from '#ui/composables/server-backups-queue'
+import type {
+ ServerInstallationKey,
+ ServerInstallationState,
+} from '#ui/composables/server-installation-tracker'
import { useServerManageCoreRuntime } from '#ui/composables/server-manage-core-runtime'
import { useServerPanelSync } from '#ui/composables/server-panel-sync'
import type { LogLine } from '#ui/layouts/shared/console'
@@ -469,11 +374,6 @@ import {
import type { ServerStats } from '#ui/providers/server-context'
import { commonMessages } from '#ui/utils/common-messages'
import { formatLoaderLabel } from '#ui/utils/loaders'
-import {
- pendingServerContentInstallsEvent,
- readPendingServerContentInstalls,
- writePendingServerContentInstalls,
-} from '#ui/utils/server-content-installing'
import ServerOnboardingPanelPage from './[id]/onboarding.vue'
@@ -574,12 +474,6 @@ const debug = useDebugLogger('ServerManage')
const isReconnecting = ref(false)
const isLoading = ref(true)
const isMounted = ref(true)
-const copied = ref(false)
-const installError = ref(null)
-const errorTitle = ref('Error')
-const errorMessage = ref('An unexpected error occurred.')
-const errorLog = ref('')
-const errorLogFile = ref('')
const isOnboarding = computed(() => serverData.value?.flows?.intro)
const SETTINGS_HINT_KEY = 'server-panel-settings-hint-dismissed'
@@ -649,101 +543,25 @@ const { image: serverImage } = useServerImage(
)
const { data: serverProject } = useServerProject(computed(() => serverData.value?.upstream ?? null))
-const syncProgress = ref(null)
-const contentError = ref(null)
-const syncProgressActive = ref(false)
-const hasPendingServerContentInstalls = ref(false)
-const hasSeenPendingServerContentSync = ref(false)
-const isAwaitingPostInstallRefresh = ref(false)
-const { start: startSyncHide, stop: cancelSyncHide } = useTimeoutFn(
- () => (syncProgressActive.value = false),
- 1000,
- { immediate: false },
-)
-
-watch(syncProgress, (progress) => {
- if (progress != null) {
- cancelSyncHide()
- syncProgressActive.value = true
- if (progress.phase !== 'Analyzing' && hasPendingServerContentInstalls.value) {
- hasSeenPendingServerContentSync.value = true
- }
- } else if (syncProgressActive.value) {
- startSyncHide()
- if (hasSeenPendingServerContentSync.value) {
- writePendingServerContentInstalls(props.serverId, worldId.value, [])
- hasSeenPendingServerContentSync.value = false
- }
- }
-})
-
-watch(contentError, (error) => {
- if (!error || !hasPendingServerContentInstalls.value) return
- writePendingServerContentInstalls(props.serverId, worldId.value, [])
- hasSeenPendingServerContentSync.value = false
-})
-
-const isSyncingContent = computed(
- () =>
- syncProgressActive.value ||
- isAwaitingPostInstallRefresh.value ||
- hasPendingServerContentInstalls.value,
-)
-
-function syncPendingServerContentInstalls() {
- hasPendingServerContentInstalls.value =
- readPendingServerContentInstalls(props.serverId, worldId.value).length > 0
-}
-
-function handlePendingServerContentInstallsChanged(event: Event) {
- const detail = (event as CustomEvent<{ serverId?: string | null; worldId?: string | null }>)
- .detail
- if (detail?.serverId !== props.serverId || detail?.worldId !== worldId.value) return
- syncPendingServerContentInstalls()
-}
-
-watch(worldId, syncPendingServerContentInstalls, { immediate: true })
-
-let hasSeenInstallProgress = false
-
const onStateEvent = (data: Archon.Websocket.v0.WSStateEvent) => {
debug('[root.vue] handleState received:', {
power_variant: data.power_variant,
- progress: data.progress,
serverStatus: serverData.value?.status,
})
hasReceivedWsData.value = true
- syncProgress.value = data.progress
- contentError.value = data.content_error
-
- if (serverData.value) {
- if (data.progress != null && serverData.value.status !== 'installing') {
- debug('[root.vue] handleState: progress != null, setting status to installing')
- hasSeenInstallProgress = true
- updateServerData({ status: 'installing' })
- } else if (data.progress != null) {
- hasSeenInstallProgress = true
- } else if (
- data.progress == null &&
- data.content_error == null &&
- serverData.value.status === 'installing' &&
- hasSeenInstallProgress
- ) {
- debug('[root.vue] handleState: progress null + was installing, applying optimistic update')
- hasSeenInstallProgress = false
- applyOptimisticCompletion()
- invalidateAfterInstall()
- }
- }
}
const {
+ beginInstallation,
cancelUpload,
+ cancelOptimisticInstallation,
cleanupCoreRuntime,
connectSocket,
cpuData,
+ dismissInstallation,
fsOps,
fsQueuedOps,
+ installation,
isConnected,
ramData,
serverPowerState,
@@ -755,7 +573,6 @@ const {
worldId,
server: serverData,
serverFull,
- isSyncingContent,
extraBusyReasons: backupsBusy,
setDisconnectedOnAuthIncorrect: false,
syncUptimeFromState: true,
@@ -1086,7 +903,7 @@ function loadTallyScript() {
document.head.appendChild(script)
}
-async function handleContentRetry() {
+async function handleInstallationRetry() {
if (!worldId.value) return
if (!canSetup.value) {
addNotification({
@@ -1095,9 +912,16 @@ async function handleContentRetry() {
})
return
}
+ const failedInstallationId =
+ installation.value?.status === 'failed' ? installation.value.id : null
+ if (failedInstallationId) dismissInstallation(failedInstallationId)
+ beginInstallation({ type: 'unknown' })
+ updateServerData({ status: 'installing' })
try {
await client.archon.content_v1.repair(props.serverId, worldId.value)
} catch (err) {
+ cancelOptimisticInstallation()
+ updateServerData({ status: 'available' })
addNotification({
type: 'error',
text: err instanceof Error ? err.message : 'Failed to retry installation',
@@ -1134,54 +958,56 @@ const handleNewMod = () => {
queryClient.invalidateQueries({ queryKey: ['content', 'list'] })
}
-const handleInstallationResult = async (data: Archon.Websocket.v0.WSInstallationResultEvent) => {
- debug('[root.vue] handleInstallationResult received:', data)
- switch (data.result) {
- case 'ok': {
- debug('[root.vue] handleInstallationResult: ok received')
- if (!serverData.value) break
+type InstallationServerSnapshot = Pick<
+ Archon.Servers.v0.Server,
+ 'loader' | 'loader_version' | 'mc_version'
+>
- applyOptimisticCompletion()
- installError.value = null
- invalidateAfterInstall()
+let installationServerSnapshot: InstallationServerSnapshot | null = null
- break
- }
- case 'err': {
- console.log('failed to install')
- console.log(data)
- errorTitle.value = 'Installation error'
- errorMessage.value = data.reason ?? 'Unknown error'
- installError.value = new Error(data.reason ?? 'Unknown error')
-
- try {
- let files = await client.kyros.files_v0.listDirectory('/', 1, 100)
- if (files && files.total > 1) {
- for (let i = 2; i <= files.total; i++) {
- const nextFiles = await client.kyros.files_v0.listDirectory('/', i, 100)
- if (nextFiles?.items?.length === 0) break
- if (nextFiles) files = nextFiles
- }
- }
- const fileName = files?.items?.find((file) =>
- file.name.startsWith('modrinth-installation'),
- )?.name
- errorLogFile.value = fileName ?? ''
- if (fileName) {
- const content = await client.kyros.files_v0.downloadFile(fileName)
- errorLog.value = await content.text()
- }
- } catch (err) {
- console.error('Failed to fetch installation log:', err)
- }
- break
+function applyInstallationTarget(current: ServerInstallationState) {
+ if (!serverData.value) return
+
+ if (!installationServerSnapshot) {
+ installationServerSnapshot = {
+ loader: serverData.value.loader,
+ loader_version: serverData.value.loader_version,
+ mc_version: serverData.value.mc_version,
}
}
+
+ const patch: Partial = { status: 'installing' }
+ if (current.key.type === 'platform') {
+ patch.loader = formatLoaderLabel(current.key.platform) as Archon.Servers.v0.Loader
+ patch.loader_version = current.key.platform === 'vanilla' ? null : current.key.platform_version
+ patch.mc_version = current.key.game_version
+ }
+
+ if (
+ serverData.value.status === patch.status &&
+ (current.key.type !== 'platform' ||
+ (serverData.value.loader === patch.loader &&
+ serverData.value.loader_version === patch.loader_version &&
+ serverData.value.mc_version === patch.mc_version))
+ ) {
+ return
+ }
+
+ void queryClient.cancelQueries({
+ queryKey: ['servers', 'detail', props.serverId],
+ exact: true,
+ })
+ updateServerData(patch)
}
-const newLoader = ref(null)
-const newLoaderVersion = ref(null)
-const newMCVersion = ref(null)
+function restoreInstallationServerSnapshot() {
+ const snapshot = installationServerSnapshot
+ updateServerData({
+ ...(snapshot ?? {}),
+ status: 'available',
+ })
+ installationServerSnapshot = null
+}
const onReinstall = async (
potentialArgs: { loader?: string; lVersion?: string; mVersion?: string } | undefined,
@@ -1195,70 +1021,63 @@ const onReinstall = async (
if (!serverData.value) return
- debug('[root.vue] onReinstall: setting serverData.status to installing')
- hasSeenInstallProgress = false
- updateServerData({ status: 'installing' })
-
- if (potentialArgs?.loader) {
- newLoader.value = potentialArgs.loader
- }
- if (potentialArgs?.lVersion) {
- newLoaderVersion.value = potentialArgs.lVersion
- }
- if (potentialArgs?.mVersion) {
- newMCVersion.value = potentialArgs.mVersion
+ if (
+ !installation.value ||
+ installation.value.status === 'complete' ||
+ installation.value.status === 'failed'
+ ) {
+ if (potentialArgs?.loader && potentialArgs.mVersion) {
+ beginInstallation({
+ type: 'platform',
+ platform: potentialArgs.loader as Extract<
+ Archon.Websocket.v0.InstallProgressKey,
+ { type: 'platform' }
+ >['platform'],
+ platform_version: potentialArgs.lVersion ?? '',
+ game_version: potentialArgs.mVersion,
+ })
+ } else {
+ beginInstallation({ type: 'unknown' })
+ }
}
- installError.value = null
- errorTitle.value = 'Error'
- errorMessage.value = 'An unexpected error occurred.'
-
modrinthServersConsole.clear()
-
- debug('[root.vue] onReinstall: triggering immediate invalidation')
- queryClient.invalidateQueries({ queryKey: ['servers', 'detail', props.serverId] })
- queryClient.invalidateQueries({ queryKey: ['content', 'list'] })
}
const onReinstallFailed = () => {
debug('[root.vue] onReinstallFailed: reverting status to available')
- updateServerData({ status: 'available' })
- newLoader.value = null
- newLoaderVersion.value = null
- newMCVersion.value = null
+ cancelOptimisticInstallation()
+ restoreInstallationServerSnapshot()
}
-function applyOptimisticCompletion() {
+function applyInstallationCompletion(key: ServerInstallationKey) {
+ const platformKey = key?.type === 'platform' ? key : null
const patch: Partial = { status: 'available' }
- if (newLoader.value) patch.loader = formatLoaderLabel(newLoader.value) as Archon.Servers.v0.Loader
- if (newLoaderVersion.value) patch.loader_version = newLoaderVersion.value
- if (newMCVersion.value) patch.mc_version = newMCVersion.value
+ if (platformKey) {
+ patch.loader = formatLoaderLabel(platformKey.platform) as Archon.Servers.v0.Loader
+ patch.loader_version = platformKey.platform === 'vanilla' ? null : platformKey.platform_version
+ patch.mc_version = platformKey.game_version
+ }
- debug('[root.vue] applyOptimisticCompletion: patch:', patch)
+ debug('[root.vue] applyInstallationCompletion: patch:', patch)
updateServerData(patch)
const addonsQueries = queryClient.getQueriesData({
queryKey: ['content', 'list', 'v1', props.serverId],
})
for (const [key, data] of addonsQueries) {
- if (!data) continue
- const addonsPatch: Record = {}
- if (newLoader.value) addonsPatch.modloader = newLoader.value
- if (newLoaderVersion.value) addonsPatch.modloader_version = newLoaderVersion.value
- if (newMCVersion.value) addonsPatch.game_version = newMCVersion.value
- if (Object.keys(addonsPatch).length > 0) {
- queryClient.setQueryData(key, { ...data, ...addonsPatch })
- }
+ if (!data || !platformKey) continue
+ queryClient.setQueryData(key, {
+ ...data,
+ modloader: platformKey.platform === 'neoforge' ? 'neo_forge' : platformKey.platform,
+ modloader_version: platformKey.platform === 'vanilla' ? null : platformKey.platform_version,
+ game_version: platformKey.game_version,
+ })
}
-
- newLoader.value = null
- newLoaderVersion.value = null
- newMCVersion.value = null
}
async function invalidateAfterInstall() {
debug('[root.vue] invalidateAfterInstall: scheduling 2s delayed invalidation')
- isAwaitingPostInstallRefresh.value = true
setTimeout(async () => {
try {
await Promise.all([
@@ -1270,12 +1089,47 @@ async function invalidateAfterInstall() {
])
} catch (err: unknown) {
console.error('Error refreshing data after installation:', err)
- } finally {
- isAwaitingPostInstallRefresh.value = false
}
}, 2000)
}
+let handledFailedInstallationId: string | null = null
+watch(
+ installation,
+ (current, previous) => {
+ if (!current) {
+ if (
+ isMounted.value &&
+ previous?.source === 'optimistic' &&
+ previous.status === 'pending' &&
+ serverData.value?.status === 'installing'
+ ) {
+ restoreInstallationServerSnapshot()
+ }
+ return
+ }
+ if (current.status === 'pending' || current.status === 'installing') {
+ handledFailedInstallationId = null
+ applyInstallationTarget(current)
+ return
+ }
+
+ if (current.status === 'failed') {
+ if (handledFailedInstallationId === current.id) return
+ handledFailedInstallationId = current.id
+ onReinstallFailed()
+ void invalidateAfterInstall()
+ return
+ }
+
+ applyInstallationCompletion(current.key)
+ installationServerSnapshot = null
+ dismissInstallation(current.id)
+ void invalidateAfterInstall()
+ },
+ { flush: 'sync' },
+)
+
const nodeAccessible = ref(true)
const nodeUnavailableDetails = computed(() => [
@@ -1371,21 +1225,6 @@ const nodeUnavailableAction = computed(() => ({
disabled: false,
}))
-const copyServerDebugInfo = () => {
- const debugInfo = `Server ID: ${serverData.value?.server_id}\nError: ${errorMessage.value}\nKind: ${serverData.value?.upstream?.kind}\nProject ID: ${serverData.value?.upstream?.project_id}\nVersion ID: ${serverData.value?.upstream?.version_id}\nLog: ${errorLog.value}`
- navigator.clipboard.writeText(debugInfo)
- copied.value = true
- setTimeout(() => {
- copied.value = false
- }, 5000)
-}
-
-const openInstallLog = () => {
- const url = `/hosting/manage/${props.serverId}/files?editing=${encodeURIComponent(errorLogFile.value)}`
- window.history.pushState({}, '', url)
- window.dispatchEvent(new PopStateEvent('popstate'))
-}
-
function openServerSettingsModal(tabId?: ServerSettingsTabId) {
if (!props.serverId) return
serverSettingsModal.value?.show({ serverId: props.serverId, tabId })
@@ -1500,7 +1339,6 @@ function initializeServer() {
} else {
void connectSocket(props.serverId, {
extraSubscriptions: (targetServerId) => [
- client.archon.sockets.on(targetServerId, 'installation-result', handleInstallationResult),
client.archon.sockets.on(targetServerId, 'backup-progress', handleBackupProgress),
client.archon.sockets.on(targetServerId, 'filesystem-ops', handleFilesystemOps),
client.archon.sockets.on(targetServerId, 'new-mod', handleNewMod),
@@ -1540,11 +1378,6 @@ const cleanup = () => {
onMounted(() => {
isMounted.value = true
- syncPendingServerContentInstalls()
- window.addEventListener(
- pendingServerContentInstallsEvent,
- handlePendingServerContentInstallsChanged,
- )
if (serverData.value) {
initializeServer()
@@ -1586,10 +1419,6 @@ onMounted(() => {
})
onUnmounted(() => {
- window.removeEventListener(
- pendingServerContentInstallsEvent,
- handlePendingServerContentInstallsChanged,
- )
cleanup()
})
diff --git a/packages/ui/src/locales/cs-CZ/index.json b/packages/ui/src/locales/cs-CZ/index.json
index e209b51e31..5871882eef 100644
--- a/packages/ui/src/locales/cs-CZ/index.json
+++ b/packages/ui/src/locales/cs-CZ/index.json
@@ -3686,36 +3686,9 @@
"servers.grant-access-modal.target.searching": {
"defaultMessage": "Vyhledávání..."
},
- "servers.installing-banner.error.unsupported-loader-version": {
- "defaultMessage": "Modrinth Hosting tuto verzi Minecraftu nebo loaderu zatím nepodporuje."
- },
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "Instalování addonů..."
- },
- "servers.installing-banner.phase.installing-modpack": {
- "defaultMessage": "Instalování modpacku..."
- },
- "servers.installing-banner.phase.installing-platform": {
- "defaultMessage": "Instalování platformy..."
- },
"servers.installing-banner.preparing.header": {
"defaultMessage": "Připravujeme váš server"
},
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "Přidávání Javy..."
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "Konfigurování serveru..."
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "Stahování módů..."
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "Organizování souborů..."
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "Nastavování prostředí..."
- },
"servers.list-empty.already-have-server-label": {
"defaultMessage": "Už máte server?"
},
@@ -4560,4 +4533,3 @@
"defaultMessage": "Typ"
}
}
-
diff --git a/packages/ui/src/locales/de-CH/index.json b/packages/ui/src/locales/de-CH/index.json
index 0d5aef6335..1e36be39b6 100644
--- a/packages/ui/src/locales/de-CH/index.json
+++ b/packages/ui/src/locales/de-CH/index.json
@@ -4448,9 +4448,6 @@
"servers.busy.installing": {
"defaultMessage": "Server wird installiert"
},
- "servers.busy.syncing-content": {
- "defaultMessage": "Inhalt wird synchronisiert"
- },
"servers.grant-access-modal.add-as-friend": {
"defaultMessage": "Auch eine Freundschaftsanfrage senden"
},
@@ -4505,51 +4502,12 @@
"servers.installing-banner.error.header": {
"defaultMessage": "Installation fehlgeschlagen"
},
- "servers.installing-banner.error.internal-platform": {
- "defaultMessage": "Ein interner Fehler ist beim Installieren der Platform aufgetreten. Bitte versuch es später erneut."
- },
- "servers.installing-banner.error.invalid-loader-version": {
- "defaultMessage": "Der angegebene Loader oder Minecraft Version konnte nicht installiert werden. Sie ist womöglich ungültig oder nicht unterstützt."
- },
- "servers.installing-banner.error.modpack-install-failed": {
- "defaultMessage": "Das Modpack konnte nicht installiert werden. Es könnte womöglich beschädigt oder inkompatibel sein."
- },
- "servers.installing-banner.error.no-primary-file": {
- "defaultMessage": "Diese Modpack-Version enthält keine hrunterladbare Datei. Es wurde womöglich inkorrekt erstellt."
- },
"servers.installing-banner.error.unknown": {
"defaultMessage": "Ein unerwarteter Fehler ist während der Installation aufgetreten."
},
- "servers.installing-banner.error.unsupported-loader-version": {
- "defaultMessage": "Diese Version von Minecraft oder des Loaders werden aktuell noch nicht von Modrinth Hosting unterstützt."
- },
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "Installiere Addons..."
- },
- "servers.installing-banner.phase.installing-modpack": {
- "defaultMessage": "Installiere Modpack..."
- },
- "servers.installing-banner.phase.installing-platform": {
- "defaultMessage": "Installiere Platform..."
- },
"servers.installing-banner.preparing.header": {
"defaultMessage": "Wir bereiten deinen Server vor"
},
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "Füge Java hinzu..."
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "Konfiguriere Server..."
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "Lade Mods herunter..."
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "Organisiere Dateien..."
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "Richte die Umgebung ein..."
- },
"servers.list-empty.already-have-server-label": {
"defaultMessage": "Du hast bereits einen Server?"
},
@@ -5940,4 +5898,3 @@
"defaultMessage": "Typ"
}
}
-
diff --git a/packages/ui/src/locales/de-DE/index.json b/packages/ui/src/locales/de-DE/index.json
index e7ffbf7e4f..72bda22860 100644
--- a/packages/ui/src/locales/de-DE/index.json
+++ b/packages/ui/src/locales/de-DE/index.json
@@ -4448,9 +4448,6 @@
"servers.busy.installing": {
"defaultMessage": "Server wird installiert"
},
- "servers.busy.syncing-content": {
- "defaultMessage": "Inhalt wird synchronisiert"
- },
"servers.grant-access-modal.add-as-friend": {
"defaultMessage": "Auch eine Freundschaftsanfrage senden"
},
@@ -4505,51 +4502,12 @@
"servers.installing-banner.error.header": {
"defaultMessage": "Installation fehlgeschlagen"
},
- "servers.installing-banner.error.internal-platform": {
- "defaultMessage": "Während der Installation der Plattform ist ein interner Fehler aufgetreten. Bitte versuche es erneut."
- },
- "servers.installing-banner.error.invalid-loader-version": {
- "defaultMessage": "Die angegebene Loader- oder Minecraft-Version konnte nicht installiert werden. Sie ist möglicherweise ungültig oder wird nicht unterstützt."
- },
- "servers.installing-banner.error.modpack-install-failed": {
- "defaultMessage": "Das Modpack konnte nicht installiert werden. Es ist eventuell beschädigt oder nicht kompatibel."
- },
- "servers.installing-banner.error.no-primary-file": {
- "defaultMessage": "Diese Modpack-Version enthält keine herunterladbare Datei. Es wurde eventuell falsch gepackt."
- },
"servers.installing-banner.error.unknown": {
"defaultMessage": "Während der Installation ist ein unerwarteter Fehler aufgetreten."
},
- "servers.installing-banner.error.unsupported-loader-version": {
- "defaultMessage": "Diese Version von Minecraft oder des Loaders wird aktuell noch nicht von Modrinth Hosting unterstützt."
- },
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "Addons werden installiert..."
- },
- "servers.installing-banner.phase.installing-modpack": {
- "defaultMessage": "Modpack wird installiert..."
- },
- "servers.installing-banner.phase.installing-platform": {
- "defaultMessage": "Plattform wird installiert..."
- },
"servers.installing-banner.preparing.header": {
"defaultMessage": "Wir bereiten deinen Server vor"
},
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "Java wird hinzugefügt..."
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "Server wird konfiguriert..."
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "Mods werden heruntergeladen..."
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "Dateien werden organisiert..."
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "Umgebung wird eingerichtet..."
- },
"servers.list-empty.already-have-server-label": {
"defaultMessage": "Du hast bereits einen Server?"
},
@@ -5940,4 +5898,3 @@
"defaultMessage": "Typ"
}
}
-
diff --git a/packages/ui/src/locales/en-US/index.json b/packages/ui/src/locales/en-US/index.json
index e4534c0512..b414575e09 100644
--- a/packages/ui/src/locales/en-US/index.json
+++ b/packages/ui/src/locales/en-US/index.json
@@ -4448,9 +4448,6 @@
"servers.busy.installing": {
"defaultMessage": "Server is installing"
},
- "servers.busy.syncing-content": {
- "defaultMessage": "Content sync in progress"
- },
"servers.grant-access-modal.add-as-friend": {
"defaultMessage": "Also send a friend request"
},
@@ -4502,53 +4499,41 @@
"servers.grant-access-modal.target.searching": {
"defaultMessage": "Searching..."
},
- "servers.installing-banner.error.header": {
- "defaultMessage": "Installation failed"
+ "servers.installing-banner.description.applying": {
+ "defaultMessage": "Applying your installation changes..."
},
- "servers.installing-banner.error.internal-platform": {
- "defaultMessage": "An internal error occurred while installing the platform. Please try again."
+ "servers.installing-banner.description.controls": {
+ "defaultMessage": "Server controls will unlock when installation finishes."
},
- "servers.installing-banner.error.invalid-loader-version": {
- "defaultMessage": "The specified loader or Minecraft version could not be installed. It may be invalid or unsupported."
+ "servers.installing-banner.description.duration": {
+ "defaultMessage": "This installation may take several minutes..."
},
- "servers.installing-banner.error.modpack-install-failed": {
- "defaultMessage": "The modpack could not be installed. It may be corrupted or incompatible."
+ "servers.installing-banner.description.preparing": {
+ "defaultMessage": "Preparing your server..."
},
- "servers.installing-banner.error.no-primary-file": {
- "defaultMessage": "This modpack version does not include a downloadable file. It may have been packaged incorrectly."
+ "servers.installing-banner.description.still-working": {
+ "defaultMessage": "Still working—your installation is in progress..."
+ },
+ "servers.installing-banner.error.header": {
+ "defaultMessage": "Installation failed"
},
"servers.installing-banner.error.unknown": {
"defaultMessage": "An unexpected error occurred during installation."
},
- "servers.installing-banner.error.unsupported-loader-version": {
- "defaultMessage": "This version of Minecraft or loader is not yet supported by Modrinth Hosting."
+ "servers.installing-banner.installing-local-modpack": {
+ "defaultMessage": "Installing {filename}"
},
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "Installing addons..."
+ "servers.installing-banner.installing-minecraft": {
+ "defaultMessage": "Installing Minecraft {version}"
},
- "servers.installing-banner.phase.installing-modpack": {
- "defaultMessage": "Installing modpack..."
+ "servers.installing-banner.installing-modpack": {
+ "defaultMessage": "Installing modpack"
},
- "servers.installing-banner.phase.installing-platform": {
- "defaultMessage": "Installing platform..."
+ "servers.installing-banner.installing-platform": {
+ "defaultMessage": "Installing {loader} for Minecraft {version}"
},
"servers.installing-banner.preparing.header": {
- "defaultMessage": "We're preparing your server"
- },
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "Adding Java..."
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "Configuring server..."
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "Downloading mods..."
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "Organizing files..."
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "Setting up environment..."
+ "defaultMessage": "Preparing your server"
},
"servers.list-empty.already-have-server-label": {
"defaultMessage": "Already have a server?"
diff --git a/packages/ui/src/locales/es-419/index.json b/packages/ui/src/locales/es-419/index.json
index 132946d97f..764a5a6017 100644
--- a/packages/ui/src/locales/es-419/index.json
+++ b/packages/ui/src/locales/es-419/index.json
@@ -4370,9 +4370,6 @@
"servers.busy.installing": {
"defaultMessage": "El servidor se está instalando"
},
- "servers.busy.syncing-content": {
- "defaultMessage": "Sincronización de contenido en curso"
- },
"servers.grant-access-modal.add-as-friend": {
"defaultMessage": "Mandar solicitud de amistad también"
},
@@ -4427,51 +4424,12 @@
"servers.installing-banner.error.header": {
"defaultMessage": "Fallo en la instalación"
},
- "servers.installing-banner.error.internal-platform": {
- "defaultMessage": "Se ha producido un error interno durante la instalación de la plataforma. Por favor, inténtalo de nuevo."
- },
- "servers.installing-banner.error.invalid-loader-version": {
- "defaultMessage": "No se pudo instalar el loader o la versión de Minecraft especificados. Es posible que no sean válidos o que no sean compatibles."
- },
- "servers.installing-banner.error.modpack-install-failed": {
- "defaultMessage": "No se pudo instalar el modpack. Es posible que esté dañado o que no sea compatible."
- },
- "servers.installing-banner.error.no-primary-file": {
- "defaultMessage": "Esta versión del modpack no incluye ningún archivo descargable. Es posible que se haya empaquetado incorrectamente."
- },
"servers.installing-banner.error.unknown": {
"defaultMessage": "Se produjo un error inesperado durante la instalación."
},
- "servers.installing-banner.error.unsupported-loader-version": {
- "defaultMessage": "Esta versión de Minecraft o del loader aún no es compatible con Modrinth Hosting."
- },
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "Instalando addons..."
- },
- "servers.installing-banner.phase.installing-modpack": {
- "defaultMessage": "Instalando modpack..."
- },
- "servers.installing-banner.phase.installing-platform": {
- "defaultMessage": "Instalando plataforma..."
- },
"servers.installing-banner.preparing.header": {
"defaultMessage": "Estamos preparando tu servidor"
},
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "Añadiendo java..."
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "Configurando servidor..."
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "Descargando mods..."
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "Organizando archivos..."
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "Preparando entorno..."
- },
"servers.list-empty.already-have-server-label": {
"defaultMessage": "¿Ya tienes un servidor?"
},
@@ -5787,4 +5745,3 @@
"defaultMessage": "Tipo"
}
}
-
diff --git a/packages/ui/src/locales/es-ES/index.json b/packages/ui/src/locales/es-ES/index.json
index 0470f583c1..430eae31e5 100644
--- a/packages/ui/src/locales/es-ES/index.json
+++ b/packages/ui/src/locales/es-ES/index.json
@@ -4274,9 +4274,6 @@
"servers.busy.installing": {
"defaultMessage": "El servidor se está instalando"
},
- "servers.busy.syncing-content": {
- "defaultMessage": "Sincronización de contenido en progreso"
- },
"servers.grant-access-modal.add-as-friend": {
"defaultMessage": "Enviar también una solicitud de amistad"
},
@@ -4331,51 +4328,12 @@
"servers.installing-banner.error.header": {
"defaultMessage": "Instalación fallida"
},
- "servers.installing-banner.error.internal-platform": {
- "defaultMessage": "Se ha producido un error interno durante la instalación de la plataforma. Por favor, inténtalo de nuevo."
- },
- "servers.installing-banner.error.invalid-loader-version": {
- "defaultMessage": "No se pudo instalar el loader o la versión de Minecraft especificados. Es posible que no sean válidos o que no sean compatibles."
- },
- "servers.installing-banner.error.modpack-install-failed": {
- "defaultMessage": "No se pudo instalar el modpack. Es posible que esté dañado o que no sea compatible."
- },
- "servers.installing-banner.error.no-primary-file": {
- "defaultMessage": "Esta versión del modpack no incluye ningún archivo descargable. Es posible que se haya empaquetado incorrectamente."
- },
"servers.installing-banner.error.unknown": {
"defaultMessage": "Se produjo un error inesperado durante la instalación."
},
- "servers.installing-banner.error.unsupported-loader-version": {
- "defaultMessage": "Esta versión de Minecraft o del loader aún no es compatible con Modrinth Hosting."
- },
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "Instalando addons..."
- },
- "servers.installing-banner.phase.installing-modpack": {
- "defaultMessage": "Instalando modpack..."
- },
- "servers.installing-banner.phase.installing-platform": {
- "defaultMessage": "Instalando plataforma..."
- },
"servers.installing-banner.preparing.header": {
"defaultMessage": "Estamos preparando tu servidor"
},
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "Añadiendo Java..."
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "Configurando servidor..."
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "Descargando mods..."
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "Organizando archivos..."
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "Preparando entorno..."
- },
"servers.list-empty.already-have-server-label": {
"defaultMessage": "¿Ya tienes un servidor?"
},
diff --git a/packages/ui/src/locales/fr-FR/index.json b/packages/ui/src/locales/fr-FR/index.json
index 0bad1abb39..27a9db5500 100644
--- a/packages/ui/src/locales/fr-FR/index.json
+++ b/packages/ui/src/locales/fr-FR/index.json
@@ -4442,9 +4442,6 @@
"servers.busy.installing": {
"defaultMessage": "Le serveur est en cours d'installation"
},
- "servers.busy.syncing-content": {
- "defaultMessage": "Synchronisation du contenu en cours"
- },
"servers.grant-access-modal.add-as-friend": {
"defaultMessage": "Envoyer également une demande d'ami"
},
@@ -4499,51 +4496,12 @@
"servers.installing-banner.error.header": {
"defaultMessage": "Impossible d'installer"
},
- "servers.installing-banner.error.internal-platform": {
- "defaultMessage": "Une erreur interne est survenue lors de l'installation de la platforme. Veuillez réessayer plus tard."
- },
- "servers.installing-banner.error.invalid-loader-version": {
- "defaultMessage": "Le loader ou la version Minecraft spécifiée n'a pas pu être installée. Elle est peut-être invalide ou non prise en charge."
- },
- "servers.installing-banner.error.modpack-install-failed": {
- "defaultMessage": "Le modpack n'a pas pu être installé. Il est peut-être corrompu ou incompatible."
- },
- "servers.installing-banner.error.no-primary-file": {
- "defaultMessage": "Cette version de modpack ne contient pas de fichier téléchargeable. Il a peut-être été empaqueté incorrectement."
- },
"servers.installing-banner.error.unknown": {
"defaultMessage": "Une erreur inattendue est survenue lors de l'installation."
},
- "servers.installing-banner.error.unsupported-loader-version": {
- "defaultMessage": "Cette version de Minecraft ou ce loader n'est peut-être pas encore bien pris en charge par Modrinth Hosting."
- },
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "Installation des add-ons..."
- },
- "servers.installing-banner.phase.installing-modpack": {
- "defaultMessage": "Installation du modpack..."
- },
- "servers.installing-banner.phase.installing-platform": {
- "defaultMessage": "Installation de la platforme..."
- },
"servers.installing-banner.preparing.header": {
"defaultMessage": "Nous préparons votre serveur"
},
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "Ajout de Java..."
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "Configuration du serveur..."
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "Téléchargement de mods..."
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "Organisation des fichiers..."
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "Mise en place de l'environnement..."
- },
"servers.list-empty.already-have-server-label": {
"defaultMessage": "Vous avez déjà un serveur ?"
},
diff --git a/packages/ui/src/locales/hu-HU/index.json b/packages/ui/src/locales/hu-HU/index.json
index 7255e0b37c..ffd805a2fb 100644
--- a/packages/ui/src/locales/hu-HU/index.json
+++ b/packages/ui/src/locales/hu-HU/index.json
@@ -3737,39 +3737,9 @@
"servers.installing-banner.error.header": {
"defaultMessage": "A telepítés nem sikerült"
},
- "servers.installing-banner.error.internal-platform": {
- "defaultMessage": "Egy internal hiba történt a telepítés közben. Kérlek probáld újra."
- },
- "servers.installing-banner.error.no-primary-file": {
- "defaultMessage": "Ez a modcsomag-verzió nem tartalmaz letölthető fájlt. Lehet, hogy hibásan lett összeállítva."
- },
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "Kiegészítők telepítése..."
- },
- "servers.installing-banner.phase.installing-modpack": {
- "defaultMessage": "A modcsomag telepítése..."
- },
- "servers.installing-banner.phase.installing-platform": {
- "defaultMessage": "A platform telepítése..."
- },
"servers.installing-banner.preparing.header": {
"defaultMessage": "Előkészítjük a szervered"
},
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "Java hozzáadása..."
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "A szerver beállítása..."
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "Modok letöltése..."
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "Fájlok rendezése..."
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "Környezet beállítása..."
- },
"servers.list-empty.already-have-server-label": {
"defaultMessage": "Már van egy szervered?"
},
diff --git a/packages/ui/src/locales/it-IT/index.json b/packages/ui/src/locales/it-IT/index.json
index 7b7875e848..a0c012a4e5 100644
--- a/packages/ui/src/locales/it-IT/index.json
+++ b/packages/ui/src/locales/it-IT/index.json
@@ -4406,9 +4406,6 @@
"servers.busy.installing": {
"defaultMessage": "Installazione del server in corso"
},
- "servers.busy.syncing-content": {
- "defaultMessage": "Sincronizzazione dei contenuti in corso"
- },
"servers.grant-access-modal.add-as-friend": {
"defaultMessage": "Invia anche una richiesta di amicizia"
},
@@ -4463,51 +4460,12 @@
"servers.installing-banner.error.header": {
"defaultMessage": "Installazione fallita"
},
- "servers.installing-banner.error.internal-platform": {
- "defaultMessage": "Si è verificato un errore nell'installazione della piattaforma. Riprova più tardi."
- },
- "servers.installing-banner.error.invalid-loader-version": {
- "defaultMessage": "Questa versione di Minecraft o del loader non è potuta essere installata. Potrebbe essere non valida o non supportata."
- },
- "servers.installing-banner.error.modpack-install-failed": {
- "defaultMessage": "Questo pacchetto non è potuto essere installato. Potrebbe essere corrotto o incompatibile."
- },
- "servers.installing-banner.error.no-primary-file": {
- "defaultMessage": "Questa versione del pacchetto non include un file scaricabile. Potrebbe essere stata malformata."
- },
"servers.installing-banner.error.unknown": {
"defaultMessage": "Si è verificato un errore durante l'installazione."
},
- "servers.installing-banner.error.unsupported-loader-version": {
- "defaultMessage": "Questa versione di Minecraft o del loader non è ancora supportata da Modrinth Hosting."
- },
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "Installando gli addon..."
- },
- "servers.installing-banner.phase.installing-modpack": {
- "defaultMessage": "Installando il pacchetto..."
- },
- "servers.installing-banner.phase.installing-platform": {
- "defaultMessage": "Installando la piattaforma..."
- },
"servers.installing-banner.preparing.header": {
"defaultMessage": "Stiamo preparando il tuo server"
},
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "Aggiungendo Java..."
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "Configurando il server..."
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "Scaricando le mod..."
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "Organizzando i file..."
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "Configurando l'ambiente..."
- },
"servers.list-empty.already-have-server-label": {
"defaultMessage": "Hai già un server?"
},
diff --git a/packages/ui/src/locales/ja-JP/index.json b/packages/ui/src/locales/ja-JP/index.json
index f8b54f21a3..9a0841f070 100644
--- a/packages/ui/src/locales/ja-JP/index.json
+++ b/packages/ui/src/locales/ja-JP/index.json
@@ -4088,9 +4088,6 @@
"servers.busy.installing": {
"defaultMessage": "サーバーがインストール中です"
},
- "servers.busy.syncing-content": {
- "defaultMessage": "コンテンツの同期処理中です"
- },
"servers.grant-access-modal.add-as-friend": {
"defaultMessage": "フレンドのリクエストも送信する"
},
@@ -4145,51 +4142,12 @@
"servers.installing-banner.error.header": {
"defaultMessage": "インストールが失敗しました"
},
- "servers.installing-banner.error.internal-platform": {
- "defaultMessage": "プラットフォームのインストール中、内部エラーが発生しました。もう一度お試しください。"
- },
- "servers.installing-banner.error.invalid-loader-version": {
- "defaultMessage": "特定のModローダーMinecraftのバージョンをインストールできませんでした。いずれかが非対応または無効である可能性があります。"
- },
- "servers.installing-banner.error.modpack-install-failed": {
- "defaultMessage": "このModパックをインストールすることができませんでした。Modが非対応または破損している可能性があります。"
- },
- "servers.installing-banner.error.no-primary-file": {
- "defaultMessage": "このModパックのバージョンには、ダウンロード可能なファイルが含まれていません。パッケージ化が正しく行われていない可能性があります。"
- },
"servers.installing-banner.error.unknown": {
"defaultMessage": "インストール中に予期せぬエラーが発生しました。"
},
- "servers.installing-banner.error.unsupported-loader-version": {
- "defaultMessage": "このMinecraftのバージョンまたはModローダーはModrinthホスティングでまだ対応されていません。"
- },
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "アドオンをインストールしています…"
- },
- "servers.installing-banner.phase.installing-modpack": {
- "defaultMessage": "Modパックをインストールしています…"
- },
- "servers.installing-banner.phase.installing-platform": {
- "defaultMessage": "プラットフォームをインストールしています…"
- },
"servers.installing-banner.preparing.header": {
"defaultMessage": "あなたのサーバーを準備しています"
},
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "Javaを追加しています…"
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "サーバーの設定をしています…"
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "Modをダウンロードしています…"
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "ファイルを整理しています…"
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "環境を整えています…"
- },
"servers.list-empty.already-have-server-label": {
"defaultMessage": "既にサーバーをお持ちですか?"
},
diff --git a/packages/ui/src/locales/ko-KR/index.json b/packages/ui/src/locales/ko-KR/index.json
index bb9074a14d..bc5c7b9cd8 100644
--- a/packages/ui/src/locales/ko-KR/index.json
+++ b/packages/ui/src/locales/ko-KR/index.json
@@ -4385,9 +4385,6 @@
"servers.busy.installing": {
"defaultMessage": "서버 설치 중"
},
- "servers.busy.syncing-content": {
- "defaultMessage": "콘텐츠 동기화 진행 중"
- },
"servers.grant-access-modal.add-as-friend": {
"defaultMessage": "친구 요청도 보내기"
},
@@ -4442,51 +4439,12 @@
"servers.installing-banner.error.header": {
"defaultMessage": "설치 실패"
},
- "servers.installing-banner.error.internal-platform": {
- "defaultMessage": "플랫폼 설치 중 내부 오류가 발생했습니다. 다시 시도해 주세요."
- },
- "servers.installing-banner.error.invalid-loader-version": {
- "defaultMessage": "지정한 로더 또는 마인크래프트 버전을 설치할 수 없습니다. 유효하지 않거나 지원되지 않는 것일 수 있습니다."
- },
- "servers.installing-banner.error.modpack-install-failed": {
- "defaultMessage": "모드팩을 설치할 수 없습니다. 파일이 손상되었거나 호환되지 않을 수 있습니다."
- },
- "servers.installing-banner.error.no-primary-file": {
- "defaultMessage": "이 모드팩 버전은 다운로드 가능한 파일을 포함되어 있지 않습니다. 패키징이 잘못되었을 수 있습니다."
- },
"servers.installing-banner.error.unknown": {
"defaultMessage": "설치 중 알 수 없는 오류가 발생했습니다."
},
- "servers.installing-banner.error.unsupported-loader-version": {
- "defaultMessage": "이 미인크래프트 또는 로더 버전은 아직 Modrinth Hosting에서 지원되지 않습니다."
- },
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "애드온 설치 중..."
- },
- "servers.installing-banner.phase.installing-modpack": {
- "defaultMessage": "모드팩 설치 중..."
- },
- "servers.installing-banner.phase.installing-platform": {
- "defaultMessage": "플랫폼 설치 중..."
- },
"servers.installing-banner.preparing.header": {
"defaultMessage": "서버를 준비하고 있습니다"
},
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "Java 추가 중..."
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "서버 구성 중..."
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "모드 다운로드 중..."
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "파일 준비 중..."
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "환경 설정 중..."
- },
"servers.list-empty.already-have-server-label": {
"defaultMessage": "서버가 이미 있으신가요?"
},
diff --git a/packages/ui/src/locales/ms-MY/index.json b/packages/ui/src/locales/ms-MY/index.json
index 98a8c3ce49..f703cf876f 100644
--- a/packages/ui/src/locales/ms-MY/index.json
+++ b/packages/ui/src/locales/ms-MY/index.json
@@ -3875,9 +3875,6 @@
"servers.busy.installing": {
"defaultMessage": "Pelayan sedang dipasang"
},
- "servers.busy.syncing-content": {
- "defaultMessage": "Penyegerakan kandungan sedang dijalankan"
- },
"servers.grant-access-modal.cancel": {
"defaultMessage": "Batal"
},
@@ -3908,45 +3905,9 @@
"servers.installing-banner.error.header": {
"defaultMessage": "Pemasangan gagal"
},
- "servers.installing-banner.error.internal-platform": {
- "defaultMessage": "Sebuah ralat dalaman telah berlaku semasa memasang platform. Sila cuba lagi kemudian."
- },
- "servers.installing-banner.error.invalid-loader-version": {
- "defaultMessage": "Pemuat atau versi Minecraft yang dinyatakan tidak dapat dipasang. Ia mungkin tidak sah atau tidak disokong."
- },
- "servers.installing-banner.error.no-primary-file": {
- "defaultMessage": "Versi pek mod ini tidak menyertakan fail yang boleh dimuat turun. Ia mungkin telah dibungkus secara salah."
- },
- "servers.installing-banner.error.unsupported-loader-version": {
- "defaultMessage": "Versi Minecraft atau pemuat ini belum disokong oleh Modrinth Hosting."
- },
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "Sedang memasang tambahan..."
- },
- "servers.installing-banner.phase.installing-modpack": {
- "defaultMessage": "Sedang memasang pek mod..."
- },
- "servers.installing-banner.phase.installing-platform": {
- "defaultMessage": "Sedang memasang platform..."
- },
"servers.installing-banner.preparing.header": {
"defaultMessage": "Kami sedang menyediakan pelayan anda"
},
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "Sedang menambah Java..."
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "Sedang mengkonfigurasikan pelayan..."
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "Sedang memuat turun mod..."
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "Sedang menyusun fail..."
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "Sedang menyediakan persekitaran..."
- },
"servers.list-empty.already-have-server-label": {
"defaultMessage": "Sudah mempunyai pelayan?"
},
@@ -5037,4 +4998,3 @@
"defaultMessage": "Jenis"
}
}
-
diff --git a/packages/ui/src/locales/nl-NL/index.json b/packages/ui/src/locales/nl-NL/index.json
index 24abd99bdc..aa897f039b 100644
--- a/packages/ui/src/locales/nl-NL/index.json
+++ b/packages/ui/src/locales/nl-NL/index.json
@@ -4367,9 +4367,6 @@
"servers.busy.installing": {
"defaultMessage": "De server wordt geïnstalleerd"
},
- "servers.busy.syncing-content": {
- "defaultMessage": "Inhoud wordt gesynchroniseerd"
- },
"servers.grant-access-modal.add-as-friend": {
"defaultMessage": "Ook een vriendschapsverzoek sturen"
},
@@ -4424,51 +4421,12 @@
"servers.installing-banner.error.header": {
"defaultMessage": "Installeren is mislukt"
},
- "servers.installing-banner.error.internal-platform": {
- "defaultMessage": "Er is een interne fout opgetreden tijdens het installeren van het platform. Probeer het nog eens."
- },
- "servers.installing-banner.error.invalid-loader-version": {
- "defaultMessage": "De opgegeven loader of Minecraft-versie kon niet worden geïnstalleerd. Deze is mogelijk ongeldig of wordt niet ondersteund."
- },
- "servers.installing-banner.error.modpack-install-failed": {
- "defaultMessage": "Het modpack kon niet worden geïnstalleerd. Het is mogelijk beschadigd of niet compatibel."
- },
- "servers.installing-banner.error.no-primary-file": {
- "defaultMessage": "Deze versie van het modpack bevat geen downloadbaar bestand. Mogelijk is het pakket niet correct samengesteld."
- },
"servers.installing-banner.error.unknown": {
"defaultMessage": "Tijdens de installatie is er een onverwachte fout opgetreden."
},
- "servers.installing-banner.error.unsupported-loader-version": {
- "defaultMessage": "Deze versie van Minecraft of loader wordt nog niet ondersteund door Modrinth Hosting."
- },
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "Add-ons aan het installeren..."
- },
- "servers.installing-banner.phase.installing-modpack": {
- "defaultMessage": "Modpack aan het installeren..."
- },
- "servers.installing-banner.phase.installing-platform": {
- "defaultMessage": "Platform aan het installeren..."
- },
"servers.installing-banner.preparing.header": {
"defaultMessage": "We zijn je server aan het klaarmaken"
},
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "Java toevoegen..."
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "Server wordt geconfigureerd..."
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "Mods worden gedownload..."
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "Bestanden worden geordend..."
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "Omgeving wordt opgezet..."
- },
"servers.list-empty.already-have-server-label": {
"defaultMessage": "Heb je al een server?"
},
diff --git a/packages/ui/src/locales/pl-PL/index.json b/packages/ui/src/locales/pl-PL/index.json
index caba145929..7aa362b5da 100644
--- a/packages/ui/src/locales/pl-PL/index.json
+++ b/packages/ui/src/locales/pl-PL/index.json
@@ -4367,9 +4367,6 @@
"servers.busy.installing": {
"defaultMessage": "Serwer jest instalowany"
},
- "servers.busy.syncing-content": {
- "defaultMessage": "Synchronizacja zawartości w toku"
- },
"servers.grant-access-modal.add-as-friend": {
"defaultMessage": "Wyślij także zaproszenie do znajomych"
},
@@ -4424,51 +4421,12 @@
"servers.installing-banner.error.header": {
"defaultMessage": "Instalacja nie powiodła się"
},
- "servers.installing-banner.error.internal-platform": {
- "defaultMessage": "Wystąpił wewnętrzny błąd podczas instalowania platformy. Spróbuj ponownie później."
- },
- "servers.installing-banner.error.invalid-loader-version": {
- "defaultMessage": "Nie udało się zainstalować podanego loadera lub podanej wersji Minecraft. Mogą być niepoprawne lub niewspierane."
- },
- "servers.installing-banner.error.modpack-install-failed": {
- "defaultMessage": "Nie udało się zainstalować paczki modów. Może być zepsuta lub niekompatybilna."
- },
- "servers.installing-banner.error.no-primary-file": {
- "defaultMessage": "Ta wersja paczki modów nie zawiera pliku do pobrania. Możliwe, że została niepoprawnie zapakowana."
- },
"servers.installing-banner.error.unknown": {
"defaultMessage": "Wystąpił nieoczekiwany błąd podczas instalacji."
},
- "servers.installing-banner.error.unsupported-loader-version": {
- "defaultMessage": "Ta wersja Minecraft lub loader nie są jeszcze wspierane przez Modrinth Hosting."
- },
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "Instalowanie dodatków..."
- },
- "servers.installing-banner.phase.installing-modpack": {
- "defaultMessage": "Instalowanie paczki modów..."
- },
- "servers.installing-banner.phase.installing-platform": {
- "defaultMessage": "Instalowanie platformy..."
- },
"servers.installing-banner.preparing.header": {
"defaultMessage": "Przygotowujemy Twój serwer"
},
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "Dodawanie Java..."
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "Ustawianie serwera..."
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "Pobieranie modów..."
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "Organizowanie plików..."
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "Ustawianie środowiska..."
- },
"servers.list-empty.already-have-server-label": {
"defaultMessage": "Posiadasz już serwer?"
},
diff --git a/packages/ui/src/locales/pt-BR/index.json b/packages/ui/src/locales/pt-BR/index.json
index 94d4ab2ced..5041f9f451 100644
--- a/packages/ui/src/locales/pt-BR/index.json
+++ b/packages/ui/src/locales/pt-BR/index.json
@@ -4388,9 +4388,6 @@
"servers.busy.installing": {
"defaultMessage": "O servidor está sendo instalado"
},
- "servers.busy.syncing-content": {
- "defaultMessage": "Sincronização de conteúdo em andamento"
- },
"servers.grant-access-modal.add-as-friend": {
"defaultMessage": "Envie também um pedido de amizade"
},
@@ -4445,51 +4442,12 @@
"servers.installing-banner.error.header": {
"defaultMessage": "A instalação falhou"
},
- "servers.installing-banner.error.internal-platform": {
- "defaultMessage": "Ocorreu um erro interno durante a instalação da plataforma. Tente novamente."
- },
- "servers.installing-banner.error.invalid-loader-version": {
- "defaultMessage": "Não foi possível instalar o carregador ou a versão do Minecraft especificada. Ela pode ser inválida ou não suportada."
- },
- "servers.installing-banner.error.modpack-install-failed": {
- "defaultMessage": "O pacote de mods não pôde ser instalado. Ele pode estar corrompido ou ser incompatível."
- },
- "servers.installing-banner.error.no-primary-file": {
- "defaultMessage": "Esta versão do pacote de mods não inclui um arquivo para download. Ela pode ter sido empacotada incorretamente."
- },
"servers.installing-banner.error.unknown": {
"defaultMessage": "Um erro inesperado ocorreu durante a instalação"
},
- "servers.installing-banner.error.unsupported-loader-version": {
- "defaultMessage": "Esta versão do Minecraft ou do carregador ainda não é suportada pelo Modrinth Hosting."
- },
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "Instalando complementos..."
- },
- "servers.installing-banner.phase.installing-modpack": {
- "defaultMessage": "Instalando pacote de mods..."
- },
- "servers.installing-banner.phase.installing-platform": {
- "defaultMessage": "Instalando plataforma"
- },
"servers.installing-banner.preparing.header": {
"defaultMessage": "Nós estamos preparando seu servidor"
},
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "Adicionando Java..."
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "Configurando servidor..."
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "Baixando mods..."
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "Organizando arquivos..."
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "Configurando ambiente..."
- },
"servers.list-empty.already-have-server-label": {
"defaultMessage": "Já possui um servidor?"
},
diff --git a/packages/ui/src/locales/ru-RU/index.json b/packages/ui/src/locales/ru-RU/index.json
index 4ea8887073..10395d056c 100644
--- a/packages/ui/src/locales/ru-RU/index.json
+++ b/packages/ui/src/locales/ru-RU/index.json
@@ -4328,9 +4328,6 @@
"servers.busy.installing": {
"defaultMessage": "Сервер устанавливается"
},
- "servers.busy.syncing-content": {
- "defaultMessage": "Синхронизация контента в процессе"
- },
"servers.grant-access-modal.add-as-friend": {
"defaultMessage": "Также отправить запрос в друзья"
},
@@ -4385,51 +4382,12 @@
"servers.installing-banner.error.header": {
"defaultMessage": "Установка не удалась"
},
- "servers.installing-banner.error.internal-platform": {
- "defaultMessage": "Во время установки платформы произошла внутренняя ошибка. Попробуйте ещё раз."
- },
- "servers.installing-banner.error.invalid-loader-version": {
- "defaultMessage": "Не удалось установить указанную версию загрузчика или Minecraft. Возможно, она недействительна или не поддерживается."
- },
- "servers.installing-banner.error.modpack-install-failed": {
- "defaultMessage": "Не удалось установить сборку модов. Возможно, она повреждена или несовместима."
- },
- "servers.installing-banner.error.no-primary-file": {
- "defaultMessage": "Эта версия сборки не содержит загрузочного файла. Возможно, она была собрана неправильно."
- },
"servers.installing-banner.error.unknown": {
"defaultMessage": "Во время установки произошла непредвиденная ошибка."
},
- "servers.installing-banner.error.unsupported-loader-version": {
- "defaultMessage": "Эта версия Minecraft или загрузчика пока не поддерживается Modrinth Hosting."
- },
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "Установка дополнений..."
- },
- "servers.installing-banner.phase.installing-modpack": {
- "defaultMessage": "Установка сборки..."
- },
- "servers.installing-banner.phase.installing-platform": {
- "defaultMessage": "Установка платформы..."
- },
"servers.installing-banner.preparing.header": {
"defaultMessage": "Подготовка сервера"
},
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "Добавление Java..."
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "Настройка сервера..."
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "Скачивание модов..."
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "Упорядочивание файлов..."
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "Настройка среды..."
- },
"servers.list-empty.already-have-server-label": {
"defaultMessage": "Уже есть сервер?"
},
diff --git a/packages/ui/src/locales/sr-CS/index.json b/packages/ui/src/locales/sr-CS/index.json
index 7b0b92f8b9..171c7445c4 100644
--- a/packages/ui/src/locales/sr-CS/index.json
+++ b/packages/ui/src/locales/sr-CS/index.json
@@ -4370,9 +4370,6 @@
"servers.busy.installing": {
"defaultMessage": "Server se instalira"
},
- "servers.busy.syncing-content": {
- "defaultMessage": "Sinhronizacija sadržaja u toku"
- },
"servers.grant-access-modal.add-as-friend": {
"defaultMessage": "Pošalji i zahtev za prijateljstvo"
},
@@ -4427,51 +4424,12 @@
"servers.installing-banner.error.header": {
"defaultMessage": "Neuspešna instalacija"
},
- "servers.installing-banner.error.internal-platform": {
- "defaultMessage": "Došlo je do interne greške prilikom instaliranja platforme. Molimo te, pokušaj ponovo."
- },
- "servers.installing-banner.error.invalid-loader-version": {
- "defaultMessage": "Navedeni učitavač ili verzija Minecrafta se ne mogu instalirati. Moguće je da su nevažeći ili nepodržani."
- },
- "servers.installing-banner.error.modpack-install-failed": {
- "defaultMessage": "Modpak nije mogao biti instaliran. Možda je oštećen ili nekompatibilan."
- },
- "servers.installing-banner.error.no-primary-file": {
- "defaultMessage": "Ova verzija modpaka ne uključuje datoteku za preuzimanje. Moguće je da je pogrešno upakovana."
- },
"servers.installing-banner.error.unknown": {
"defaultMessage": "Došlo je do neočekivane greške tokom instalacije."
},
- "servers.installing-banner.error.unsupported-loader-version": {
- "defaultMessage": "Ova verzija Minecrafta ili učitavača još uvek nije podržana od strane Modrinth Hosting-a."
- },
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "Instaliranje addona..."
- },
- "servers.installing-banner.phase.installing-modpack": {
- "defaultMessage": "Instaliranje modpacka..."
- },
- "servers.installing-banner.phase.installing-platform": {
- "defaultMessage": "Instaliranje platforme..."
- },
"servers.installing-banner.preparing.header": {
"defaultMessage": "Pripremamo tvoj server"
},
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "Dodavanje Jave..."
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "Konfigurisanje servera..."
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "Instaliranje modova..."
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "Organiziranje datoteka..."
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "Podešavanje okruženja..."
- },
"servers.list-empty.already-have-server-label": {
"defaultMessage": "Već imaš server?"
},
@@ -5787,4 +5745,3 @@
"defaultMessage": "Tip"
}
}
-
diff --git a/packages/ui/src/locales/sv-SE/index.json b/packages/ui/src/locales/sv-SE/index.json
index afffe82070..da3cb4562d 100644
--- a/packages/ui/src/locales/sv-SE/index.json
+++ b/packages/ui/src/locales/sv-SE/index.json
@@ -3848,36 +3848,12 @@
"servers.installing-banner.error.header": {
"defaultMessage": "Installering misslyckades"
},
- "servers.installing-banner.error.internal-platform": {
- "defaultMessage": "Ett internt fel inträffade när plattformen installerades. Vänligen försök igen."
- },
- "servers.installing-banner.error.modpack-install-failed": {
- "defaultMessage": "Modpaketet kunde inte installeras. Det kanske är korrumperad eller inkompatibel."
- },
"servers.installing-banner.error.unknown": {
"defaultMessage": "Ett oväntat fel inträffade under installeringen."
},
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "Installerar tillägg..."
- },
"servers.installing-banner.preparing.header": {
"defaultMessage": "Vi förbereder din server"
},
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "Lägger till Java..."
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "Konfigurerar server..."
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "Laddar ner moddar..."
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "Organiserar filer..."
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "Ställer in miljö..."
- },
"servers.list-empty.already-have-server-label": {
"defaultMessage": "Har du redan en server?"
},
@@ -4911,4 +4887,3 @@
"defaultMessage": "Typ"
}
}
-
diff --git a/packages/ui/src/locales/tr-TR/index.json b/packages/ui/src/locales/tr-TR/index.json
index 8bd3409c91..600edb1e5e 100644
--- a/packages/ui/src/locales/tr-TR/index.json
+++ b/packages/ui/src/locales/tr-TR/index.json
@@ -4361,9 +4361,6 @@
"servers.busy.installing": {
"defaultMessage": "Sunucu kuruluyor"
},
- "servers.busy.syncing-content": {
- "defaultMessage": "İçerik eşlemesi sürüyor"
- },
"servers.grant-access-modal.add-as-friend": {
"defaultMessage": "Ayrıca bir arkadaş isteği gönderin"
},
@@ -4418,51 +4415,12 @@
"servers.installing-banner.error.header": {
"defaultMessage": "Kurulum başarısız oldu"
},
- "servers.installing-banner.error.internal-platform": {
- "defaultMessage": "Platform yüklenirken dahili bir hata oluştu. Lütfen tekrar deneyin."
- },
- "servers.installing-banner.error.invalid-loader-version": {
- "defaultMessage": "Belirtilen yükleyici veya Minecraft sürümü kurulamazdı. Belki de geçersiz veya desteklenmeyen bir sürüm olabilir."
- },
- "servers.installing-banner.error.modpack-install-failed": {
- "defaultMessage": "Mod paketi yüklenemedi. Bozuk veya uyumsuz olabilir."
- },
- "servers.installing-banner.error.no-primary-file": {
- "defaultMessage": "Bu mod paketi sürümü indirilebilir bir dosya içermez. Yanlış paketlenmiş olabilir."
- },
"servers.installing-banner.error.unknown": {
"defaultMessage": "Kurulum sırasında beklenmeyen bir hata oluştu."
},
- "servers.installing-banner.error.unsupported-loader-version": {
- "defaultMessage": "Minecraft veya yükleyicinin bu sürümü henüz Modrinth Hosting tarafından desteklenmemektedir."
- },
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "Eklentiler yükleniyor..."
- },
- "servers.installing-banner.phase.installing-modpack": {
- "defaultMessage": "Mod paketi indiriliyor..."
- },
- "servers.installing-banner.phase.installing-platform": {
- "defaultMessage": "Platform yükleniyor..."
- },
"servers.installing-banner.preparing.header": {
"defaultMessage": "Sunucunuzu hazırlıyoruz"
},
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "Java ekleniyor..."
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "Sunucu yapılandırılıyor..."
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "Modlar indiriliyor..."
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "Dosyalar düzenleniyor..."
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "Ortam hazırlanıyor..."
- },
"servers.list-empty.already-have-server-label": {
"defaultMessage": "Zaten sunucunuz var mı?"
},
diff --git a/packages/ui/src/locales/uk-UA/index.json b/packages/ui/src/locales/uk-UA/index.json
index 5e8f268fe1..4cdf97974e 100644
--- a/packages/ui/src/locales/uk-UA/index.json
+++ b/packages/ui/src/locales/uk-UA/index.json
@@ -4340,9 +4340,6 @@
"servers.busy.installing": {
"defaultMessage": "Сервер установлюється"
},
- "servers.busy.syncing-content": {
- "defaultMessage": "Триває синхронізація вмісту"
- },
"servers.grant-access-modal.add-as-friend": {
"defaultMessage": "Також відправити запит у друзі"
},
@@ -4397,51 +4394,12 @@
"servers.installing-banner.error.header": {
"defaultMessage": "Не вдалося встановити"
},
- "servers.installing-banner.error.internal-platform": {
- "defaultMessage": "Під час установлення платформи сталася внутрішня помилка. Спробуйте ще раз."
- },
- "servers.installing-banner.error.invalid-loader-version": {
- "defaultMessage": "Не вдалося встановити вказаний завантажувач або версію Minecraft. Він може бути недійсним або не підтримуватися."
- },
- "servers.installing-banner.error.modpack-install-failed": {
- "defaultMessage": "Збірку не вдалося встановити. Вона може бути пошкоджена або несумісна."
- },
- "servers.installing-banner.error.no-primary-file": {
- "defaultMessage": "Ця версія збірки не містить завантажуваних файлів. Можливо, вона була неправильно впакований."
- },
"servers.installing-banner.error.unknown": {
"defaultMessage": "Під час встановлення сталася неочікувана помилка."
},
- "servers.installing-banner.error.unsupported-loader-version": {
- "defaultMessage": "Ця версія Minecraft або завантажувача ще не підтримується Modrinth Hosting."
- },
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "Установлення доповнень…"
- },
- "servers.installing-banner.phase.installing-modpack": {
- "defaultMessage": "Установлення збірки…"
- },
- "servers.installing-banner.phase.installing-platform": {
- "defaultMessage": "Установлення платформи…"
- },
"servers.installing-banner.preparing.header": {
"defaultMessage": "Ми підготовлюємо ваш сервер"
},
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "Додання Java…"
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "Налаштування сервера…"
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "Завантаження модів…"
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "Організування файлів…"
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "Налаштування середовища…"
- },
"servers.list-empty.already-have-server-label": {
"defaultMessage": "Уже маєте сервер?"
},
diff --git a/packages/ui/src/locales/vi-VN/index.json b/packages/ui/src/locales/vi-VN/index.json
index 3908a2c382..5cbe340e8c 100644
--- a/packages/ui/src/locales/vi-VN/index.json
+++ b/packages/ui/src/locales/vi-VN/index.json
@@ -3914,57 +3914,15 @@
"servers.busy.installing": {
"defaultMessage": "Đang cài máy chủ"
},
- "servers.busy.syncing-content": {
- "defaultMessage": "Đang đồng bộ nội dung"
- },
"servers.installing-banner.error.header": {
"defaultMessage": "Tải thất bại"
},
- "servers.installing-banner.error.internal-platform": {
- "defaultMessage": "Đã xảy ra lỗi nội bộ trong quá trình cài đặt nền tảng. Thử lại."
- },
- "servers.installing-banner.error.invalid-loader-version": {
- "defaultMessage": "Không thể tải loader hoặc phiên bản Minecraft đã chọn. Nó có thể không phù hợp hoặc không được hỗ trợ."
- },
- "servers.installing-banner.error.modpack-install-failed": {
- "defaultMessage": "Modpack này không thể tải được. Nó có thể bị hỏng hoặc không tương thích."
- },
- "servers.installing-banner.error.no-primary-file": {
- "defaultMessage": "Phiên bản modpack này không chứa tệp có thể tải xuống. Nó có thể không được làm đúng cách."
- },
"servers.installing-banner.error.unknown": {
"defaultMessage": "Có lỗi lạ xảy ra trong khi tải."
},
- "servers.installing-banner.error.unsupported-loader-version": {
- "defaultMessage": "Phiên bản minecraft hoặc loader hiện không được hỗ trợ bởi Modrinth Hosting."
- },
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "Đang cài addon..."
- },
- "servers.installing-banner.phase.installing-modpack": {
- "defaultMessage": "Đang cài modpack..."
- },
- "servers.installing-banner.phase.installing-platform": {
- "defaultMessage": "Đang cài platform..."
- },
"servers.installing-banner.preparing.header": {
"defaultMessage": "Chúng tôi đang sửa máy chủ của bạn"
},
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "Đang thêm Java..."
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "Đang chỉnh sửa máy chủ..."
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "Đang tải mod..."
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "Đang sắp sếp tệp..."
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "Đang thiết lập môi trường..."
- },
"servers.list-empty.already-have-server-label": {
"defaultMessage": "Đã có máy chủ rồi?"
},
@@ -5085,4 +5043,3 @@
"defaultMessage": "Đội ngũ Modrinth"
}
}
-
diff --git a/packages/ui/src/locales/zh-CN/index.json b/packages/ui/src/locales/zh-CN/index.json
index 3530218937..98e7759e80 100644
--- a/packages/ui/src/locales/zh-CN/index.json
+++ b/packages/ui/src/locales/zh-CN/index.json
@@ -4448,9 +4448,6 @@
"servers.busy.installing": {
"defaultMessage": "正在安装服务器"
},
- "servers.busy.syncing-content": {
- "defaultMessage": "正在同步內容"
- },
"servers.grant-access-modal.add-as-friend": {
"defaultMessage": "同时发送好友邀请"
},
@@ -4505,51 +4502,12 @@
"servers.installing-banner.error.header": {
"defaultMessage": "安装失败"
},
- "servers.installing-banner.error.internal-platform": {
- "defaultMessage": "安装平台时发生内部错误,请重试。"
- },
- "servers.installing-banner.error.invalid-loader-version": {
- "defaultMessage": "指定的加载器或 Minecraft 版本无法安装。它可能无效或不受支持。"
- },
- "servers.installing-banner.error.modpack-install-failed": {
- "defaultMessage": "整合包无法安装。它可能已损坏或不兼容。"
- },
- "servers.installing-banner.error.no-primary-file": {
- "defaultMessage": "这个整合包版本不包含可下载的文件,可能是打包方式有问题。"
- },
"servers.installing-banner.error.unknown": {
"defaultMessage": "安装过程中发生意外错误。"
},
- "servers.installing-banner.error.unsupported-loader-version": {
- "defaultMessage": "Modrinth Hosting 目前尚不支持此版本的 Minecraft 或加载器。"
- },
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "正在安装组件……"
- },
- "servers.installing-banner.phase.installing-modpack": {
- "defaultMessage": "正在安装整合包……"
- },
- "servers.installing-banner.phase.installing-platform": {
- "defaultMessage": "正在安装平台……"
- },
"servers.installing-banner.preparing.header": {
"defaultMessage": "我们正在准备你的服务器"
},
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "正在添加 Java……"
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "正在配置服务器……"
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "正在下载模组……"
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "正在整理文件……"
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "正在设置运行环境……"
- },
"servers.list-empty.already-have-server-label": {
"defaultMessage": "已经有服务器了吗?"
},
@@ -5940,4 +5898,3 @@
"defaultMessage": "类型"
}
}
-
diff --git a/packages/ui/src/locales/zh-TW/index.json b/packages/ui/src/locales/zh-TW/index.json
index 59a8778d78..7f1c09e0c1 100644
--- a/packages/ui/src/locales/zh-TW/index.json
+++ b/packages/ui/src/locales/zh-TW/index.json
@@ -4415,9 +4415,6 @@
"servers.busy.installing": {
"defaultMessage": "正在安裝伺服器"
},
- "servers.busy.syncing-content": {
- "defaultMessage": "正在同步內容"
- },
"servers.grant-access-modal.add-as-friend": {
"defaultMessage": "同時傳送好友邀請"
},
@@ -4472,51 +4469,12 @@
"servers.installing-banner.error.header": {
"defaultMessage": "無法安裝"
},
- "servers.installing-banner.error.internal-platform": {
- "defaultMessage": "安裝平臺時發生內部錯誤,請再試一次。"
- },
- "servers.installing-banner.error.invalid-loader-version": {
- "defaultMessage": "無法安裝指定的載入器或 Minecraft 版本。該載入器或版本可能無效或不受支援。"
- },
- "servers.installing-banner.error.modpack-install-failed": {
- "defaultMessage": "無法安裝模組包。該模組包可能已損毀或不相容。"
- },
- "servers.installing-banner.error.no-primary-file": {
- "defaultMessage": "這個模組包版本不包含可下載檔案。可能是打包時出了問題。"
- },
"servers.installing-banner.error.unknown": {
"defaultMessage": "安裝時發生非預期的錯誤。"
},
- "servers.installing-banner.error.unsupported-loader-version": {
- "defaultMessage": "Modrinth Hosting 尚不支援這個 Minecraft 版本或載入器。"
- },
- "servers.installing-banner.phase.installing-addons": {
- "defaultMessage": "正在安裝額外內容..."
- },
- "servers.installing-banner.phase.installing-modpack": {
- "defaultMessage": "正在安裝模組包..."
- },
- "servers.installing-banner.phase.installing-platform": {
- "defaultMessage": "正在安裝平臺..."
- },
"servers.installing-banner.preparing.header": {
"defaultMessage": "我們正在為你準備伺服器"
},
- "servers.installing-banner.ticker.adding-java": {
- "defaultMessage": "正在新增 Java..."
- },
- "servers.installing-banner.ticker.configuring-server": {
- "defaultMessage": "正在設定伺服器..."
- },
- "servers.installing-banner.ticker.downloading-mods": {
- "defaultMessage": "正在下載模組..."
- },
- "servers.installing-banner.ticker.organizing-files": {
- "defaultMessage": "正在整理檔案..."
- },
- "servers.installing-banner.ticker.setting-up-environment": {
- "defaultMessage": "正在設定環境..."
- },
"servers.list-empty.already-have-server-label": {
"defaultMessage": "已經有伺服器了嗎?"
},
@@ -5901,4 +5859,3 @@
"defaultMessage": "類型"
}
}
-
diff --git a/packages/ui/src/providers/server-context.ts b/packages/ui/src/providers/server-context.ts
index 7431839807..7162aa8914 100644
--- a/packages/ui/src/providers/server-context.ts
+++ b/packages/ui/src/providers/server-context.ts
@@ -2,6 +2,10 @@ import type { Archon, UploadState } from '@modrinth/api-client'
import type { ComputedRef, Ref } from 'vue'
import type { MessageDescriptor } from '#ui/composables/i18n'
+import type {
+ ServerInstallationKey,
+ ServerInstallationState,
+} from '#ui/composables/server-installation-tracker'
import type { FileOperation } from '#ui/layouts/shared/files-tab/types'
import { createContext } from '.'
@@ -49,9 +53,11 @@ export interface ModrinthServerContext {
readonly isServerRunning: ComputedRef
readonly stats: Ref
readonly uptimeSeconds: Ref
-
- // Content sync state
- readonly isSyncingContent: Ref
+ readonly installProgressItems: Ref
+ readonly installation: ComputedRef
+ beginInstallation: (key: ServerInstallationKey) => void
+ cancelOptimisticInstallation: () => void
+ dismissInstallation: (id: string) => void
// Busy state — when non-empty, all write operations should be disabled
readonly busyReasons: ComputedRef
diff --git a/packages/ui/src/stories/servers/EditServerIcon.stories.ts b/packages/ui/src/stories/servers/EditServerIcon.stories.ts
index 04d05a15f9..03ae672600 100644
--- a/packages/ui/src/stories/servers/EditServerIcon.stories.ts
+++ b/packages/ui/src/stories/servers/EditServerIcon.stories.ts
@@ -71,7 +71,11 @@ const meta = {
isServerRunning: computed(() => true),
stats,
uptimeSeconds: ref(0),
- isSyncingContent: ref(false),
+ installProgressItems: ref([]),
+ installation: computed(() => null),
+ beginInstallation: () => {},
+ cancelOptimisticInstallation: () => {},
+ dismissInstallation: () => {},
busyReasons: computed(() => []),
fsAuth: ref(null),
fsOps: ref([]),
diff --git a/packages/ui/src/stories/servers/InstallingBanner.stories.ts b/packages/ui/src/stories/servers/InstallingBanner.stories.ts
index cdf65e9da2..3109dd1efb 100644
--- a/packages/ui/src/stories/servers/InstallingBanner.stories.ts
+++ b/packages/ui/src/stories/servers/InstallingBanner.stories.ts
@@ -1,6 +1,85 @@
+import type { Archon, UploadState } from '@modrinth/api-client'
import type { Meta, StoryObj } from '@storybook/vue3-vite'
+import { computed, ref } from 'vue'
import InstallingBanner from '../../components/servers/InstallingBanner.vue'
+import type { ServerInstallationState } from '../../composables/server-installation-tracker'
+import { provideModrinthServerContext } from '../../providers'
+import type {
+ CancelUploadHandler,
+ ModrinthServerContext,
+ ServerStats,
+} from '../../providers/server-context'
+
+function renderInstallation(state: ServerInstallationState) {
+ return () => ({
+ components: { InstallingBanner },
+ setup() {
+ const installation = ref(state)
+ const serverContext: ModrinthServerContext = {
+ get serverId() {
+ return 'story-server'
+ },
+ worldId: ref('story-world'),
+ server: ref({
+ server_id: 'story-server',
+ status: 'installing',
+ } as Archon.Servers.v0.Server),
+ serverFull: computed(() => null),
+ currentUserPermissions: computed(() => 0),
+ isConnected: ref(true),
+ isWsAuthIncorrect: ref(false),
+ powerState: ref('stopped'),
+ powerStateDetails: ref(undefined),
+ isServerRunning: computed(() => false),
+ stats: ref({
+ current: {
+ cpu_percent: 0,
+ ram_usage_bytes: 0,
+ ram_total_bytes: 1,
+ storage_usage_bytes: 0,
+ storage_total_bytes: 0,
+ },
+ past: {
+ cpu_percent: 0,
+ ram_usage_bytes: 0,
+ ram_total_bytes: 1,
+ storage_usage_bytes: 0,
+ storage_total_bytes: 0,
+ },
+ graph: { cpu: [], ram: [] },
+ }),
+ uptimeSeconds: ref(0),
+ installProgressItems: ref([]),
+ installation: computed(() => installation.value),
+ beginInstallation: () => {},
+ cancelOptimisticInstallation: () => {},
+ dismissInstallation: () => {
+ installation.value = null
+ },
+ busyReasons: computed(() => []),
+ fsAuth: ref(null),
+ fsOps: ref([]),
+ fsQueuedOps: ref([]),
+ refreshFsAuth: async () => {},
+ uploadState: ref({
+ isUploading: false,
+ currentFileName: null,
+ currentFileProgress: 0,
+ uploadedBytes: 0,
+ totalBytes: 0,
+ completedFiles: 0,
+ totalFiles: 0,
+ }),
+ cancelUpload: ref(null),
+ activeOperations: computed(() => []),
+ dismissOperation: async () => {},
+ }
+ provideModrinthServerContext(serverContext)
+ },
+ template: '',
+ })
+}
const meta = {
title: 'Servers/InstallingBanner',
@@ -10,109 +89,81 @@ const meta = {
export default meta
type Story = StoryObj
-export const Default: Story = {
- name: 'Default (no progress)',
-}
-
-export const WithProgress: Story = {
- args: {
- progress: {
- phase: 'InstallingLoader',
- percent: 45,
+export const PlatformPending: Story = {
+ render: renderInstallation({
+ id: 'platform:fabric:0.16.14:1.21.1',
+ key: {
+ type: 'platform',
+ platform: 'fabric',
+ platform_version: '0.16.14',
+ game_version: '1.21.1',
},
- },
-}
-
-export const IndeterminateLoaderInstall: Story = {
- args: {
- progress: {
- phase: 'InstallingLoader',
- percent: 0,
- },
- },
-}
-
-export const InstallingModpack: Story = {
- args: {
- progress: {
- phase: 'InstallingPack',
- percent: 72,
- },
- },
-}
-
-export const InstallingAddons: Story = {
- args: {
- progress: {
- phase: 'Addons',
- percent: 90,
- },
- },
-}
-
-export const ErrorInvalidVersion: Story = {
- name: 'Error: Invalid Version',
- args: {
- contentError: {
- step: 'modloader',
- description: 'the specified version may be incorrect',
- },
- },
+ status: 'pending',
+ progress: null,
+ error: null,
+ source: 'optimistic',
+ }),
}
-export const ErrorUnsupportedVersion: Story = {
- name: 'Error: Unsupported Version',
- args: {
- contentError: {
- step: 'modloader',
- description: 'this version is not yet supported',
+export const PlatformProgress: Story = {
+ render: renderInstallation({
+ id: 'platform:fabric:0.16.14:1.21.1',
+ key: {
+ type: 'platform',
+ platform: 'fabric',
+ platform_version: '0.16.14',
+ game_version: '1.21.1',
},
- },
+ status: 'installing',
+ progress: 45,
+ error: null,
+ source: 'websocket',
+ }),
}
-export const ErrorInternal: Story = {
- name: 'Error: Internal',
- args: {
- contentError: {
- step: 'modloader',
- description: 'internal error',
+export const Vanilla: Story = {
+ render: renderInstallation({
+ id: 'platform:vanilla::1.21.1',
+ key: {
+ type: 'platform',
+ platform: 'vanilla',
+ platform_version: '',
+ game_version: '1.21.1',
},
- },
+ status: 'installing',
+ progress: 20,
+ error: null,
+ source: 'websocket',
+ }),
}
-export const ErrorModpackInstall: Story = {
- name: 'Error: Modpack Install Failed',
- args: {
- contentError: {
- step: 'modpack',
- description: 'Failed to install modpack',
+export const Modpack: Story = {
+ render: renderInstallation({
+ id: 'modrinth-modpack:project:version',
+ key: {
+ type: 'modrinth_modpack',
+ project_id: 'project',
+ version_id: 'version',
},
- },
+ status: 'installing',
+ progress: 72,
+ error: null,
+ source: 'websocket',
+ }),
}
-export const ErrorModpackNoFile: Story = {
- name: 'Error: Modpack No Primary File',
- args: {
- contentError: {
- step: 'modpack',
- description: 'Modpack version has no primary file',
+export const Failed: Story = {
+ render: renderInstallation({
+ id: 'platform:fabric:0.16.14:1.21.1',
+ key: {
+ type: 'platform',
+ platform: 'fabric',
+ platform_version: '0.16.14',
+ game_version: '1.21.1',
},
- },
-}
-
-export const AllStates: Story = {
- render: () => ({
- components: { InstallingBanner },
- template: /*html*/ `
-
-
-
-
-
-
-
-
-
- `,
+ status: 'failed',
+ progress: null,
+ error: 'The specified version may be incorrect',
+ source: 'websocket',
}),
}
diff --git a/packages/ui/src/stories/servers/ServerPanelAdmonitions.stories.ts b/packages/ui/src/stories/servers/ServerPanelAdmonitions.stories.ts
index aeccb82689..f5dff5d1e9 100644
--- a/packages/ui/src/stories/servers/ServerPanelAdmonitions.stories.ts
+++ b/packages/ui/src/stories/servers/ServerPanelAdmonitions.stories.ts
@@ -88,7 +88,11 @@ const meta = {
isServerRunning: computed(() => true),
stats,
uptimeSeconds: ref(0),
- isSyncingContent: ref(false),
+ installProgressItems: ref([]),
+ installation: computed(() => null),
+ beginInstallation: () => {},
+ cancelOptimisticInstallation: () => {},
+ dismissInstallation: () => {},
busyReasons: computed(() => [
{ reason: defineMessage({ id: 's.bg', defaultMessage: 'Background task running' }) },
]),