import { useState } from 'react'; import { api } from '~renderer/utils/api'; import { useT } from '~renderer/i18n'; import Button from './styled/Button'; type Status = | { state: 'idle'; currentVersion: string } | { state: 'checking'; currentVersion: string } | { state: 'unavailable'; currentVersion: string } | { state: 'available'; currentVersion: string; nextVersion: string } | { state: 'downloading'; currentVersion: string; nextVersion: string; progress: number; } | { state: 'ready'; currentVersion: string; nextVersion: string } | { state: 'error'; currentVersion: string; message: string }; const SelfUpdateBanner = () => { const t = useT(); const [status, setStatus] = useState({ state: 'idle', currentVersion: '' }); api.selfUpdater.observe.useSubscription(undefined, { onData: setStatus }); const install = api.selfUpdater.install.useMutation(); if ( status.state === 'idle' || status.state === 'checking' || status.state === 'unavailable' ) { return null; } const tone = status.state === 'error' ? 'border-red/40' : 'border-tw/40'; const label = status.state === 'error' ? t('misc.selfUpdateCheckFailed', { message: status.message }) : status.state === 'available' ? t('misc.selfUpdateAvailable', { version: status.nextVersion }) : status.state === 'downloading' ? t('misc.selfUpdateDownloading', { version: status.nextVersion, percent: Math.round(status.progress * 100) }) : status.state === 'ready' ? t('misc.selfUpdateReady', { version: status.nextVersion }) : ''; return (
{label} {status.state === 'ready' && ( )}
); }; export default SelfUpdateBanner;