diff --git a/apps/app-frontend/package.json b/apps/app-frontend/package.json index abe6e55c0f..7eea9d5397 100644 --- a/apps/app-frontend/package.json +++ b/apps/app-frontend/package.json @@ -32,6 +32,7 @@ "@tauri-apps/plugin-window-state": "^2.2.2", "@types/three": "^0.172.0", "@vueuse/core": "^11.1.0", + "ace-builds": "^1.43.5", "dayjs": "^1.11.10", "floating-vue": "^5.2.2", "fuse.js": "^6.6.2", @@ -45,6 +46,7 @@ "vue-i18n": "^10.0.0", "vue-router": "^4.6.0", "vue-virtual-scroller": "v2.0.0-beta.8", + "vue3-ace-editor": "^2.2.4", "vuedraggable": "^4.1.0" }, "devDependencies": { diff --git a/apps/app-frontend/src/App.vue b/apps/app-frontend/src/App.vue index 6b8580882a..ea0ed2f8c2 100644 --- a/apps/app-frontend/src/App.vue +++ b/apps/app-frontend/src/App.vue @@ -112,7 +112,12 @@ import { debugAnalytics, initAnalytics, trackEvent } from '@/helpers/analytics' import { check_reachable } from '@/helpers/auth.js' import { get_user, get_version } from '@/helpers/cache.js' import { install_create_modpack_instance, install_get_modpack_preview } from '@/helpers/install' -import { can_current_user_use_shared_instances, get as getInstance, run } from '@/helpers/instance' +import { + can_current_user_use_shared_instances, + get as getInstance, + get_global_synced_options, + run, +} from '@/helpers/instance' import { get as getCreds, login, logout } from '@/helpers/mr_auth.ts' import { mergeUrlQuery, parseModrinthLink } from '@/helpers/project-links.ts' import { get as getSettings, set as setSettings } from '@/helpers/settings.ts' @@ -423,6 +428,11 @@ const os = ref('') const isDevEnvironment = ref(false) const stateInitialized = ref(false) +const globalSyncedOptionsQuery = useQuery({ + queryKey: ['global-synced-options'], + queryFn: get_global_synced_options, + enabled: computed(() => stateInitialized.value), +}) const criticalErrorMessage = ref() @@ -1814,7 +1824,11 @@ provideAppUpdateDownloadProgress(appUpdateDownload) - + import { CoffeeIcon, - GameIcon, GaugeIcon, HeartHandshakeIcon, LanguagesIcon, ModrinthIcon, PaintbrushIcon, + RefreshCwIcon, Settings2Icon, ShieldIcon, ToggleRightIcon, @@ -33,7 +33,7 @@ import AppearanceSettings from '@/components/ui/settings/display/AppearanceSetti import BehaviorSettings from '@/components/ui/settings/display/BehaviorSettings.vue' import FeatureFlagSettings from '@/components/ui/settings/display/FeatureFlagSettings.vue' import LanguageSettings from '@/components/ui/settings/display/LanguageSettings.vue' -import DefaultInstanceSettings from '@/components/ui/settings/instances/DefaultInstanceSettings.vue' +import InstancesSyncedSettings from '@/components/ui/settings/instances/InstancesSyncedSettings.vue' import JavaSettings from '@/components/ui/settings/instances/JavaSettings.vue' import ResourceManagementSettings from '@/components/ui/settings/instances/ResourceManagementSettings.vue' import { useAppSettings } from '@/composables/use-app-settings.ts' @@ -130,12 +130,12 @@ const tabs = [ }, { name: defineMessage({ - id: 'app.settings.tabs.default-instance-options', - defaultMessage: 'Default game options', + id: 'app.settings.tabs.synced-options', + defaultMessage: 'Synced options', }), category: tabCategories.instances, - icon: GameIcon, - content: DefaultInstanceSettings, + icon: RefreshCwIcon, + content: InstancesSyncedSettings, }, { name: defineMessage({ diff --git a/apps/app-frontend/src/components/ui/settings/instances/DefaultInstanceSettings.vue b/apps/app-frontend/src/components/ui/settings/instances/DefaultInstanceSettings.vue deleted file mode 100644 index ebe9e9af7b..0000000000 --- a/apps/app-frontend/src/components/ui/settings/instances/DefaultInstanceSettings.vue +++ /dev/null @@ -1,362 +0,0 @@ - - - diff --git a/apps/app-frontend/src/components/ui/settings/instances/InstancesSyncedSettings.vue b/apps/app-frontend/src/components/ui/settings/instances/InstancesSyncedSettings.vue new file mode 100644 index 0000000000..8e4985c573 --- /dev/null +++ b/apps/app-frontend/src/components/ui/settings/instances/InstancesSyncedSettings.vue @@ -0,0 +1,959 @@ + + + + + diff --git a/apps/app-frontend/src/components/ui/world/WorldItem.vue b/apps/app-frontend/src/components/ui/world/WorldItem.vue index 8147d0bce0..b1e1ebac41 100644 --- a/apps/app-frontend/src/components/ui/world/WorldItem.vue +++ b/apps/app-frontend/src/components/ui/world/WorldItem.vue @@ -66,7 +66,7 @@ const router = useRouter() const { addNotification } = injectNotificationManager() const emit = defineEmits<{ - (e: 'play' | 'play-instance' | 'update' | 'stop' | 'refresh' | 'edit' | 'delete'): void + (e: 'play' | 'play-instance' | 'update' | 'stop' | 'refresh' | 'edit' | 'delete' | 'desync'): void (e: 'open-folder', world: SingleplayerWorld): void }>() @@ -217,6 +217,10 @@ const messages = defineMessages({ id: 'instance.worlds.copy_address', defaultMessage: 'Copy address', }, + desync: { + id: 'instance.worlds.desync_server', + defaultMessage: 'Desync', + }, viewInstance: { id: 'instance.worlds.view_instance', defaultMessage: 'View instance', @@ -500,6 +504,16 @@ const messages = defineMessages({ shown: world.type === 'server', action: () => copyToClipboard((world as ServerWorld).address), }, + { + id: 'desync', + label: formatMessage(messages.desync), + action: () => emit('desync'), + shown: + !instanceId && + world.type === 'server' && + (world as ServerWorld).source === 'user_synced' && + !!(world as ServerWorld).server_id, + }, { id: 'edit', label: formatMessage(commonMessages.editButton), @@ -577,6 +591,10 @@ const messages = defineMessages({