Files
web-fusion/src/hooks/useUpdate.js

141 lines
3.7 KiB
JavaScript
Raw Normal View History

2026-02-04 19:56:19 +08:00
import { ref, onMounted, onUnmounted } from 'vue'
import { isElectron } from '../utils/electronBridge'
// NOTE: Since we are using JS, we don't have interfaces, but structure remains same.
/**
* 应用更新 Hook (Vue Composable)
* 管理更新状态进度和操作
* 注意 Composable 仅在 Electron 环境中有效
*/
export function useUpdate() {
const status = ref('idle')
const updateInfo = ref(null)
const progress = ref(null)
const error = ref(null)
const currentVersion = ref('')
// 获取当前版本
const fetchVersion = () => {
if (!isElectron()) {
currentVersion.value = 'web'
return
}
window.electronAPI.getAppVersion().then(v => {
currentVersion.value = v
}).catch(console.error)
}
let unsubList = []
// 监听更新事件
const setupListeners = () => {
if (!isElectron()) return
const api = window.electronAPI
// 正在检查
if (api.onUpdateChecking) {
unsubList.push(api.onUpdateChecking(() => {
status.value = 'checking'
}))
}
// 发现新版本
unsubList.push(api.onUpdateAvailable((info) => {
updateInfo.value = info
status.value = 'available'
error.value = null
}))
// 无可用更新
if (api.onUpdateNotAvailable) {
unsubList.push(api.onUpdateNotAvailable(() => {
status.value = 'idle'
}))
}
unsubList.push(api.onUpdateProgress((prog) => {
progress.value = prog
status.value = 'downloading'
}))
unsubList.push(api.onUpdateDownloaded(() => {
status.value = 'downloaded'
progress.value = null
}))
unsubList.push(api.onUpdateError((err) => {
error.value = err.message
status.value = 'error'
}))
2026-03-09 11:26:01 +08:00
// macOS 手动安装提示
if (api.onUpdateManualInstall) {
unsubList.push(api.onUpdateManualInstall((info) => {
console.log('macOS 需要手动安装更新:', info.path)
// 显示提示让用户知道需要手动安装
alert(`更新已下载完成!\n\n请手动安装更新文件:\n${info.path}\n\n应用将退出。`)
}))
}
2026-02-04 19:56:19 +08:00
}
onMounted(() => {
fetchVersion()
setupListeners()
})
onUnmounted(() => {
unsubList.forEach(unsub => unsub && unsub())
unsubList = []
})
const checkForUpdates = () => {
if (!isElectron()) return
status.value = 'checking'
error.value = null
window.electronAPI.checkForUpdates().then((hasUpdate) => {
if (!hasUpdate) {
status.value = 'idle'
}
}).catch((e) => {
error.value = e.message
status.value = 'error'
})
}
const downloadUpdate = () => {
if (!isElectron()) return
status.value = 'downloading'
progress.value = { percent: 0, bytesPerSecond: 0, transferred: 0, total: 0 }
window.electronAPI.downloadUpdate().catch((e) => {
error.value = e.message
status.value = 'error'
})
}
const installUpdate = () => {
if (!isElectron()) return
window.electronAPI.installUpdate()
}
const dismissUpdate = () => {
status.value = 'idle'
updateInfo.value = null
}
return {
status,
updateInfo,
progress,
error,
currentVersion,
checkForUpdates,
downloadUpdate,
installUpdate,
dismissUpdate
}
}