1- import { app , BrowserWindow , ipcMain } from 'electron' ;
1+ import { app , BrowserWindow , ipcMain , shell } from 'electron' ;
22import path from 'node:path' ;
33import fs from 'node:fs/promises' ;
44import started from 'electron-squirrel-startup' ;
@@ -8,6 +8,30 @@ if (started) app.quit();
88
99let notesDir : string ;
1010
11+ // Open http/https links in the user's default browser instead of navigating
12+ // the Electron window (or spawning an in-app browser window).
13+ const openExternalIfHttp = ( url : string ) : boolean => {
14+ if ( / ^ h t t p s ? : \/ \/ / i. test ( url ) ) {
15+ void shell . openExternal ( url ) ;
16+ return true ;
17+ }
18+ return false ;
19+ } ;
20+
21+ const attachExternalLinkHandlers = ( win : BrowserWindow ) => {
22+ win . webContents . setWindowOpenHandler ( ( { url } ) => {
23+ openExternalIfHttp ( url ) ;
24+ return { action : 'deny' } ;
25+ } ) ;
26+ win . webContents . on ( 'will-navigate' , ( event , url ) => {
27+ // Allow same-origin navigation (e.g. Vite HMR reloads); send links that
28+ // point elsewhere to the default browser.
29+ const currentOrigin = new URL ( win . webContents . getURL ( ) || 'about:blank' ) . origin ;
30+ if ( new URL ( url ) . origin === currentOrigin ) return ;
31+ if ( openExternalIfHttp ( url ) ) event . preventDefault ( ) ;
32+ } ) ;
33+ } ;
34+
1135const createWindow = ( ) => {
1236 const mainWindow = new BrowserWindow ( {
1337 width : 1100 ,
@@ -17,6 +41,8 @@ const createWindow = () => {
1741 } ,
1842 } ) ;
1943
44+ attachExternalLinkHandlers ( mainWindow ) ;
45+
2046 if ( MAIN_WINDOW_VITE_DEV_SERVER_URL ) {
2147 mainWindow . loadURL ( MAIN_WINDOW_VITE_DEV_SERVER_URL ) ;
2248 } else {
@@ -57,6 +83,8 @@ ipcMain.on('open-note-window', (_, noteId: string) => {
5783 } ,
5884 } ) ;
5985
86+ attachExternalLinkHandlers ( win ) ;
87+
6088 if ( MAIN_WINDOW_VITE_DEV_SERVER_URL ) {
6189 win . loadURL ( `${ MAIN_WINDOW_VITE_DEV_SERVER_URL } ?windowNoteId=${ noteId } ` ) ;
6290 } else {
0 commit comments