/
Alex_Ural
/
opencode
Обзор
Документация
Войти
/
Alex_Ural
/
opencode
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
dev
packages/desktop/src/main/menu.ts
67 строк
2 KB
opencode-agent[bot]
chore: generate
20 май 2026, 07:29
20 май 2026, 07:29
4702cdd
Код
Авторство
О чём код?
import { BrowserWindow, Menu, shell } from "electron" import type { MenuItemConstructorOptions } from "electron" import { DESKTOP_MENU, desktopMenuVisible, type DesktopMenuEntry, type DesktopMenuRole, } from "@opencode-ai/app/desktop-menu" import { UPDATER_ENABLED } from "./constants" import { runDesktopMenuAction } from "./desktop-menu-actions" type Deps = { trigger: (id: string) => void checkForUpdates: () => void relaunch: () => void } export function createMenu(deps: Deps) { if (process.platform !== "darwin") return const template = DESKTOP_MENU.filter((menu) => desktopMenuVisible(menu, "macos")).map((menu) => { if (menu.role) return { role: nativeRole(menu.role) } return { label: menu.label, submenu: menu.items ?.filter((entry) => desktopMenuVisible(entry, "macos")) .map((entry) => nativeItem(entry, deps)), } }) Menu.setApplicationMenu(Menu.buildFromTemplate(template)) } function nativeItem(entry: DesktopMenuEntry, deps: Deps): MenuItemConstructorOptions { if (entry.type === "separator") return { type: "separator" } if (entry.role) return { role: nativeRole(entry.role) } const item: MenuItemConstructorOptions = { label: entry.label, accelerator: entry.accelerator?.macos, enabled: entry.enabled === "updater" ? UPDATER_ENABLED : undefined, } if (entry.command) { const command = entry.command item.click = () => deps.trigger(command) } if (entry.action) { const action = entry.action item.click = () => runDesktopMenuAction(BrowserWindow.getFocusedWindow(), action, { checkForUpdates: deps.checkForUpdates, relaunch: deps.relaunch, }) } if (entry.href) { const href = entry.href item.click = () => shell.openExternal(href) } return item } function nativeRole(role: DesktopMenuRole) { return role as NonNullable<MenuItemConstructorOptions["role"]> }