[fix] update setup
This commit is contained in:
@@ -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>
|
||||
)
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user