fix(electron): preserve changelog on download + reliable restart-to-update

- useUpdateStore: keep sidecar-sourced body when merging fresh desktopInfo
  (electron-updater returns 'See release notes at ...' which clobbered it)
- main.mjs: defer quitAndInstall/relaunch via setImmediate so IPC reply
  flushes first; wire update-downloaded and error events; log restart path
This commit is contained in:
Bohdan Triapitsyn
2026-04-22 00:57:58 +03:00
parent 2a0aef89d5
commit be65a9bd1f
2 changed files with 34 additions and 7 deletions
+30 -7
View File
@@ -1355,6 +1355,17 @@ const setupAutoUpdater = () => {
},
}));
});
autoUpdater.on('update-downloaded', (info) => {
log.info(`[electron] update-downloaded version=${info?.version || 'unknown'}`);
if (state.pendingUpdate) {
state.pendingUpdate.downloaded = true;
}
});
autoUpdater.on('error', (err) => {
log.error('[electron] autoUpdater error', err);
});
};
const parseRelevantChangelogNotes = async (fromVersion, toVersion) => {
@@ -1892,14 +1903,26 @@ const handleInvoke = async (browserWindow, command, args = {}) => {
}));
return null;
case 'desktop_restart':
if (state.pendingUpdate?.downloaded && app.isPackaged) {
autoUpdater.quitAndInstall(false, true);
return null;
}
app.relaunch();
app.exit(0);
case 'desktop_restart': {
const applyUpdate = Boolean(state.pendingUpdate?.downloaded && app.isPackaged);
log.info(`[electron] desktop_restart applyUpdate=${applyUpdate} packaged=${app.isPackaged}`);
// Defer so the IPC reply flushes before the app starts shutting down.
// Without this, quitAndInstall() can race with the renderer's pending
// invoke and the restart appears to do nothing from the UI side.
setImmediate(() => {
try {
if (applyUpdate) {
autoUpdater.quitAndInstall(false, true);
} else {
app.relaunch();
app.exit(0);
}
} catch (err) {
log.error('[electron] desktop_restart failed', err);
}
});
return null;
}
case 'desktop_get_lan_address':
return await detectLanIPv4Address();
+4
View File
@@ -244,6 +244,10 @@ export const useUpdateStore = create<UpdateStore>()((set, get) => ({
? {
...state.info,
...desktopInfo,
// Keep the richer sidecar-sourced changelog; desktopInfo.body is
// often the bare "See release notes at..." fallback from the
// updater and would otherwise clobber the nice changelog.
body: state.info.body || desktopInfo.body,
available: state.info.available,
}
: desktopInfo,