diff --git a/packages/app/src/app.tsx b/packages/app/src/app.tsx index d0678dc5369..1c3054b60a3 100644 --- a/packages/app/src/app.tsx +++ b/packages/app/src/app.tsx @@ -33,7 +33,7 @@ const Loading = () =>
!x) }, }, + links: { + openExternally: createMemo(() => store.links?.openExternally ?? true), + setOpenExternally(value: boolean) { + if (!store.links) { + setStore("links", { openExternally: value }) + return + } + setStore("links", "openExternally", value) + }, + toggle() { + const current = store.links?.openExternally ?? true + if (!store.links) { + setStore("links", { openExternally: !current }) + return + } + setStore("links", "openExternally", !current) + }, + }, view(sessionKey: string) { touch(sessionKey) scroll.seed(sessionKey) diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx index 39f397ac466..0384c602450 100644 --- a/packages/app/src/pages/layout.tsx +++ b/packages/app/src/pages/layout.tsx @@ -599,6 +599,12 @@ export default function Layout(props: ParentProps) { keybind: "mod+shift+t", onSelect: () => cycleTheme(1), }, + { + id: "links.toggle-external", + title: layout.links.openExternally() ? "Open links in app" : "Open links in browser", + category: "Settings", + onSelect: () => layout.links.toggle(), + }, ] for (const [id, definition] of availableThemeEntries()) { @@ -1236,6 +1242,23 @@ export default function Layout(props: ParentProps) { Share feedback + + + + +
) diff --git a/packages/desktop/src/index.tsx b/packages/desktop/src/index.tsx index f05a28e1488..eefb145ad47 100644 --- a/packages/desktop/src/index.tsx +++ b/packages/desktop/src/index.tsx @@ -292,12 +292,23 @@ root?.addEventListener("mousewheel", (e) => { e.stopPropagation() }) -// Handle external links - open in system browser instead of webview -document.addEventListener("click", (e) => { - const link = (e.target as HTMLElement).closest("a.external-link") as HTMLAnchorElement | null - if (link?.href) { +// Intercept all link clicks and open external URLs in system browser +root?.addEventListener("click", (e) => { + const anchor = (e.target as HTMLElement).closest("a") + if (!anchor) return + + const href = anchor.getAttribute("href") + if (!href) return + + // Only intercept external URLs (http/https) + if (href.startsWith("http://") || href.startsWith("https://")) { + // Check if user wants to open links externally (default: true) + const openExternally = window.__OPENCODE__?.openLinksExternally ?? true + if (!openExternally) return + e.preventDefault() - platform.openLink(link.href) + e.stopPropagation() + void shellOpen(href).catch(() => undefined) } })