+
-
+
Signed in as
-
- {{ credentials.user.username }}
+
+ {{ credentials?.user?.username }}
@@ -1133,11 +1224,15 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
+
+
+
+
diff --git a/apps/app-frontend/src/components/ui/QuickInstanceSwitcher.vue b/apps/app-frontend/src/components/ui/QuickInstanceSwitcher.vue
index 7186203c1..442f424ec 100644
--- a/apps/app-frontend/src/components/ui/QuickInstanceSwitcher.vue
+++ b/apps/app-frontend/src/components/ui/QuickInstanceSwitcher.vue
@@ -69,7 +69,10 @@ onUnmounted(() => {
-
+
diff --git a/apps/app-frontend/src/components/ui/RunningAppBar.vue b/apps/app-frontend/src/components/ui/RunningAppBar.vue
index 53f050362..95da2cdb6 100644
--- a/apps/app-frontend/src/components/ui/RunningAppBar.vue
+++ b/apps/app-frontend/src/components/ui/RunningAppBar.vue
@@ -52,10 +52,12 @@
{{ loadingBar.title }}
-
-
- {{ Math.floor((100 * loadingBar.current) / loadingBar.total) }}%
- {{ loadingBar.message }}
+
+
+
+ {{ Math.floor((100 * loadingBar.current) / loadingBar.total) }}%
+ {{ loadingBar.message }}
+
@@ -346,7 +348,7 @@ onBeforeUnmount(() => {
.info-card {
position: absolute;
top: 3.5rem;
- right: 0.5rem;
+ right: 2rem;
z-index: 9;
width: 20rem;
background-color: var(--color-raised-bg);
@@ -420,7 +422,7 @@ onBeforeUnmount(() => {
display: flex;
flex-direction: column;
align-items: flex-start;
- gap: 0.5rem;
+ gap: 0.75rem;
margin: 0;
padding: 0;
}
diff --git a/apps/app-frontend/src/components/ui/UpdateAvailableToast.vue b/apps/app-frontend/src/components/ui/UpdateAvailableToast.vue
deleted file mode 100644
index ccae3ef5a..000000000
--- a/apps/app-frontend/src/components/ui/UpdateAvailableToast.vue
+++ /dev/null
@@ -1,84 +0,0 @@
-
-
-
-
-
- {{ formatMessage(messages.title) }}
-
-
-
-
-
-
- {{ formatMessage(messages.body, { version: availableUpdate.version }) }}
-
-
-
diff --git a/apps/app-frontend/src/components/ui/UpdateToast.vue b/apps/app-frontend/src/components/ui/UpdateToast.vue
deleted file mode 100644
index 6a7f104c6..000000000
--- a/apps/app-frontend/src/components/ui/UpdateToast.vue
+++ /dev/null
@@ -1,130 +0,0 @@
-
-
-
-
-
- {{
- formatMessage(metered && progress === 1 ? messages.downloadCompleteTitle : messages.title)
- }}
-
-
-
-
-
-
- {{
- formatMessage(
- metered
- ? progress === 1
- ? messages.downloadedBody
- : messages.meteredBody
- : messages.body,
- { version },
- )
- }}
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ formatMessage(messages.changelog) }}
-
-
-
-
-
diff --git a/apps/app-frontend/src/components/ui/install_flow/AddServerToInstanceModal.vue b/apps/app-frontend/src/components/ui/install_flow/AddServerToInstanceModal.vue
new file mode 100644
index 000000000..29b4d905c
--- /dev/null
+++ b/apps/app-frontend/src/components/ui/install_flow/AddServerToInstanceModal.vue
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ profile.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/app-frontend/src/components/ui/install_flow/ModInstallModal.vue b/apps/app-frontend/src/components/ui/install_flow/ModInstallModal.vue
index 2f5c6a601..8b1edf424 100644
--- a/apps/app-frontend/src/components/ui/install_flow/ModInstallModal.vue
+++ b/apps/app-frontend/src/components/ui/install_flow/ModInstallModal.vue
@@ -16,6 +16,7 @@ import { useRouter } from 'vue-router'
import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
import { trackEvent } from '@/helpers/analytics'
+import { get_project_v3_many } from '@/helpers/cache.js'
import {
add_project_from_version as installMod,
check_installed,
@@ -81,6 +82,22 @@ defineExpose({
handleError,
)
}
+
+ const linkedProjectIds = profilesVal
+ .filter((p) => p.linked_data?.project_id)
+ .map((p) => p.linked_data.project_id)
+ if (linkedProjectIds.length > 0) {
+ const linkedProjects = await get_project_v3_many(linkedProjectIds, 'must_revalidate').catch(
+ () => [],
+ )
+ const serverProjectIds = new Set(
+ linkedProjects.filter((p) => p?.minecraft_server != null).map((p) => p.id),
+ )
+ for (const profile of profilesVal) {
+ profile.isServerInstance = serverProjectIds.has(profile.linked_data?.project_id)
+ }
+ }
+
profiles.value = profilesVal
installModal.value.show()
diff --git a/apps/app-frontend/src/components/ui/instance_settings/InstallationSettings.vue b/apps/app-frontend/src/components/ui/instance_settings/InstallationSettings.vue
index 93cf9bc55..b9fe4223d 100644
--- a/apps/app-frontend/src/components/ui/instance_settings/InstallationSettings.vue
+++ b/apps/app-frontend/src/components/ui/instance_settings/InstallationSettings.vue
@@ -29,7 +29,7 @@ import { computed, type ComputedRef, type Ref, ref, shallowRef, watch } from 'vu
import ConfirmModalWrapper from '@/components/ui/modal/ConfirmModalWrapper.vue'
import ModpackVersionModal from '@/components/ui/ModpackVersionModal.vue'
import { trackEvent } from '@/helpers/analytics'
-import { get_project, get_version_many } from '@/helpers/cache'
+import { get_project, get_version, get_version_many } from '@/helpers/cache'
import { get_loader_versions } from '@/helpers/metadata'
import { edit, install, update_repair_modrinth } from '@/helpers/profile'
import { get_game_versions, get_loaders } from '@/helpers/tags'
@@ -110,6 +110,12 @@ if (props.instance.linked_data && props.instance.linked_data.project_id && !prop
versions.find(
(version: Version) => version.id === props.instance.linked_data?.version_id,
) ?? null
+
+ if (!modpackVersion.value) {
+ get_version(props.instance.linked_data?.version_id, 'bypass')
+ .then((version: Version) => (modpackVersion.value = version ?? null))
+ .catch(handleError)
+ }
})
.catch(handleError)
.finally(() => {
@@ -424,6 +430,18 @@ const messages = defineMessages({
id: 'instance.settings.tabs.installation.unlink.description',
defaultMessage: `This instance is linked to a modpack, which means mods can't be updated and you can't change the mod loader or Minecraft version. Unlinking will permanently disconnect this instance from the modpack.`,
},
+ unlinkServerTitle: {
+ id: 'instance.settings.tabs.installation.unlink-server.title',
+ defaultMessage: 'Unlink from server',
+ },
+ unlinkServerDescription: {
+ id: 'instance.settings.tabs.installation.unlink-server.description',
+ defaultMessage: `This instance is linked to a server, which means mods can't be updated and you can't change the mod loader or Minecraft version. Unlinking will permanently disconnect this instance from the server.`,
+ },
+ unlinkServerVanillaDescription: {
+ id: 'instance.settings.tabs.installation.unlink-server-vanilla.description',
+ defaultMessage: `This instance is linked to a server, which means you can't change the Minecraft version. Unlinking will permanently disconnect this instance from the server.`,
+ },
unlinkInstanceButton: {
id: 'instance.settings.tabs.installation.unlink.button',
defaultMessage: 'Unlink instance',
@@ -557,17 +575,27 @@ const messages = defineMessages({
})
}}
-
+
{{
modpackProject
? modpackVersion
? modpackVersion?.version_number
- : 'Unknown version'
+ : props.isMinecraftServer
+ ? ''
+ : 'Unknown version'
: formatLoader(formatMessage, instance.loader)
}}
{{ instance.loader_version || formatMessage(messages.unknownVersion) }}
+
+ {{ instance.loader }}
+ {{ instance.loader_version }}
+