diff --git a/src/components/modals/download-java-modal.tsx b/src/components/modals/download-java-modal.tsx index 6965ab076..57e1eb8ee 100644 --- a/src/components/modals/download-java-modal.tsx +++ b/src/components/modals/download-java-modal.tsx @@ -14,7 +14,7 @@ import { } from "@chakra-ui/react"; import { openUrl } from "@tauri-apps/plugin-opener"; import { useRouter } from "next/router"; -import { useState } from "react"; +import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { LuExternalLink } from "react-icons/lu"; import { MenuSelector } from "@/components/common/menu-selector"; @@ -23,6 +23,9 @@ import { useToast } from "@/contexts/toast"; import { ConfigService } from "@/services/config"; type VendorKey = "mojang" | "zulu" | "bellsoft" | "oracle"; +const DEFAULT_VENDOR: VendorKey = "mojang"; +const DEFAULT_VERSION = "25" as const; +const DEFAULT_TYPE = "jre" as const; interface JavaVendor { label: string; @@ -56,9 +59,11 @@ export const DownloadJavaModal: React.FC> = ({ const os = config.basicInfo.osType; const arch = config.basicInfo.arch; - const [vendor, setVendor] = useState(""); - const [version, setVersion] = useState<"" | "8" | "11" | "17" | "21">(""); - const [type, setType] = useState<"" | "jdk" | "jre">(""); + const [vendor, setVendor] = useState(DEFAULT_VENDOR); + const [version, setVersion] = useState<"" | "8" | "11" | "17" | "21" | "25">( + DEFAULT_VERSION + ); + const [type, setType] = useState<"" | "jdk" | "jre">(DEFAULT_TYPE); const VENDORS: Record = { mojang: { @@ -114,6 +119,13 @@ export const DownloadJavaModal: React.FC> = ({ }, }; + useEffect(() => { + if (!props.isOpen) return; + setVendor(DEFAULT_VENDOR); + setVersion(DEFAULT_VERSION); + setType(DEFAULT_TYPE); + }, [props.isOpen]); + const handleConfirm = async () => { if (!vendor || !version || !type) return; diff --git a/src/components/modals/launch-process-modal.tsx b/src/components/modals/launch-process-modal.tsx index 3e63730ce..c2d041579 100644 --- a/src/components/modals/launch-process-modal.tsx +++ b/src/components/modals/launch-process-modal.tsx @@ -31,6 +31,7 @@ import { useLauncherConfig } from "@/contexts/config"; import { useGlobalData } from "@/contexts/global-data"; import { useSharedModals } from "@/contexts/shared-modal"; import { useToast } from "@/contexts/toast"; +import { LaunchServiceError } from "@/enums/service-error"; import { InstanceSummary } from "@/models/instance/misc"; import { ResponseError } from "@/models/response"; import { AccountService } from "@/services/account"; @@ -55,7 +56,8 @@ const LaunchProcessModal: React.FC = ({ const { config } = useLauncherConfig(); const primaryColor = config.appearance.theme.primaryColor; const { selectedPlayer, getInstanceList } = useGlobalData(); - const { openSharedModal } = useSharedModals(); + const { openSharedModal, openGenericConfirmDialog, closeSharedModal } = + useSharedModals(); const [launchingInstance, setLaunchingInstance] = useState(); const [errorPaused, setErrorPaused] = useState(false); @@ -88,7 +90,18 @@ const LaunchProcessModal: React.FC = ({ function: () => LaunchService.selectSuitableJRE(instanceId), isOK: (data: any) => true, onResCallback: (data: any) => {}, - onErrCallback: (error: ResponseError) => {}, // TODO + onErrCallback: (error: ResponseError) => { + if (error.raw_error === LaunchServiceError.NoSuitableJava) { + openGenericConfirmDialog({ + title: t("NoSuitableJavaDialog.title"), + body: t("NoSuitableJavaDialog.body"), + onOKCallback: () => { + router.push("/settings/java"); + closeSharedModal("launch"); + }, + }); + } + }, }, { label: "validateGameFiles", @@ -152,13 +165,16 @@ const LaunchProcessModal: React.FC = ({ ], [ activeStep, + closeSharedModal, handleCloseModalWithCancel, instanceId, + openGenericConfirmDialog, openSharedModal, quickPlaySingleplayer, quickPlayMultiplayer, router, selectedPlayer, + t, toast, ] ); diff --git a/src/enums/service-error.ts b/src/enums/service-error.ts index f73c7d43f..cd32c6106 100644 --- a/src/enums/service-error.ts +++ b/src/enums/service-error.ts @@ -35,3 +35,7 @@ export enum ResourceServiceError { ParseError = "PARSE_ERROR", NoDownloadApi = "NO_DOWNLOAD_API", } + +export enum LaunchServiceError { + NoSuitableJava = "NO_SUITABLE_JAVA", +} diff --git a/src/locales/en.json b/src/locales/en.json index cd36e2f95..b0c54fc67 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -1419,6 +1419,10 @@ "MenuSelector": { "selectedCount": "{{count}} selected" }, + "NoSuitableJavaDialog": { + "title": "No suitable Java runtime found for this instance", + "body": "No suitable Java runtime is available for this instance. Click \"Confirm\" to open Java Management page and add or download Java manually." + }, "NotFoundPage": { "text": "Page not found, redirecting to launch page in {{seconds}} seconds..." }, diff --git a/src/locales/zh-Hans.json b/src/locales/zh-Hans.json index a32da9fb8..500b6ec3c 100644 --- a/src/locales/zh-Hans.json +++ b/src/locales/zh-Hans.json @@ -1419,6 +1419,10 @@ "MenuSelector": { "selectedCount": "已选 {{count}} 项" }, + "NoSuitableJavaDialog": { + "title": "未找到合适的 Java 运行时", + "body": "对于当前实例,没有合适的 Java 运行时可供选择。点击 “确定” 以前往 Java 管理页面手动添加或下载 Java。" + }, "NotFoundPage": { "text": "页面不存在,即将在 {{seconds}} 秒后跳转" },