Skip to content

Commit 484d922

Browse files
committed
feat: refactor app upgrade
1 parent 6d0927c commit 484d922

File tree

4 files changed

+146
-27
lines changed

4 files changed

+146
-27
lines changed

src/main/app_updater.ts

+83-25
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,98 @@
1-
import { dialog } from 'electron';
1+
/* eslint-disable class-methods-use-this */
2+
import { dialog, BrowserWindow } from 'electron';
23
import { autoUpdater } from 'electron-updater';
34
import log from 'electron-log';
45

56
export default class AppUpdater {
6-
constructor() {
7+
private mainWindow: BrowserWindow;
8+
9+
constructor(window: BrowserWindow) {
10+
this.mainWindow = window;
11+
this.init();
12+
}
13+
14+
private init() {
715
log.transports.file.level = 'info';
816
autoUpdater.logger = log;
9-
autoUpdater.checkForUpdatesAndNotify();
17+
18+
// 检查更新出错
1019
autoUpdater.on('error', (error) => {
1120
log.error(['检查更新失败', error]);
21+
dialog.showErrorBox('更新出错', error.message);
1222
});
13-
autoUpdater.on('update-available', (info) => {
14-
log.info('检查到有更新,开始下载新版本');
15-
log.info(info);
23+
24+
// 检测到新版本
25+
autoUpdater.on('update-available', async (info) => {
26+
log.info('检测到新版本:', info);
27+
28+
// 显示更新确认对话框
29+
const { response } = await dialog.showMessageBox({
30+
type: 'info',
31+
title: '发现新版本',
32+
message: `发现新版本 ${info.version}\n是否现在更新?`,
33+
detail: info.releaseNotes?.toString() || '暂无更新说明',
34+
buttons: ['现在更新', '暂不更新'],
35+
cancelId: 1,
36+
});
37+
38+
if (response === 0) {
39+
// 用户同意更新,开始下载
40+
autoUpdater.downloadUpdate();
41+
42+
// 显示进度条窗口
43+
this.mainWindow.webContents.send('show-progress-window');
44+
}
1645
});
46+
47+
// 没有可用更新
1748
autoUpdater.on('update-not-available', () => {
18-
log.info('没有可用更新');
49+
log.info('当前已是最新版本');
50+
dialog.showMessageBox({
51+
title: '检查更新',
52+
message: '当前已是最新版本',
53+
});
1954
});
20-
// 在更新下载完成的时候触发。
21-
autoUpdater.on('update-downloaded', (res) => {
22-
log.info('下载完毕!提示安装更新');
23-
log.info(res);
24-
dialog
25-
.showMessageBox({
26-
title: '升级提示!',
27-
message: '已为您下载最新应用,点击确定马上替换为最新版本!',
28-
})
29-
.then(() => {
30-
log.info('退出应用,安装开始!');
31-
// 重启应用并在下载后安装更新。 它只应在发出 update-downloaded 后方可被调用。
32-
autoUpdater.quitAndInstall();
33-
return null;
34-
})
35-
.catch((e) => {
36-
log.error(e);
37-
});
55+
56+
// 更新下载进度
57+
autoUpdater.on('download-progress', (progressObj) => {
58+
this.mainWindow.webContents.send('update-progress', {
59+
percent: progressObj.percent,
60+
transferred: progressObj.transferred,
61+
total: progressObj.total,
62+
bytesPerSecond: progressObj.bytesPerSecond,
63+
});
64+
});
65+
66+
// 更新下载完成
67+
autoUpdater.on('update-downloaded', async (info) => {
68+
log.info('更新包下载完成:', info);
69+
70+
// 关闭进度条窗口
71+
this.mainWindow.webContents.send('close-progress-window');
72+
73+
// 显示安装确认对话框
74+
const { response } = await dialog.showMessageBox({
75+
type: 'info',
76+
title: '更新就绪',
77+
message: '新版本已下载完成,是否现在安装?',
78+
detail: '点击确定将重启应用并安装更新',
79+
buttons: ['现在安装', '稍后安装'],
80+
cancelId: 1,
81+
});
82+
83+
if (response === 0) {
84+
// 用户同意安装,退出并安装
85+
log.info('开始安装更新...');
86+
autoUpdater.quitAndInstall(false, true);
87+
}
88+
});
89+
}
90+
91+
// 检查更新
92+
public checkForUpdates(): void {
93+
log.info('开始检查更新...');
94+
autoUpdater.checkForUpdates().catch((error: Error) => {
95+
log.error('检查更新失败:', error);
3896
});
3997
}
4098
}

src/main/main.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,8 @@ const createWindow = async () => {
6161
await installExtensions();
6262
}
6363

64-
// eslint-disable-next-line no-new
65-
new AppUpdater();
6664
dashboardWindow = await createDashboardWindow();
65+
new AppUpdater(dashboardWindow);
6766
const api = new API(dashboardWindow, initCheck);
6867
api.listen();
6968
// 创建系统托盘图标
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { Modal, Progress } from 'antd';
2+
3+
interface UpdateProgressProps {
4+
visible: boolean;
5+
progress: number;
6+
status: {
7+
transferred: number;
8+
total: number;
9+
bytesPerSecond: number;
10+
};
11+
}
12+
13+
function UpdateProgress({ visible, progress, status }: UpdateProgressProps) {
14+
return (
15+
<Modal title="下载更新" open={visible} footer={null} closable={false}>
16+
<Progress percent={progress} status="active" />
17+
<div style={{ marginTop: 10 }}>
18+
已下载: {(status.transferred / 1024 / 1024).toFixed(2)} MB / 总大小:{' '}
19+
{(status.total / 1024 / 1024).toFixed(2)} MB
20+
<br />
21+
下载速度: {(status.bytesPerSecond / 1024 / 1024).toFixed(
22+
2,
23+
)} MB/s
24+
</div>
25+
</Modal>
26+
);
27+
}
28+
29+
export default UpdateProgress;

src/renderer/Dashboard/index.tsx

+33
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import {
5252
import { Footer } from 'antd/es/layout/layout';
5353
import Meta from 'antd/es/card/Meta';
5454
import baiduAnalyticsRenderer from './baiduAnalytics';
55+
import UpdateProgress from './components/UpdateProgress';
5556

5657
const { Title } = Typography;
5758
const { Sider, Content } = Layout;
@@ -68,6 +69,13 @@ function Dashboard() {
6869
const [installing, setInstalling] = useState(new Map());
6970
const [selectPluginName, setSelectPluginName] = useState('');
7071
const [setting, SetSetting] = useState(null);
72+
const [progressVisible, setProgressVisible] = useState(false);
73+
const [progress, setProgress] = useState(0);
74+
const [progressStatus, setProgressStatus] = useState({
75+
transferred: 0,
76+
total: 0,
77+
bytesPerSecond: 0,
78+
});
7179

7280
const refreshResult = (plugins: any[]) => {
7381
if (plugins.length == 0) {
@@ -196,6 +204,26 @@ function Dashboard() {
196204
}
197205
};
198206
baiduAnalytics();
207+
208+
// 监听显示进度条窗口
209+
window.electron.ipcRenderer.on('show-progress-window', () => {
210+
setProgressVisible(true);
211+
});
212+
213+
// 监听更新进度
214+
window.electron.ipcRenderer.on('update-progress', (data: any) => {
215+
setProgress(Math.floor(data.percent));
216+
setProgressStatus({
217+
transferred: data.transferred,
218+
total: data.total,
219+
bytesPerSecond: data.bytesPerSecond,
220+
});
221+
});
222+
223+
// 监听关闭进度条窗口
224+
window.electron.ipcRenderer.on('close-progress-window', () => {
225+
setProgressVisible(false);
226+
});
199227
}, []);
200228

201229
const onMenu = (item: any) => {
@@ -569,6 +597,11 @@ function Dashboard() {
569597
<a href="https://www.trumandu.top">TrumanDu</a>
570598
</Footer>
571599
</Layout>
600+
<UpdateProgress
601+
visible={progressVisible}
602+
progress={progress}
603+
status={progressStatus}
604+
/>
572605
</Layout>
573606
);
574607
}

0 commit comments

Comments
 (0)