Skip to content

Commit 8674278

Browse files
authored
Merge branch 'dev' into fix/file-url-encoding-upstream
2 parents aa35324 + 981b80d commit 8674278

File tree

7 files changed

+144
-34
lines changed

7 files changed

+144
-34
lines changed

.prettierignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
sst-env.d.ts
2-
desktop/src/bindings.ts
2+
packages/desktop/src/bindings.ts

packages/app/src/app.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import { HighlightsProvider } from "@/context/highlights"
3030
import Layout from "@/pages/layout"
3131
import DirectoryLayout from "@/pages/directory-layout"
3232
import { ErrorPage } from "./pages/error"
33-
import { Suspense } from "solid-js"
33+
import { Suspense, JSX } from "solid-js"
3434

3535
const Home = lazy(() => import("@/pages/home"))
3636
const Session = lazy(() => import("@/pages/session"))
@@ -84,7 +84,7 @@ function ServerKey(props: ParentProps) {
8484
)
8585
}
8686

87-
export function AppInterface(props: { defaultUrl?: string }) {
87+
export function AppInterface(props: { defaultUrl?: string; children?: JSX.Element }) {
8888
const platform = usePlatform()
8989

9090
const stored = (() => {
@@ -111,15 +111,18 @@ export function AppInterface(props: { defaultUrl?: string }) {
111111
<GlobalSDKProvider>
112112
<GlobalSyncProvider>
113113
<Router
114-
root={(props) => (
114+
root={(routerProps) => (
115115
<SettingsProvider>
116116
<PermissionProvider>
117117
<LayoutProvider>
118118
<NotificationProvider>
119119
<ModelsProvider>
120120
<CommandProvider>
121121
<HighlightsProvider>
122-
<Layout>{props.children}</Layout>
122+
<Layout>
123+
{props.children}
124+
{routerProps.children}
125+
</Layout>
123126
</HighlightsProvider>
124127
</CommandProvider>
125128
</ModelsProvider>

packages/app/src/components/titlebar.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,21 @@ export function Titlebar() {
8282
navigate(to)
8383
}
8484

85+
command.register(() => [
86+
{
87+
id: "common.goBack",
88+
title: language.t("common.goBack"),
89+
category: language.t("command.category.view"),
90+
onSelect: back,
91+
},
92+
{
93+
id: "common.goForward",
94+
title: language.t("common.goForward"),
95+
category: language.t("command.category.view"),
96+
onSelect: forward,
97+
},
98+
])
99+
85100
const getWin = () => {
86101
if (platform.platform !== "desktop") return
87102

packages/app/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export { PlatformProvider, type Platform } from "./context/platform"
22
export { AppBaseProviders, AppInterface } from "./app"
3+
export { useCommand } from "./context/command"

packages/desktop/src/bindings.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// This file has been generated by Tauri Specta. Do not edit this file manually.
22

3-
import { invoke as __TAURI_INVOKE, Channel } from "@tauri-apps/api/core"
3+
import { invoke as __TAURI_INVOKE } from "@tauri-apps/api/core"
44

55
/** Commands */
66
export const commands = {

packages/desktop/src/index.tsx

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// @refresh reload
22
import { webviewZoom } from "./webview-zoom"
33
import { render } from "solid-js/web"
4-
import { AppBaseProviders, AppInterface, PlatformProvider, Platform } from "@opencode-ai/app"
4+
import { AppBaseProviders, AppInterface, PlatformProvider, Platform, useCommand } from "@opencode-ai/app"
55
import { open, save } from "@tauri-apps/plugin-dialog"
66
import { getCurrent, onOpenUrl } from "@tauri-apps/plugin-deep-link"
77
import { openPath as openerOpenPath } from "@tauri-apps/plugin-opener"
@@ -18,11 +18,11 @@ import { Splash } from "@opencode-ai/ui/logo"
1818
import { createSignal, Show, Accessor, JSX, createResource, onMount, onCleanup } from "solid-js"
1919

2020
import { UPDATER_ENABLED } from "./updater"
21-
import { createMenu } from "./menu"
2221
import { initI18n, t } from "./i18n"
2322
import pkg from "../package.json"
2423
import "./styles.css"
2524
import { commands } from "./bindings"
25+
import { createMenu } from "./menu"
2626

2727
const root = document.getElementById("root")
2828
if (import.meta.env.DEV && !(root instanceof HTMLElement)) {
@@ -342,7 +342,10 @@ const createPlatform = (password: Accessor<string | null>): Platform => ({
342342
webviewZoom,
343343
})
344344

345-
createMenu()
345+
let menuTrigger = null as null | ((id: string) => void)
346+
createMenu((id) => {
347+
menuTrigger?.(id)
348+
})
346349
void listenForDeepLinks()
347350

348351
render(() => {
@@ -373,7 +376,19 @@ render(() => {
373376
window.__OPENCODE__ ??= {}
374377
window.__OPENCODE__.serverPassword = data().password ?? undefined
375378

376-
return <AppInterface defaultUrl={data().url} />
379+
function Inner() {
380+
const cmd = useCommand()
381+
382+
menuTrigger = (id) => cmd.trigger(id)
383+
384+
return null
385+
}
386+
387+
return (
388+
<AppInterface defaultUrl={data().url}>
389+
<Inner />
390+
</AppInterface>
391+
)
377392
}}
378393
</ServerGate>
379394
</AppBaseProviders>

packages/desktop/src/menu.ts

Lines changed: 100 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import { Menu, MenuItem, PredefinedMenuItem, Submenu } from "@tauri-apps/api/menu"
22
import { type as ostype } from "@tauri-apps/plugin-os"
33
import { relaunch } from "@tauri-apps/plugin-process"
4+
import { openUrl } from "@tauri-apps/plugin-opener"
45

56
import { runUpdater, UPDATER_ENABLED } from "./updater"
67
import { installCli } from "./cli"
78
import { initI18n, t } from "./i18n"
89
import { commands } from "./bindings"
910

10-
export async function createMenu() {
11+
export async function createMenu(trigger: (id: string) => void) {
1112
if (ostype() !== "macos") return
1213

1314
await initI18n()
@@ -60,29 +61,27 @@ export async function createMenu() {
6061
}),
6162
].filter(Boolean),
6263
}),
63-
// await Submenu.new({
64-
// text: "File",
65-
// items: [
66-
// await MenuItem.new({
67-
// enabled: false,
68-
// text: "Open Project...",
69-
// }),
70-
// await PredefinedMenuItem.new({
71-
// item: "Separator"
72-
// }),
73-
// await MenuItem.new({
74-
// enabled: false,
75-
// text: "New Session",
76-
// }),
77-
// await PredefinedMenuItem.new({
78-
// item: "Separator"
79-
// }),
80-
// await MenuItem.new({
81-
// enabled: false,
82-
// text: "Close Project",
83-
// })
84-
// ]
85-
// }),
64+
await Submenu.new({
65+
text: "File",
66+
items: [
67+
await MenuItem.new({
68+
text: "New Session",
69+
accelerator: "Shift+Cmd+S",
70+
action: () => trigger("session.new"),
71+
}),
72+
await MenuItem.new({
73+
text: "Open Project...",
74+
accelerator: "Cmd+O",
75+
action: () => trigger("project.open"),
76+
}),
77+
await PredefinedMenuItem.new({
78+
item: "Separator",
79+
}),
80+
await PredefinedMenuItem.new({
81+
item: "CloseWindow",
82+
}),
83+
],
84+
}),
8685
await Submenu.new({
8786
text: "Edit",
8887
items: [
@@ -109,6 +108,83 @@ export async function createMenu() {
109108
}),
110109
],
111110
}),
111+
await Submenu.new({
112+
text: "View",
113+
items: [
114+
await MenuItem.new({
115+
action: () => trigger("sidebar.toggle"),
116+
text: "Toggle Sidebar",
117+
accelerator: "Cmd+B",
118+
}),
119+
await MenuItem.new({
120+
action: () => trigger("terminal.toggle"),
121+
text: "Toggle Terminal",
122+
accelerator: "Ctrl+`",
123+
}),
124+
await MenuItem.new({
125+
action: () => trigger("fileTree.toggle"),
126+
text: "Toggle File Tree",
127+
}),
128+
await PredefinedMenuItem.new({
129+
item: "Separator",
130+
}),
131+
await MenuItem.new({
132+
action: () => trigger("common.goBack"),
133+
text: "Back",
134+
}),
135+
await MenuItem.new({
136+
action: () => trigger("common.goForward"),
137+
text: "Forward",
138+
}),
139+
await PredefinedMenuItem.new({
140+
item: "Separator",
141+
}),
142+
await MenuItem.new({
143+
action: () => trigger("session.previous"),
144+
text: "Previous Session",
145+
accelerator: "Option+ArrowUp",
146+
}),
147+
await MenuItem.new({
148+
action: () => trigger("session.next"),
149+
text: "Next Session",
150+
accelerator: "Option+ArrowDown",
151+
}),
152+
await PredefinedMenuItem.new({
153+
item: "Separator",
154+
}),
155+
],
156+
}),
157+
await Submenu.new({
158+
text: "Help",
159+
items: [
160+
// missing native macos search
161+
await MenuItem.new({
162+
action: () => openUrl("https://opencode.ai/docs"),
163+
text: "OpenCode Documentation",
164+
}),
165+
await MenuItem.new({
166+
action: () => openUrl("https://discord.com/invite/opencode"),
167+
text: "Support Forum",
168+
}),
169+
await PredefinedMenuItem.new({
170+
item: "Separator",
171+
}),
172+
// await MenuItem.new({
173+
// text: "Release Notes",
174+
// }),
175+
await PredefinedMenuItem.new({
176+
item: "Separator",
177+
}),
178+
await MenuItem.new({
179+
action: () => openUrl("https://github.com/anomalyco/opencode/issues/new?template=feature_request.yml"),
180+
text: "Share Feedback",
181+
}),
182+
await MenuItem.new({
183+
action: () => openUrl("https://github.com/anomalyco/opencode/issues/new?template=bug_report.yml"),
184+
text: "Report a Bug",
185+
}),
186+
],
187+
}),
112188
],
113189
})
114190
menu.setAsAppMenu()

0 commit comments

Comments
 (0)