diff --git a/apps/client/src/components/app_context.ts b/apps/client/src/components/app_context.ts index f7a5dfb1e..cdaf1b137 100644 --- a/apps/client/src/components/app_context.ts +++ b/apps/client/src/components/app_context.ts @@ -128,6 +128,7 @@ export type CommandMappings = { openAboutDialog: CommandData; hideFloatingButtons: {}; hideLeftPane: CommandData; + showRosettaWarning: CommandData; showLeftPane: CommandData; hoistNote: CommandData & { noteId: string }; leaveProtectedSession: CommandData; diff --git a/apps/client/src/desktop.ts b/apps/client/src/desktop.ts index 1a0f7e8a9..e762aa65b 100644 --- a/apps/client/src/desktop.ts +++ b/apps/client/src/desktop.ts @@ -8,6 +8,7 @@ import electronContextMenu from "./menus/electron_context_menu.js"; import glob from "./services/glob.js"; import { t } from "./services/i18n.js"; import options from "./services/options.js"; +import server from "./services/server.js"; import type ElectronRemote from "@electron/remote"; import type Electron from "electron"; import "./stylesheets/bootstrap.scss"; @@ -22,7 +23,10 @@ bundleService.getWidgetBundlesByParent().then(async (widgetBundles) => { const DesktopLayout = (await import("./layouts/desktop_layout.js")).default; appContext.setLayout(new DesktopLayout(widgetBundles)); - appContext.start().catch((e) => { + appContext.start().then(() => { + // Check for Rosetta 2 after the app has fully started + checkRosetta2Warning(); + }).catch((e) => { toastService.showPersistent({ title: t("toast.critical-error.title"), icon: "alert", @@ -114,3 +118,18 @@ function initDarkOrLightMode(style: CSSStyleDeclaration) { const { nativeTheme } = utils.dynamicRequire("@electron/remote") as typeof ElectronRemote; nativeTheme.themeSource = themeSource; } + +async function checkRosetta2Warning() { + if (!utils.isElectron()) return; + + try { + // Check if running under Rosetta 2 by calling the server + const response = await server.get("api/system-info/rosetta-check") as { isRunningUnderRosetta2: boolean }; + if (response.isRunningUnderRosetta2) { + // Trigger the Rosetta 2 warning dialog + appContext.triggerCommand("showRosettaWarning", {}); + } + } catch (error) { + console.warn("Could not check Rosetta 2 status:", error); + } +} diff --git a/apps/client/src/layouts/layout_commons.ts b/apps/client/src/layouts/layout_commons.ts index d9559cde2..9c0716c4f 100644 --- a/apps/client/src/layouts/layout_commons.ts +++ b/apps/client/src/layouts/layout_commons.ts @@ -21,6 +21,7 @@ import ConfirmDialog from "../widgets/dialogs/confirm.js"; import RevisionsDialog from "../widgets/dialogs/revisions.js"; import DeleteNotesDialog from "../widgets/dialogs/delete_notes.js"; import InfoDialog from "../widgets/dialogs/info.js"; +import RosettaWarningDialog from "../widgets/dialogs/rosetta_warning.js"; export function applyModals(rootContainer: RootContainer) { rootContainer @@ -45,4 +46,5 @@ export function applyModals(rootContainer: RootContainer) { .child(new InfoDialog()) .child(new ConfirmDialog()) .child(new PromptDialog()) + .child(new RosettaWarningDialog()) } diff --git a/apps/client/src/widgets/dialogs/rosetta_warning.ts b/apps/client/src/widgets/dialogs/rosetta_warning.ts new file mode 100644 index 000000000..1cd067869 --- /dev/null +++ b/apps/client/src/widgets/dialogs/rosetta_warning.ts @@ -0,0 +1,84 @@ +import BasicWidget from "../basic_widget.js"; +import { Modal } from "bootstrap"; +import utils from "../../services/utils.js"; + +const TPL = /*html*/` +