| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- 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"]>
- }
|