[fix] update setup

This commit is contained in:
2025-11-08 23:57:26 +08:00
parent cd19faba47
commit 5e663dc79e
20 changed files with 1064 additions and 626 deletions

View File

@@ -24,78 +24,77 @@ export default function Page() {
return (
<section className="flex flex-col gap-4 overflow-hidden">
<div className="flex flex-col items-start gap-4 pt-2 pb-1">
<div className="space-y-2">
<div className="flex items-center gap-2">
<p className="text-sm">{app.state.version}</p>
{app.state.hasUpdate && app.state.latestVersion && (
<Chip size="sm" color="success" variant="flat">
{app.state.latestVersion}
</Chip>
)}
<div className="space-y-2">
<div className="flex items-center gap-2">
<p className="text-sm">{app.state.version}</p>
{app.state.hasUpdate && app.state.latestVersion && (
<Chip size="sm" color="success" variant="flat">
{app.state.latestVersion}
</Chip>
)}
</div>
{/* <p className="text-sm">是否有更新:{app.state.hasUpdate ? "有" : "无"}</p> */}
{/* <p className="text-sm">是否使用镜像源:{app.state.useMirror ? "是" : "否"}</p> */}
</div>
{/* <p className="text-sm">是否有更新:{app.state.hasUpdate ? "有" : "无"}</p> */}
{/* <p className="text-sm">是否使用镜像源:{app.state.useMirror ? "是" : "否"}</p> */}
</div>
<div className="w-full pt-4 border-t border-zinc-200 dark:border-zinc-800">
<h3 className="mb-3 text-sm font-semibold"></h3>
<div className="mb-3 space-y-3">
{/* <Switch
<div className="w-full pt-4 border-t border-zinc-200 dark:border-zinc-800">
<h3 className="mb-3 text-sm font-semibold"></h3>
<div className="mb-3 space-y-3">
{/* <Switch
isSelected={app.state.useMirror}
size="sm"
onChange={(e) => app.setUseMirror(e.target.checked)}
>
使用镜像源
</Switch> */}
{/* <p className="text-xs text-zinc-500">
{/* <p className="text-xs text-zinc-500">
{app.state.useMirror
? "使用自建更新服务检查更新"
: "使用 GitHub Release 检查更新"}
</p> */}
<Switch
isSelected={app.state.includePrerelease}
size="sm"
onChange={(e) => app.setIncludePrerelease(e.target.checked)}
>
</Switch>
<p className="text-xs text-zinc-500">
{app.state.includePrerelease
? "检查更新时会包含预发布版本beta、alpha等"
: "仅检查正式版本"}
</p>
<Switch
isSelected={app.state.includePrerelease}
size="sm"
onChange={(e) => app.setIncludePrerelease(e.target.checked)}
>
</Switch>
<p className="text-xs text-zinc-500">
{app.state.includePrerelease
? "检查更新时会包含预发布版本beta、alpha等"
: "仅检查正式版本"}
</p>
</div>
<UpdateChecker
customEndpoint={customEndpoint || undefined}
includePrerelease={app.state.includePrerelease}
/>
</div>
<UpdateChecker
useMirror={app.state.useMirror}
customEndpoint={customEndpoint || undefined}
includePrerelease={app.state.includePrerelease}
/>
</div>
<div className="flex flex-col w-full pt-4 space-y-3 border-t border-zinc-200 dark:border-zinc-800">
<h3 className="mb-3 text-sm font-semibold"></h3>
<Switch
isSelected={app.state.autoStart}
size="sm"
onChange={(e) => app.setAutoStart(e.target.checked)}
>
</Switch>
<Switch
isSelected={app.state.startHidden}
size="sm"
onChange={(e) => app.setStartHidden(e.target.checked)}
>
</Switch>
<Switch
isSelected={app.state.hiddenOnClose}
size="sm"
onChange={(e) => app.setHiddenOnClose(e.target.checked)}
>
</Switch>
</div>
<div className="flex flex-col w-full pt-4 space-y-3 border-t border-zinc-200 dark:border-zinc-800">
<h3 className="mb-3 text-sm font-semibold"></h3>
<Switch
isSelected={app.state.autoStart}
size="sm"
onChange={(e) => app.setAutoStart(e.target.checked)}
>
</Switch>
<Switch
isSelected={app.state.startHidden}
size="sm"
onChange={(e) => app.setStartHidden(e.target.checked)}
>
</Switch>
<Switch
isSelected={app.state.hiddenOnClose}
size="sm"
onChange={(e) => app.setHiddenOnClose(e.target.checked)}
>
</Switch>
</div>
</div>
</section>
)

View File

@@ -26,13 +26,11 @@ interface UpdateInfo {
}
interface UpdateCheckerProps {
useMirror?: boolean
customEndpoint?: string
includePrerelease?: boolean
}
export function UpdateChecker({
useMirror = true,
customEndpoint,
includePrerelease = false,
}: UpdateCheckerProps) {
@@ -41,7 +39,6 @@ export function UpdateChecker({
const [downloading, setDownloading] = useState(false)
const [updateInfo, setUpdateInfo] = useState<UpdateInfo | null>(null)
const [downloadProgress, setDownloadProgress] = useState(0)
const [installerPath, setInstallerPath] = useState<string | null>(null)
const [downloadCompleted, setDownloadCompleted] = useState(false)
const {
isOpen: isChangelogOpen,
@@ -72,16 +69,15 @@ export function UpdateChecker({
setChecking(true)
setUpdateInfo(null)
setDownloadProgress(0)
setInstallerPath(null)
setDownloading(false)
setDownloadCompleted(false)
try {
// 如果有自定义端点使用自定义端点否则使用默认端点GitHub Release 或镜像源)
const endpoint = customEndpoint || null
const result = await invoke<UpdateInfo | null>("check_app_update", {
endpoint: endpoint,
useMirror: useMirror,
includePrerelease: includePrerelease,
})
@@ -105,7 +101,6 @@ export function UpdateChecker({
})
}
} catch (error) {
console.error("检查更新失败:", error)
addToast({
title: "检查更新失败",
description: String(error),
@@ -118,24 +113,19 @@ export function UpdateChecker({
// 下载更新
const handleDownloadUpdate = async () => {
if (!updateInfo) return
if (!updateInfo) {
return
}
setDownloading(true)
setDownloadProgress(0)
setDownloadCompleted(false)
try {
// 如果使用镜像源,给下载链接前面套一个 CDN 加速
let downloadUrl = updateInfo.download_url
if (useMirror) {
downloadUrl = `https://cdn.upup.cool/${downloadUrl}`
}
// 使用官方 updater 插件,不需要传递 downloadUrl
await invoke("download_app_update")
const path = await invoke<string>("download_app_update", {
downloadUrl: downloadUrl,
})
setInstallerPath(path)
// 下载完成,标记状态
setDownloadProgress(100)
setDownloading(false)
setDownloadCompleted(true)
@@ -146,7 +136,6 @@ export function UpdateChecker({
color: "success",
})
} catch (error) {
console.error("下载更新失败:", error)
const errorMsg = String(error)
if (errorMsg.includes("取消")) {
addToast({
@@ -178,33 +167,32 @@ export function UpdateChecker({
color: "default",
})
} catch (error) {
console.error("取消下载失败:", error)
// 静默处理错误
}
}
// 安装更新
const handleInstallUpdate = async () => {
if (!installerPath) return
if (!downloadCompleted) {
return
}
try {
addToast({
title: "安装已启动",
description: "安装完成后请手动重启应用",
description: "应用将自动重启",
color: "success",
})
// 调用安装命令(这会阻塞直到安装完成)
await invoke("install_app_update", {
installerPath: installerPath,
})
// 使用官方 updater 插件,不需要传递 installerPath
// 在 Windows 上,应用会自动退出以安装更新
await invoke("install_app_update")
// 安装完成后,等待一小段时间确保安装程序完全退出
await new Promise((resolve) => setTimeout(resolve, 2500))
// 启动新版本
await relaunch()
// 在非 Windows 平台上,可能需要手动重启
// Windows 上会自动退出,所以这里不需要 relaunch
// 等待一小段时间确保安装程序启动
await new Promise((resolve) => setTimeout(resolve, 1000))
} catch (error) {
console.error("安装更新失败:", error)
addToast({
title: "安装失败",
description: String(error),
@@ -230,7 +218,7 @@ export function UpdateChecker({
{updateInfo && (
<>
{!downloading && !installerPath && (
{!downloading && !downloadCompleted && (
<Button
size="sm"
color="primary"
@@ -256,7 +244,7 @@ export function UpdateChecker({
</Button>
)}
{installerPath && (
{downloadCompleted && (
<Button
size="sm"
color="primary"