diff --git a/apps/desktop/src/api/commands/cluster.rs b/apps/desktop/src/api/commands/cluster.rs index b268c00a..432dd254 100644 --- a/apps/desktop/src/api/commands/cluster.rs +++ b/apps/desktop/src/api/commands/cluster.rs @@ -7,6 +7,7 @@ use onelauncher::cluster::{self}; use onelauncher::data::{Loader, PackageData}; use onelauncher::processor::DetailedProcess; use onelauncher::store::{Cluster, ClusterPath}; +use onelauncher::utils::java::JavaVersion; use onelauncher::State; use serde::{Deserialize, Serialize}; use specta::Type; @@ -195,3 +196,10 @@ pub async fn get_worlds(uuid: Uuid) -> Result, String> { Ok(screenshots) } + +#[specta::specta] +#[tauri::command] +pub async fn get_optimal_java_version(cluster_id: Uuid) -> Result { + let cluster_path = cluster::get_by_uuid(cluster_id).await?.ok_or("Cluster not found")?.cluster_path(); + Ok(cluster::get_optimal_java_version(&cluster_path).await?.ok_or("No Java version found")?) +} \ No newline at end of file diff --git a/apps/desktop/src/api/commands/mod.rs b/apps/desktop/src/api/commands/mod.rs index d62b8dd4..b659e31e 100644 --- a/apps/desktop/src/api/commands/mod.rs +++ b/apps/desktop/src/api/commands/mod.rs @@ -1,5 +1,6 @@ use interpulse::api::minecraft::Version; use onelauncher::data::Settings; +use onelauncher::game::metadata; use onelauncher::settings; use tauri::{AppHandle, Manager}; @@ -42,6 +43,7 @@ macro_rules! collect_commands { upload_log, get_screenshots, get_worlds, + get_optimal_java_version, // Processor get_running_clusters, get_processes_by_path, diff --git a/apps/frontend/src/ui/pages/cluster/ClusterRoot.tsx b/apps/frontend/src/ui/pages/cluster/ClusterRoot.tsx index 56dd7156..b99a3abd 100644 --- a/apps/frontend/src/ui/pages/cluster/ClusterRoot.tsx +++ b/apps/frontend/src/ui/pages/cluster/ClusterRoot.tsx @@ -44,7 +44,7 @@ function ClusterRoutes() { } function ClusterRoot(props: ParentProps) { - const [searchParams] = useSearchParams(); + const [searchParams] = useSearchParams<{ id: string }>(); return ( diff --git a/apps/frontend/src/ui/pages/cluster/ClusterSettings.tsx b/apps/frontend/src/ui/pages/cluster/ClusterSettings.tsx index a11ac04a..17138419 100644 --- a/apps/frontend/src/ui/pages/cluster/ClusterSettings.tsx +++ b/apps/frontend/src/ui/pages/cluster/ClusterSettings.tsx @@ -40,7 +40,8 @@ function PageSettings(cluster: Accessor) { const postCommand = createSetting(cluster().init_hooks?.post, settings().init_hooks.post ?? ''); // JVM - const javaVersion = createSetting(cluster().java?.custom_version || null); + const javaVersion = createSetting(cluster().java?.custom_version || null); + const javaVersions = settings().java_versions; const javaArgs = createSetting(cluster().java?.custom_arguments, settings().custom_java_args); const envVars = createSetting(cluster().java?.custom_env_arguments, settings().custom_env_args); @@ -96,8 +97,9 @@ function PageSettings(cluster: Accessor) { | undefined; - javaVersions: CreateSetting | undefined; javaArgs: CreateSetting; envVars: CreateSetting<[string, string][]>; -}) { - const modal = createModal(controller => ); +} & ({ + clusterId: string; + javaVersion: CreateSetting; + javaVersions: JavaVersions; +} | { + javaVersion: undefined; + javaVersions: CreateSetting; +})) { + const modal = createModal((controller) => { + if (props.javaVersion) + return ( + + ); + else return ( + + ); + }); return ( <> @@ -442,8 +463,119 @@ function PageSettings() { export default SettingsMinecraft; -function JavaVersionModal(props: ModalProps & { - javaVersions: CreateSetting | undefined; +function ClusterJavaVersionModal(props: ModalProps & { + clusterId: string; + javaVersion: CreateSetting; + javaVersions: JavaVersions; +}) { + const [_, modalProps] = splitProps(props, ['javaVersion', 'javaVersions']); + + const javaVersions = createMemo(() => Object.entries(props.javaVersions).sort((a, b) => Number.parseFloat(b[1].version) - Number.parseFloat(a[1].version))); + const [selected, setSelected] = createSignal(0); + + onMount(async () => { + const javaVersion = props.javaVersion.get(); + if (!javaVersion) { + const clusterId = props.clusterId; + const optimal = await tryResult(() => bridge.commands.getOptimalJavaVersion(clusterId)); + setSelected(javaVersions().findIndex(([_, meta]) => meta.path === optimal.path)); + } + else { + const found = javaVersions().findIndex(([_, meta]) => meta.path === javaVersion.path); + setSelected(found); + } + }); + + const setPackage = (pkg: JavaVersion) => { + props.javaVersion.set(pkg); + }; + + const onChange = (selected: number) => { + const version = javaVersions()[selected]?.[0]; + if (!version) + return; + + const meta = props.javaVersions[version]; + if (!meta) + return; + + setPackage(meta); + }; + + return ( + +

Java Path

+
+ + + {([version]) => { + const major = version.toLowerCase().replaceAll('_', ' ').replaceAll('java', ''); + + return ( + + + Java + {major} + + + ); + }} + + +
+
+ ); +} + +function GlobalJavaVersionModal(props: ModalProps & { + javaVersions: CreateSetting; +}) { + const [_, modalProps] = splitProps(props, ['javaVersions']); + + const setPackage = (pkg: JavaVersion, version?: number) => { + props.javaVersions?.set({ + ...props.javaVersions?.get(), + [`JAVA_${version}`]: pkg, + }); + }; + + return ( + +

Default Java Paths

+
+ Number.parseFloat(b[1].version) - Number.parseFloat(a[1].version))}> + {([version, meta]) => { + const major = version.toLowerCase().replaceAll('_', ' ').replaceAll('java', ''); + + return ( + <> + + Java + {major} + + { + setPackage({ ...meta, path: value }, Number.parseInt(major)); + }} + value={meta.path} + /> + + ); + }} + +
+
+ ); +} + +function BaseJavaVersionModal(props: ModalProps & { + setPackage: (pkg: JavaVersion, version?: number) => void; }) { const [selectedPackageIndex, setSelectedPackageIndex] = createSignal(-1); @@ -461,21 +593,14 @@ function JavaVersionModal(props: ModalProps & { return zuluPackages()?.map(pkg => pkg.java_version.join('.')) ?? []; }); - const setPackage = (version: number, pkg: JavaVersion) => { - props.javaVersions?.set({ - ...props.javaVersions?.get(), - [`JAVA_${version}`]: pkg, - }); - }; - const download = async (pkg: JavaZuluPackage) => { const path = await tryResult(() => bridge.commands.installJavaFromPackage(pkg)); if (path) - setPackage(pkg.java_version[0]!, { + props.setPackage({ version: pkg.java_version.join('.'), path, arch: '', - }); + }, pkg.java_version[0]!); }; return ( @@ -492,29 +617,7 @@ function JavaVersionModal(props: ModalProps & { >
-

Default Java Paths

-
- Number.parseFloat(b[1].version) - Number.parseFloat(a[1].version))}> - {([version, meta]) => { - const major = version.toLowerCase().replaceAll('_', ' ').replaceAll('java', ''); - - return ( - <> - - Java - {major} - - { - setPackage(Number.parseInt(major), { ...meta, path: value }); - }} - value={meta.path} - /> - - ); - }} - -
+ {props.children}
diff --git a/packages/client/src/bindings.ts b/packages/client/src/bindings.ts index 30d97b79..75c3ee5c 100644 --- a/packages/client/src/bindings.ts +++ b/packages/client/src/bindings.ts @@ -204,6 +204,16 @@ export const commands = { else return { status: 'error', error: e as any }; } }, + async getOptimalJavaVersion(clusterId: string): Promise> { + try { + return { status: 'ok', data: await TAURI_INVOKE('get_optimal_java_version', { clusterId }) }; + } + catch (e) { + if (e instanceof Error) + throw e; + else return { status: 'error', error: e as any }; + } + }, async getRunningClusters(): Promise> { try { return { status: 'ok', data: await TAURI_INVOKE('get_running_clusters') };