(
'root',
'serverInstall',
)
+export { provideServerInstall }
+
+export function injectServerInstall(): ServerInstallContext {
+ try {
+ return _rawInjectServerInstall()
+ } catch {
+ if (_serverInstallSingleton) return _serverInstallSingleton
+ throw new Error('ServerInstall context not available')
+ }
+}
+
export function createServerInstall(opts: {
router: Router
handleError: (err: unknown) => void
@@ -345,7 +358,7 @@ export function createServerInstall(opts: {
}
}
- return {
+ const context: ServerInstallContext = {
installingServerProjects,
startInstallingServer,
stopInstallingServer,
@@ -365,4 +378,7 @@ export function createServerInstall(opts: {
addServerToInstanceModalRef?.show(serverName, serverAddress)
},
}
+
+ _serverInstallSingleton = context
+ return context
}
diff --git a/packages/ui/src/layouts/shared/content-tab/components/modals/ContentInstallModal.vue b/packages/ui/src/layouts/shared/content-tab/components/modals/ContentInstallModal.vue
index eae3a6945..3a2de5772 100644
--- a/packages/ui/src/layouts/shared/content-tab/components/modals/ContentInstallModal.vue
+++ b/packages/ui/src/layouts/shared/content-tab/components/modals/ContentInstallModal.vue
@@ -6,6 +6,45 @@
+
+
+
+
+
+
+ {{ projectInfo.title }}
+
+
+
+
+ {{ projectInfo.owner.name }}
+
+
+
+
+
{{ formatMessage(messages.instanceType) }}
@@ -34,8 +73,8 @@
class="!border-surface-4 !border"
@click="hideUninstallable = !hideUninstallable"
>
-
-
+
+
@@ -212,6 +251,7 @@ import {
} from '@modrinth/assets'
import { computed, ref } from 'vue'
+import AutoLink from '#ui/components/base/AutoLink.vue'
import Avatar from '#ui/components/base/Avatar.vue'
import ButtonStyled from '#ui/components/base/ButtonStyled.vue'
import Chips from '#ui/components/base/Chips.vue'
@@ -314,6 +354,20 @@ export interface ContentInstallInstance {
installing?: boolean
}
+export interface ContentInstallProjectOwner {
+ name: string
+ iconUrl?: string
+ circle?: boolean
+ link: string | (() => void)
+}
+
+export interface ContentInstallProjectInfo {
+ title: string
+ iconUrl?: string | null
+ link: string
+ owner?: ContentInstallProjectOwner | null
+}
+
const props = defineProps<{
instances: ContentInstallInstance[]
compatibleLoaders: string[]
@@ -323,6 +377,7 @@ const props = defineProps<{
defaultTab?: 'existing' | 'new'
preferredLoader?: string | null
preferredGameVersion?: string | null
+ projectInfo?: ContentInstallProjectInfo | null
}>()
const emit = defineEmits<{
diff --git a/packages/ui/src/layouts/shared/content-tab/index.ts b/packages/ui/src/layouts/shared/content-tab/index.ts
index 6fdd2c612..e2085b11d 100644
--- a/packages/ui/src/layouts/shared/content-tab/index.ts
+++ b/packages/ui/src/layouts/shared/content-tab/index.ts
@@ -9,7 +9,11 @@ export { default as ConfirmModpackUpdateModal } from './components/modals/Confir
export { default as ConfirmReinstallModal } from './components/modals/ConfirmReinstallModal.vue'
export { default as ConfirmRepairModal } from './components/modals/ConfirmRepairModal.vue'
export { default as ConfirmUnlinkModal } from './components/modals/ConfirmUnlinkModal.vue'
-export type { ContentInstallInstance } from './components/modals/ContentInstallModal.vue'
+export type {
+ ContentInstallInstance,
+ ContentInstallProjectInfo,
+ ContentInstallProjectOwner,
+} from './components/modals/ContentInstallModal.vue'
export { default as ContentInstallModal } from './components/modals/ContentInstallModal.vue'
export { default as ContentUpdaterModal } from './components/modals/ContentUpdaterModal.vue'
export type { ModpackContentModalState } from './components/modals/ModpackContentModal.vue'
diff --git a/packages/ui/src/providers/create-context.ts b/packages/ui/src/providers/create-context.ts
index e93f24d4c..befc1b74d 100644
--- a/packages/ui/src/providers/create-context.ts
+++ b/packages/ui/src/providers/create-context.ts
@@ -43,7 +43,9 @@ export function createContext(
? `${providerComponentName}Context`
: contextName
- const injectionKey: InjectionKey = Symbol(symbolDescription)
+ const injectionKey: InjectionKey = Symbol.for(
+ `modrinth:${symbolDescription}`,
+ )
/**
* @param fallback The context value to return if the injection fails.