Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 38 additions & 1 deletion src-electron/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,12 @@ function getSrcNodePath() {
}

// In-memory key-value store shared across all windows (mirrors Tauri's put_item/get_all_items)
// Used for multi-window storage synchronization
// Used for multi-window storage synchronization - ONLY for use by storage.js
const sharedStorageMap = new Map();

// Update scheduled flag - shared across all windows for app updater
let updateScheduled = false;

// Hidden metrics window for Google Analytics
let metricsWindow = null;

Expand Down Expand Up @@ -225,6 +228,40 @@ ipcMain.on('send-health-metric', (event, payload) => {
}
});

/**
* App updater IPC handlers
* These provide low-level APIs for the update-electron.js extension in Phoenix
*/

// Get app version from config
ipcMain.handle('get-app-version', (event) => {
assertTrusted(event);
return version;
});

// Check if app is packaged (production build)
ipcMain.handle('is-packaged', (event) => {
assertTrusted(event);
return app.isPackaged;
});

// Get executable path (path to the AppImage on Linux)
ipcMain.handle('get-executable-path', (event) => {
assertTrusted(event);
return process.execPath;
});

// Update scheduled state - shared across windows for multi-window update persistence
ipcMain.handle('set-update-scheduled', (event, scheduled) => {
assertTrusted(event);
updateScheduled = scheduled;
});

ipcMain.handle('get-update-scheduled', (event) => {
assertTrusted(event);
return updateScheduled;
});

// Handle quit request from renderer
app.on('quit-requested', (exitCode) => {
gracefulShutdown(exitCode);
Expand Down
2 changes: 1 addition & 1 deletion src-electron/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,4 @@
"electron": "^40.0.0",
"electron-builder": "^24.13.3"
}
}
}
14 changes: 12 additions & 2 deletions src-electron/preload.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,10 @@ contextBridge.exposeInMainWorld('electronAPI', {
// Set zoom factor on the webview (mirrors Tauri's zoom_window)
zoomWindow: (scaleFactor) => ipcRenderer.invoke('zoom-window', scaleFactor),

// In-memory storage for multi-window sync (mirrors Tauri's put_item/get_all_items)
/**
* In-memory storage for multi-window sync (mirrors Tauri's put_item/get_all_items)
* WARNING: These APIs are ONLY for use by storage.js - do not use elsewhere
*/
putItem: (key, value) => ipcRenderer.invoke('put-item', key, value),
getAllItems: () => ipcRenderer.invoke('get-all-items'),

Expand Down Expand Up @@ -160,5 +163,12 @@ contextBridge.exposeInMainWorld('electronAPI', {

// Health metrics for Google Analytics (sends to hidden metrics window)
sendHealthMetric: (payload) => ipcRenderer.send('send-health-metric', payload),
onHealthMetric: (callback) => ipcRenderer.on('health-metric', (_event, payload) => callback(payload))
onHealthMetric: (callback) => ipcRenderer.on('health-metric', (_event, payload) => callback(payload)),

// App updater APIs - just expose primitives, logic is in update-electron.js
getAppVersion: () => ipcRenderer.invoke('get-app-version'),
isPackaged: () => ipcRenderer.invoke('is-packaged'),
getExecutablePath: () => ipcRenderer.invoke('get-executable-path'),
setUpdateScheduled: (scheduled) => ipcRenderer.invoke('set-update-scheduled', scheduled),
getUpdateScheduled: () => ipcRenderer.invoke('get-update-scheduled')
});
Loading