| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- import { Menu, MenuItem, PredefinedMenuItem, Submenu } from "@tauri-apps/api/menu"
- import { type as ostype } from "@tauri-apps/plugin-os"
- import { relaunch } from "@tauri-apps/plugin-process"
- import { openUrl } from "@tauri-apps/plugin-opener"
- import { runUpdater, UPDATER_ENABLED } from "./updater"
- import { installCli } from "./cli"
- import { initI18n, t } from "./i18n"
- import { commands } from "./bindings"
- export async function createMenu(trigger: (id: string) => void) {
- if (ostype() !== "macos") return
- await initI18n()
- const menu = await Menu.new({
- items: [
- await Submenu.new({
- text: "OpenCode",
- items: [
- await PredefinedMenuItem.new({
- item: { About: null },
- }),
- await MenuItem.new({
- enabled: UPDATER_ENABLED,
- action: () => runUpdater({ alertOnFail: true }),
- text: t("desktop.menu.checkForUpdates"),
- }),
- await MenuItem.new({
- action: () => installCli(),
- text: t("desktop.menu.installCli"),
- }),
- await MenuItem.new({
- action: async () => window.location.reload(),
- text: t("desktop.menu.reloadWebview"),
- }),
- await MenuItem.new({
- action: async () => {
- await commands.killSidecar().catch(() => undefined)
- await relaunch().catch(() => undefined)
- },
- text: t("desktop.menu.restart"),
- }),
- await PredefinedMenuItem.new({
- item: "Separator",
- }),
- await PredefinedMenuItem.new({
- item: "Hide",
- }),
- await PredefinedMenuItem.new({
- item: "HideOthers",
- }),
- await PredefinedMenuItem.new({
- item: "ShowAll",
- }),
- await PredefinedMenuItem.new({
- item: "Separator",
- }),
- await PredefinedMenuItem.new({
- item: "Quit",
- }),
- ].filter(Boolean),
- }),
- await Submenu.new({
- text: "File",
- items: [
- await MenuItem.new({
- text: "New Session",
- accelerator: "Shift+Cmd+S",
- action: () => trigger("session.new"),
- }),
- await MenuItem.new({
- text: "Open Project...",
- accelerator: "Cmd+O",
- action: () => trigger("project.open"),
- }),
- await PredefinedMenuItem.new({
- item: "Separator",
- }),
- await PredefinedMenuItem.new({
- item: "CloseWindow",
- }),
- ],
- }),
- await Submenu.new({
- text: "Edit",
- items: [
- await PredefinedMenuItem.new({
- item: "Undo",
- }),
- await PredefinedMenuItem.new({
- item: "Redo",
- }),
- await PredefinedMenuItem.new({
- item: "Separator",
- }),
- await PredefinedMenuItem.new({
- item: "Cut",
- }),
- await PredefinedMenuItem.new({
- item: "Copy",
- }),
- await PredefinedMenuItem.new({
- item: "Paste",
- }),
- await PredefinedMenuItem.new({
- item: "SelectAll",
- }),
- ],
- }),
- await Submenu.new({
- text: "View",
- items: [
- await MenuItem.new({
- action: () => trigger("sidebar.toggle"),
- text: "Toggle Sidebar",
- accelerator: "Cmd+B",
- }),
- await MenuItem.new({
- action: () => trigger("terminal.toggle"),
- text: "Toggle Terminal",
- accelerator: "Ctrl+`",
- }),
- await MenuItem.new({
- action: () => trigger("fileTree.toggle"),
- text: "Toggle File Tree",
- }),
- await PredefinedMenuItem.new({
- item: "Separator",
- }),
- await MenuItem.new({
- action: () => trigger("common.goBack"),
- text: "Back",
- }),
- await MenuItem.new({
- action: () => trigger("common.goForward"),
- text: "Forward",
- }),
- await PredefinedMenuItem.new({
- item: "Separator",
- }),
- await MenuItem.new({
- action: () => trigger("session.previous"),
- text: "Previous Session",
- accelerator: "Option+ArrowUp",
- }),
- await MenuItem.new({
- action: () => trigger("session.next"),
- text: "Next Session",
- accelerator: "Option+ArrowDown",
- }),
- await PredefinedMenuItem.new({
- item: "Separator",
- }),
- ],
- }),
- await Submenu.new({
- text: "Help",
- items: [
- // missing native macos search
- await MenuItem.new({
- action: () => openUrl("https://opencode.ai/docs"),
- text: "OpenCode Documentation",
- }),
- await MenuItem.new({
- action: () => openUrl("https://discord.com/invite/opencode"),
- text: "Support Forum",
- }),
- await PredefinedMenuItem.new({
- item: "Separator",
- }),
- // await MenuItem.new({
- // text: "Release Notes",
- // }),
- await PredefinedMenuItem.new({
- item: "Separator",
- }),
- await MenuItem.new({
- action: () => openUrl("https://github.com/anomalyco/opencode/issues/new?template=feature_request.yml"),
- text: "Share Feedback",
- }),
- await MenuItem.new({
- action: () => openUrl("https://github.com/anomalyco/opencode/issues/new?template=bug_report.yml"),
- text: "Report a Bug",
- }),
- ],
- }),
- ],
- })
- menu.setAsAppMenu()
- }
|