diff --git a/src/renderer/src/components/UpdateDialog.tsx b/src/renderer/src/components/UpdateDialog.tsx index 8b4c72a..9939152 100644 --- a/src/renderer/src/components/UpdateDialog.tsx +++ b/src/renderer/src/components/UpdateDialog.tsx @@ -1,8 +1,9 @@ -import React, { useEffect, useState } from 'react' +import React, { startTransition } from 'react' import ReactMarkdown from 'react-markdown' import remarkGfm from 'remark-gfm' import { DownloadCloud, LoaderCircle, RefreshCw } from 'lucide-react' import Modal from './ui/Modal' +import { useUpdateDialogState } from '../hooks/useUpdateDialogState' import type { UserType } from '../../../main/types/user.types' import type { DownloadReleaseRequest, @@ -22,10 +23,6 @@ interface UpdateDialogProps { onRefreshCatalog: () => Promise } -function releaseKey(release: UpdateRelease): string { - return `${release.channel}:${release.version}` -} - export default function UpdateDialog({ isOpen, userType, @@ -36,54 +33,8 @@ export default function UpdateDialog({ onDownloadAndInstallAdminRelease, onRefreshCatalog }: UpdateDialogProps): React.JSX.Element { - const [selectedRelease, setSelectedRelease] = useState(undefined) - const [changelog, setChangelog] = useState('') - const [isLoadingChangelog, setIsLoadingChangelog] = useState(false) - - useEffect(() => { - if (!isOpen || !catalog) return - - if (catalog.mode === 'user') { - setSelectedRelease(catalog.recommendedRelease) - return - } - - if (catalog.mode === 'admin') { - setSelectedRelease( - catalog.recommendedRelease ?? catalog.channels?.stable[0] ?? catalog.channels?.preview[0] - ) - } - }, [catalog, isOpen]) - - useEffect(() => { - if (!isOpen || !selectedRelease) { - setChangelog('') - return - } - - let active = true - setIsLoadingChangelog(true) - - window.electron.update - .getChangelog(selectedRelease) - .then((result) => { - if (!active) return - setChangelog(result.success && result.data ? result.data : '暂无更新说明。') - }) - .catch(() => { - if (!active) return - setChangelog('暂无更新说明。') - }) - .finally(() => { - if (active) { - setIsLoadingChangelog(false) - } - }) - - return () => { - active = false - } - }, [isOpen, selectedRelease]) + const { selectedRelease, setSelectedRelease, changelog, isLoadingChangelog, isSelectedRelease } = + useUpdateDialogState(isOpen, catalog) const isBusy = status?.phase === 'downloading' || @@ -103,11 +54,15 @@ export default function UpdateDialog({
{title}
{releases.map((release) => { - const selected = selectedRelease && releaseKey(selectedRelease) === releaseKey(release) + const selected = isSelectedRelease(release) return (