Skip to content

Commit 5030bf4

Browse files
authored
feat: upgrade new layout (#1364)
* feat(update): unify update entrypoints * fix(update): finalize downloaded state * fix(update): sync settings status on entry * fix(update): await renderer status sync * fix(update): adjust fallback actions * fix(update): localize and harden update flow * fix(update): guard sync progress state
1 parent fad615e commit 5030bf4

25 files changed

Lines changed: 1151 additions & 433 deletions

File tree

src/main/events.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ export const WINDOW_EVENTS = {
119119

120120
// Settings related events
121121
export const SETTINGS_EVENTS = {
122-
NAVIGATE: 'settings:navigate'
122+
NAVIGATE: 'settings:navigate',
123+
CHECK_FOR_UPDATES: 'settings:check-for-updates'
123124
}
124125

125126
// ollama 相关事件

src/main/presenter/lifecyclePresenter/hooks/ready/eventListenerSetupHook.ts

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { app } from 'electron'
77
import { optimizer } from '@electron-toolkit/utils'
88
import { LifecycleHook, LifecycleContext } from '@shared/presenter'
99
import { eventBus } from '@/eventbus'
10-
import { WINDOW_EVENTS, TRAY_EVENTS, FLOATING_BUTTON_EVENTS } from '@/events'
10+
import { WINDOW_EVENTS, TRAY_EVENTS, FLOATING_BUTTON_EVENTS, SETTINGS_EVENTS } from '@/events'
1111
import { handleShowHiddenWindow } from '@/utils'
1212
import { presenter } from '@/presenter'
1313
import { LifecyclePhase } from '@shared/lifecycle'
@@ -66,16 +66,42 @@ export const eventListenerSetupHook: LifecycleHook = {
6666
})
6767

6868
// Tray check for updates
69-
eventBus.on(TRAY_EVENTS.CHECK_FOR_UPDATES, () => {
70-
const allWindows = presenter.windowPresenter.getAllWindows()
69+
eventBus.on(TRAY_EVENTS.CHECK_FOR_UPDATES, async () => {
70+
try {
71+
const settingsWindowId = await presenter.windowPresenter.createSettingsWindow()
72+
if (settingsWindowId == null) {
73+
console.warn('eventListenerSetupHook: Failed to open settings window for update check.')
74+
return
75+
}
7176

72-
// Find target window (focused window or first window)
73-
const targetWindow = presenter.windowPresenter.getFocusedWindow() || allWindows![0]
74-
presenter.windowPresenter.show(targetWindow.id)
75-
targetWindow.focus() // Ensure window is on top
77+
const navigateToAbout = () => {
78+
presenter.windowPresenter.sendToWindow(settingsWindowId, SETTINGS_EVENTS.NAVIGATE, {
79+
routeName: 'settings-about'
80+
})
81+
}
7682

77-
// Trigger update
78-
presenter.upgradePresenter.checkUpdate()
83+
const triggerUpdateCheck = () => {
84+
presenter.windowPresenter.sendToWindow(
85+
settingsWindowId,
86+
SETTINGS_EVENTS.CHECK_FOR_UPDATES
87+
)
88+
}
89+
90+
navigateToAbout()
91+
triggerUpdateCheck()
92+
93+
setTimeout(() => {
94+
if (presenter.windowPresenter.getSettingsWindowId() === settingsWindowId) {
95+
navigateToAbout()
96+
triggerUpdateCheck()
97+
}
98+
}, 250)
99+
} catch (error) {
100+
console.error(
101+
'eventListenerSetupHook: Failed to route tray update check to settings window:',
102+
error
103+
)
104+
}
79105
})
80106

81107
// Listen for show/hide window events (triggered from tray or shortcut or floating window)

src/main/presenter/upgradePresenter/index.ts

Lines changed: 63 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const { autoUpdater } = electronUpdater
1616

1717
const GITHUB_OWNER = 'ThinkInAIXYZ'
1818
const GITHUB_REPO = 'deepchat'
19+
const OFFICIAL_DOWNLOAD_URL = 'https://deepchatai.cn/#/download'
1920
const UPDATE_CHANNEL_STABLE = 'stable'
2021
const UPDATE_CHANNEL_BETA = 'beta'
2122

@@ -66,7 +67,7 @@ const toVersionInfo = (info: UpdateInfo): VersionInfo => {
6667
releaseDate: info.releaseDate || '',
6768
releaseNotes: formatReleaseNotes(info.releaseNotes),
6869
githubUrl: releaseUrl,
69-
downloadUrl: releaseUrl
70+
downloadUrl: OFFICIAL_DOWNLOAD_URL
7071
}
7172
}
7273

@@ -120,6 +121,9 @@ export class UpgradePresenter implements IUpgradePresenter {
120121
console.log('无可用更新')
121122
this._lock = false
122123
this._status = 'not-available'
124+
this._error = null
125+
this._progress = null
126+
this._versionInfo = null
123127
eventBus.sendToRenderer(UPDATE_EVENTS.STATUS_CHANGED, SendTarget.ALL_WINDOWS, {
124128
status: this._status,
125129
type: this._lastCheckType
@@ -129,7 +133,10 @@ export class UpgradePresenter implements IUpgradePresenter {
129133
// 有可用更新
130134
autoUpdater.on('update-available', (info) => {
131135
console.log('检测到新版本', info)
136+
this._lock = false
132137
this._versionInfo = toVersionInfo(info)
138+
this._error = null
139+
this._progress = null
133140

134141
if (this._previousUpdateFailed) {
135142
console.log('上次更新失败,本次不进行自动更新,改为手动更新')
@@ -148,8 +155,10 @@ export class UpgradePresenter implements IUpgradePresenter {
148155
status: this._status,
149156
info: this._versionInfo
150157
})
151-
// 检测到更新后自动开始下载
152-
this.startDownloadUpdate()
158+
159+
if (this._lastCheckType === 'autoCheck') {
160+
this.startDownloadUpdate()
161+
}
153162
})
154163

155164
// 下载进度
@@ -172,23 +181,7 @@ export class UpgradePresenter implements IUpgradePresenter {
172181
// 下载完成
173182
autoUpdater.on('update-downloaded', (info) => {
174183
console.log('更新下载完成', info)
175-
this._lock = false
176-
this._status = 'downloaded'
177-
178-
if (!this._versionInfo) {
179-
this._versionInfo = toVersionInfo(info)
180-
}
181-
182-
// 写入更新标记文件
183-
this.writeUpdateMarker(this._versionInfo?.version || info.version)
184-
185-
// 确保保存完整的更新信息
186-
console.log('使用已保存的版本信息:', this._versionInfo)
187-
188-
eventBus.sendToRenderer(UPDATE_EVENTS.STATUS_CHANGED, SendTarget.ALL_WINDOWS, {
189-
status: this._status,
190-
info: this._versionInfo // 使用已保存的版本信息
191-
})
184+
this.markUpdateDownloaded(info)
192185
})
193186

194187
// 监听应用获得焦点事件
@@ -269,6 +262,28 @@ export class UpgradePresenter implements IUpgradePresenter {
269262
}
270263
}
271264

265+
private markUpdateDownloaded(info?: UpdateInfo): void {
266+
this._lock = false
267+
this._status = 'downloaded'
268+
this._error = null
269+
this._progress = null
270+
271+
if (!this._versionInfo && info) {
272+
this._versionInfo = toVersionInfo(info)
273+
}
274+
275+
if (!this._versionInfo) {
276+
console.warn('Downloaded update is missing version info, skipping renderer broadcast.')
277+
return
278+
}
279+
280+
this.writeUpdateMarker(this._versionInfo.version)
281+
eventBus.sendToRenderer(UPDATE_EVENTS.STATUS_CHANGED, SendTarget.ALL_WINDOWS, {
282+
status: this._status,
283+
info: this._versionInfo
284+
})
285+
}
286+
272287
// 处理应用获得焦点事件
273288
private handleAppFocus(): void {
274289
const now = Date.now()
@@ -292,7 +307,9 @@ export class UpgradePresenter implements IUpgradePresenter {
292307

293308
try {
294309
this._status = 'checking'
295-
this._lastCheckType = type
310+
this._error = null
311+
this._progress = null
312+
this._lastCheckType = type ?? 'manualCheck'
296313
eventBus.sendToRenderer(UPDATE_EVENTS.STATUS_CHANGED, SendTarget.ALL_WINDOWS, {
297314
status: this._status
298315
})
@@ -330,15 +347,15 @@ export class UpgradePresenter implements IUpgradePresenter {
330347
}
331348
}
332349

333-
async goDownloadUpgrade(type: 'github' | 'netdisk'): Promise<void> {
334-
const fallbackUrl = `https://github.com/${GITHUB_OWNER}/${GITHUB_REPO}/releases`
350+
async goDownloadUpgrade(type: 'github' | 'official'): Promise<void> {
351+
const githubFallbackUrl = `https://github.com/${GITHUB_OWNER}/${GITHUB_REPO}/releases`
335352
if (type === 'github') {
336-
const url = this._versionInfo?.githubUrl || fallbackUrl
353+
const url = this._versionInfo?.githubUrl || githubFallbackUrl
337354
if (url) {
338355
shell.openExternal(url)
339356
}
340-
} else if (type === 'netdisk') {
341-
const url = this._versionInfo?.downloadUrl || fallbackUrl
357+
} else if (type === 'official') {
358+
const url = this._versionInfo?.downloadUrl || OFFICIAL_DOWNLOAD_URL
342359
if (url) {
343360
shell.openExternal(url)
344361
}
@@ -356,7 +373,26 @@ export class UpgradePresenter implements IUpgradePresenter {
356373
status: this._status,
357374
info: this._versionInfo // 使用已保存的版本信息
358375
})
359-
autoUpdater.downloadUpdate()
376+
void autoUpdater
377+
.downloadUpdate()
378+
.then(() => {
379+
if (this._status !== 'downloaded') {
380+
console.log(
381+
'downloadUpdate resolved before update-downloaded event, applying fallback downloaded status'
382+
)
383+
this.markUpdateDownloaded()
384+
}
385+
})
386+
.catch((error: Error | unknown) => {
387+
this._lock = false
388+
this._status = 'error'
389+
this._error = error instanceof Error ? error.message : String(error)
390+
eventBus.sendToRenderer(UPDATE_EVENTS.STATUS_CHANGED, SendTarget.ALL_WINDOWS, {
391+
status: this._status,
392+
error: this._error,
393+
info: this._versionInfo
394+
})
395+
})
360396
return true
361397
} catch (error: Error | unknown) {
362398
this._status = 'error'

0 commit comments

Comments
 (0)