import { useEffect, useState } from 'react' import { Loader2, CheckCircle2, AlertCircle } from 'lucide-react' import { Progress } from '@/components/ui/progress' /** * @deprecated 请使用新的 RestartOverlay 组件 * import { RestartOverlay } from '@/components/restart-overlay' */ interface RestartingOverlayProps { onRestartComplete?: () => void onRestartFailed?: () => void } /** * @deprecated 请使用新的 RestartOverlay 组件 * import { RestartOverlay } from '@/components/restart-overlay' */ export function RestartingOverlay({ onRestartComplete, onRestartFailed }: RestartingOverlayProps) { const [progress, setProgress] = useState(0) const [status, setStatus] = useState<'restarting' | 'checking' | 'success' | 'failed'>('restarting') const [elapsedTime, setElapsedTime] = useState(0) const [checkAttempts, setCheckAttempts] = useState(0) useEffect(() => { // 进度条动画 const progressInterval = setInterval(() => { setProgress((prev) => { if (prev >= 90) return prev return prev + 1 }) }, 200) // 计时器 const timerInterval = setInterval(() => { setElapsedTime((prev) => prev + 1) }, 1000) // 等待3秒后开始检查状态(给后端重启时间) const initialDelay = setTimeout(() => { setStatus('checking') startHealthCheck() }, 3000) return () => { clearInterval(progressInterval) clearInterval(timerInterval) clearTimeout(initialDelay) } // eslint-disable-next-line react-hooks/exhaustive-deps }, []) const startHealthCheck = () => { const maxAttempts = 60 // 最多尝试60次(约2分钟) const checkHealth = async () => { try { setCheckAttempts((prev) => prev + 1) const response = await fetch('/api/webui/system/status', { method: 'GET', headers: { 'Content-Type': 'application/json', }, signal: AbortSignal.timeout(3000), // 3秒超时 }) if (response.ok) { // 重启成功 setProgress(100) setStatus('success') setTimeout(() => { onRestartComplete?.() }, 1500) } else { throw new Error('Status check failed') } } catch { // 继续尝试 if (checkAttempts < maxAttempts) { setTimeout(checkHealth, 2000) // 2秒后重试 } else { // 超过最大尝试次数 setStatus('failed') onRestartFailed?.() } } } checkHealth() } const formatTime = (seconds: number) => { const mins = Math.floor(seconds / 60) const secs = seconds % 60 return `${mins}:${secs.toString().padStart(2, '0')}` } return (
请稍候,麦麦正在重启中...
> )} {status === 'checking' && ( <>等待服务恢复... (尝试 {checkAttempts}/60)
> )} {status === 'success' && ( <>正在跳转到登录页面...
> )} {status === 'failed' && ( <>服务未能在预期时间内恢复,请手动检查或刷新页面
> )}{status === 'restarting' && '🔄 配置已保存,正在重启主程序...'} {status === 'checking' && '⏳ 正在等待服务恢复,请勿关闭页面...'} {status === 'success' && '✅ 配置已生效,服务运行正常'} {status === 'failed' && '⚠️ 如果长时间无响应,请尝试手动重启'}