mirror of
https://github.com/modrinth/code.git
synced 2026-08-25 17:14:50 +00:00
* feat: base of instances v2 * feat: use old profiles with compat layer * prototype: instances v2 * fix: install_from using profile * fix: skins migration fix * fix: frontend still using profile path * fix: add update proj multiselect guard * fix: cargo fmt * fix: content missing fields * feat: break up app-lib/api/instance.rs * fix: check_content_updates mismatch * fix: updater modal cleanup w/new structure * feat: better update all handling * fix: remove preview_update_all * fix: feedback on bulk update + lint * fix: rem transitions * fix: change to jsonb * feat: app db backup after update * fix: lint * fix: sqlx prepare + use sqlx macros * fix: lint * fix: bugs * feat: defuck the installing process up * fix: bug of hell * fix: shear * fix: fmt * fix: install progress spacing + change mc/content/overrides to bytes * fix: lint * fix: prepr * fix: navtabs anim not working in app * fix: worlds.vue improvements + browse page fixes * feat: optimise queries + adapter fns * fix: lint * fix: lint * feat: shared modrinth-content-management crate (#6469) * feat: disable warnings setting * feat: add instances shortcuts (#6329) * Add modrinth://launch deep link to start a profile Support external profile launching via modrinth://launch/{profile_path} for integrations such as Stream Deck. * Change route to /launch/profile/{id} for future extensibility * fix: ensure profile path is url decoded * fix: URL-decode profile path from deep link * fix: use urlencoding crate for URL decoding * feat: implement app instance shortcuts * feat: change windows shortcut creation to use windows api instead * feat: implement creating a shortcut launching world/server * format * fmt * fix multiline inline tables * pnpm prepr * feat: move create shortcut to last item * refactor: split up shortcuts.rs for individual platforms * refactor: turn profile launch url into url type * use string literal and add safety comment * pt2 * refactor: rename anything that's profile into instance * update mac shortcut --------- Co-authored-by: DJCheesusReal <134006619+DJCheesusReal@users.noreply.github.com> --------- Co-authored-by: Truman Gao <106889354+tdgao@users.noreply.github.com> Co-authored-by: DJCheesusReal <134006619+DJCheesusReal@users.noreply.github.com>
158 lines
4.2 KiB
Vue
158 lines
4.2 KiB
Vue
<script setup lang="ts">
|
|
import {
|
|
Checkbox,
|
|
defineMessages,
|
|
injectNotificationManager,
|
|
StyledInput,
|
|
useVIntl,
|
|
} from '@modrinth/ui'
|
|
import { computed, ref, watch } from 'vue'
|
|
|
|
import { edit } from '@/helpers/instance'
|
|
import { get } from '@/helpers/settings.ts'
|
|
import { injectInstanceSettings } from '@/providers/instance-settings'
|
|
|
|
import type { AppSettings, Hooks } from '../../../helpers/types'
|
|
|
|
const { handleError } = injectNotificationManager()
|
|
const { formatMessage } = useVIntl()
|
|
|
|
const { instance } = injectInstanceSettings()
|
|
|
|
const globalSettings = (await get().catch(handleError)) as AppSettings
|
|
|
|
const overrideHooks = ref(
|
|
!!instance.value.hooks.pre_launch ||
|
|
!!instance.value.hooks.wrapper ||
|
|
!!instance.value.hooks.post_exit,
|
|
)
|
|
const hooks = ref(instance.value.hooks ?? globalSettings.hooks)
|
|
|
|
const editInstanceObject = computed(() => {
|
|
const editInstancePatch: {
|
|
hooks?: Hooks
|
|
} = {}
|
|
|
|
// When hooks are not overridden per-instance, we want to clear them
|
|
editInstancePatch.hooks = overrideHooks.value ? hooks.value : {}
|
|
|
|
return editInstancePatch
|
|
})
|
|
|
|
watch(
|
|
[overrideHooks, hooks],
|
|
async () => {
|
|
await edit(instance.value.id, editInstanceObject.value)
|
|
},
|
|
{ deep: true },
|
|
)
|
|
const messages = defineMessages({
|
|
hooks: {
|
|
id: 'instance.settings.tabs.hooks.title',
|
|
defaultMessage: 'Game launch hooks',
|
|
},
|
|
hooksDescription: {
|
|
id: 'instance.settings.tabs.hooks.description',
|
|
defaultMessage:
|
|
'Hooks allow advanced users to run certain system commands before and after launching the game.',
|
|
},
|
|
customHooks: {
|
|
id: 'instance.settings.tabs.hooks.custom-hooks',
|
|
defaultMessage: 'Custom launch hooks',
|
|
},
|
|
preLaunch: {
|
|
id: 'instance.settings.tabs.hooks.pre-launch',
|
|
defaultMessage: 'Pre-launch',
|
|
},
|
|
preLaunchDescription: {
|
|
id: 'instance.settings.tabs.hooks.pre-launch.description',
|
|
defaultMessage: 'Ran before the instance is launched.',
|
|
},
|
|
preLaunchEnter: {
|
|
id: 'instance.settings.tabs.hooks.pre-launch.enter',
|
|
defaultMessage: 'Enter pre-launch command...',
|
|
},
|
|
wrapper: {
|
|
id: 'instance.settings.tabs.hooks.wrapper',
|
|
defaultMessage: 'Wrapper',
|
|
},
|
|
wrapperDescription: {
|
|
id: 'instance.settings.tabs.hooks.wrapper.description',
|
|
defaultMessage: 'Wrapper command for launching Minecraft.',
|
|
},
|
|
wrapperEnter: {
|
|
id: 'instance.settings.tabs.hooks.wrapper.enter',
|
|
defaultMessage: 'Enter wrapper command...',
|
|
},
|
|
postExit: {
|
|
id: 'instance.settings.tabs.hooks.post-exit',
|
|
defaultMessage: 'Post-exit',
|
|
},
|
|
postExitDescription: {
|
|
id: 'instance.settings.tabs.hooks.post-exit.description',
|
|
defaultMessage: 'Ran after the game closes.',
|
|
},
|
|
postExitEnter: {
|
|
id: 'instance.settings.tabs.hooks.post-exit.enter',
|
|
defaultMessage: 'Enter post-exit command...',
|
|
},
|
|
})
|
|
</script>
|
|
|
|
<template>
|
|
<div>
|
|
<h2 class="m-0 m-0 text-lg font-semibold text-contrast">
|
|
{{ formatMessage(messages.hooks) }}
|
|
</h2>
|
|
<Checkbox v-model="overrideHooks" :label="formatMessage(messages.customHooks)" class="my-2.5" />
|
|
<p class="m-0">
|
|
{{ formatMessage(messages.hooksDescription) }}
|
|
</p>
|
|
|
|
<h2 class="mt-6 m-0 text-lg font-semibold text-contrast">
|
|
{{ formatMessage(messages.preLaunch) }}
|
|
</h2>
|
|
<StyledInput
|
|
id="pre-launch"
|
|
v-model="hooks.pre_launch"
|
|
autocomplete="off"
|
|
:disabled="!overrideHooks"
|
|
:placeholder="formatMessage(messages.preLaunchEnter)"
|
|
wrapper-class="w-full my-2.5"
|
|
/>
|
|
<p class="m-0">
|
|
{{ formatMessage(messages.preLaunchDescription) }}
|
|
</p>
|
|
|
|
<h2 class="mt-6 m-0 text-lg font-semibold text-contrast">
|
|
{{ formatMessage(messages.wrapper) }}
|
|
</h2>
|
|
<StyledInput
|
|
id="wrapper"
|
|
v-model="hooks.wrapper"
|
|
autocomplete="off"
|
|
:disabled="!overrideHooks"
|
|
:placeholder="formatMessage(messages.wrapperEnter)"
|
|
wrapper-class="w-full my-2.5"
|
|
/>
|
|
<p class="m-0">
|
|
{{ formatMessage(messages.wrapperDescription) }}
|
|
</p>
|
|
|
|
<h2 class="mt-6 m-0 text-lg font-semibold text-contrast">
|
|
{{ formatMessage(messages.postExit) }}
|
|
</h2>
|
|
<StyledInput
|
|
id="post-exit"
|
|
v-model="hooks.post_exit"
|
|
autocomplete="off"
|
|
:disabled="!overrideHooks"
|
|
:placeholder="formatMessage(messages.postExitEnter)"
|
|
wrapper-class="w-full my-2.5"
|
|
/>
|
|
<p class="m-0">
|
|
{{ formatMessage(messages.postExitDescription) }}
|
|
</p>
|
|
</div>
|
|
</template>
|