Skip to content
This repository was archived by the owner on Apr 1, 2026. It is now read-only.

Commit 87efd27

Browse files
committed
tauri: macos-only app menu
1 parent 62f080b commit 87efd27

4 files changed

Lines changed: 102 additions & 3 deletions

File tree

packages/tauri/scripts/predev.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import * as fs from "node:fs/promises"
21
import { $ } from "bun"
32

43
import { copyBinaryToSidecarFolder, getCurrentSidecar } from "./utils"

packages/tauri/src/index.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
// @refresh reload
22
import { render } from "solid-js/web"
33
import { App, PlatformProvider, Platform } from "@opencode-ai/desktop"
4-
import { runUpdater } from "./updater"
54
import { onMount } from "solid-js"
65
import { open, save } from "@tauri-apps/plugin-dialog"
76
import { open as shellOpen } from "@tauri-apps/plugin-shell"
87
import { type as ostype } from "@tauri-apps/plugin-os"
98

9+
import { runUpdater, UPDATER_ENABLED } from "./updater"
10+
import { createMenu } from "./menu"
11+
1012
const root = document.getElementById("root")
1113
if (import.meta.env.DEV && !(root instanceof HTMLElement)) {
1214
throw new Error(
@@ -48,9 +50,11 @@ const platform: Platform = {
4850
},
4951
}
5052

53+
createMenu()
54+
5155
render(() => {
5256
onMount(() => {
53-
if (window.__OPENCODE__?.updaterEnabled) runUpdater()
57+
if (UPDATER_ENABLED) runUpdater()
5458
})
5559

5660
return (

packages/tauri/src/menu.ts

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import { Menu, MenuItem, PredefinedMenuItem, Submenu } from "@tauri-apps/api/menu"
2+
import { type as ostype } from "@tauri-apps/plugin-os"
3+
4+
import { runUpdater, UPDATER_ENABLED } from "./updater"
5+
6+
export async function createMenu() {
7+
if (ostype() !== "macos") return;
8+
9+
const menu = await Menu.new({
10+
items: [
11+
await Submenu.new({
12+
text: "OpenCode",
13+
items: [
14+
await PredefinedMenuItem.new({
15+
item: { About: null },
16+
}),
17+
await MenuItem.new({
18+
enabled: UPDATER_ENABLED,
19+
action: () => runUpdater(),
20+
text: "Check For Updates...",
21+
}),
22+
await PredefinedMenuItem.new({
23+
item: "Separator",
24+
}),
25+
await PredefinedMenuItem.new({
26+
item: "Hide",
27+
}),
28+
await PredefinedMenuItem.new({
29+
item: "HideOthers",
30+
}),
31+
await PredefinedMenuItem.new({
32+
item: "ShowAll",
33+
}),
34+
await PredefinedMenuItem.new({
35+
item: "Separator",
36+
}),
37+
await PredefinedMenuItem.new({
38+
item: "Quit",
39+
}),
40+
].filter(Boolean),
41+
}),
42+
// await Submenu.new({
43+
// text: "File",
44+
// items: [
45+
// await MenuItem.new({
46+
// enabled: false,
47+
// text: "Open Project...",
48+
// }),
49+
// await PredefinedMenuItem.new({
50+
// item: "Separator"
51+
// }),
52+
// await MenuItem.new({
53+
// enabled: false,
54+
// text: "New Session",
55+
// }),
56+
// await PredefinedMenuItem.new({
57+
// item: "Separator"
58+
// }),
59+
// await MenuItem.new({
60+
// enabled: false,
61+
// text: "Close Project",
62+
// })
63+
// ]
64+
// }),
65+
await Submenu.new({
66+
text: "Edit",
67+
items: [
68+
await PredefinedMenuItem.new({
69+
item: "Undo",
70+
}),
71+
await PredefinedMenuItem.new({
72+
item: "Redo",
73+
}),
74+
await PredefinedMenuItem.new({
75+
item: "Separator",
76+
}),
77+
await PredefinedMenuItem.new({
78+
item: "Cut",
79+
}),
80+
await PredefinedMenuItem.new({
81+
item: "Copy",
82+
}),
83+
await PredefinedMenuItem.new({
84+
item: "Paste",
85+
}),
86+
await PredefinedMenuItem.new({
87+
item: "SelectAll",
88+
}),
89+
],
90+
}),
91+
],
92+
})
93+
menu.setAsAppMenu()
94+
}

packages/tauri/src/updater.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { check, DownloadEvent } from "@tauri-apps/plugin-updater"
22
import { relaunch } from "@tauri-apps/plugin-process"
33
import { ask, message } from "@tauri-apps/plugin-dialog"
44

5+
export const UPDATER_ENABLED = window.__OPENCODE__?.updaterEnabled ?? false
6+
57
export async function runUpdater(onDownloadEvent?: (progress: DownloadEvent) => void) {
68
let update
79
try {

0 commit comments

Comments
 (0)