diff --git a/src-electron/main.js b/src-electron/main.js index 386314bf..b548c491 100644 --- a/src-electron/main.js +++ b/src-electron/main.js @@ -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; @@ -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); diff --git a/src-electron/package.json b/src-electron/package.json index 9b312c13..6d3a0c57 100644 --- a/src-electron/package.json +++ b/src-electron/package.json @@ -22,4 +22,4 @@ "electron": "^40.0.0", "electron-builder": "^24.13.3" } -} \ No newline at end of file +} diff --git a/src-electron/preload.js b/src-electron/preload.js index 6ef2ef49..0a2a9a64 100644 --- a/src-electron/preload.js +++ b/src-electron/preload.js @@ -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'), @@ -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') });