rwadurian/backend/mpc-system/services/service-party-app/src/components/StartupCheck.tsx

173 lines
5.9 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { useEffect, useState } from 'react';
import { useAppStore, getStatusColor } from '../stores/appStore';
import styles from './StartupCheck.module.css';
interface StartupCheckProps {
onComplete: () => void;
}
export default function StartupCheck({ onComplete }: StartupCheckProps) {
const { environment, checkAllServices, appReady } = useAppStore();
const [showDetails, setShowDetails] = useState(false);
useEffect(() => {
const runCheck = async () => {
await checkAllServices();
};
runCheck();
}, [checkAllServices]);
useEffect(() => {
// 检测完成后自动进入主界面(成功或失败都进入)
if (appReady === 'ready' || appReady === 'error') {
const timer = setTimeout(() => {
onComplete();
}, 1500); // 1.5秒后自动进入
return () => clearTimeout(timer);
}
}, [appReady, onComplete]);
const getStatusIcon = (status: string) => {
switch (status) {
case 'connected':
return '✅';
case 'checking':
return '🔄';
case 'error':
return '❌';
default:
return '⏳';
}
};
return (
<div className={styles.container}>
<div className={styles.card}>
{/* Logo */}
<div className={styles.logo}>
<span className={styles.logoIcon}>🍈</span>
<h1 className={styles.title}>绿</h1>
<p className={styles.subtitle}> · </p>
</div>
{/* 状态检测 */}
<div className={styles.checkList}>
<div className={styles.checkItem}>
<span className={styles.checkIcon}>{getStatusIcon(environment.database.status)}</span>
<span className={styles.checkLabel}></span>
<span
className={styles.checkStatus}
style={{ color: getStatusColor(environment.database.status) }}
>
{environment.database.status === 'connected'
? '正常'
: environment.database.status === 'checking'
? '检测中...'
: environment.database.status === 'error'
? '异常'
: '等待检测'}
</span>
</div>
<div className={styles.checkItem}>
<span className={styles.checkIcon}>{getStatusIcon(environment.messageRouter.status)}</span>
<span className={styles.checkLabel}></span>
<span
className={styles.checkStatus}
style={{ color: getStatusColor(environment.messageRouter.status) }}
>
{environment.messageRouter.status === 'connected'
? '已连接'
: environment.messageRouter.status === 'checking'
? '检测中...'
: environment.messageRouter.status === 'error'
? '连接失败'
: '等待检测'}
</span>
</div>
<div className={styles.checkItem}>
<span className={styles.checkIcon}>{getStatusIcon(environment.kavaApi.status)}</span>
<span className={styles.checkLabel}>Kava API</span>
<span
className={styles.checkStatus}
style={{ color: getStatusColor(environment.kavaApi.status) }}
>
{environment.kavaApi.status === 'connected'
? '已连接'
: environment.kavaApi.status === 'checking'
? '检测中...'
: environment.kavaApi.status === 'error'
? '连接失败'
: '等待检测'}
</span>
</div>
</div>
{/* 总体状态 */}
<div className={styles.summary}>
{appReady === 'initializing' && (
<>
<div className={styles.spinner} />
<span>...</span>
</>
)}
{appReady === 'ready' && (
<>
<span className={styles.successIcon}></span>
<span></span>
</>
)}
{appReady === 'error' && (
<>
<span className={styles.warningIcon}></span>
<span>使</span>
</>
)}
</div>
{/* 详情按钮 */}
{(environment.messageRouter.message || environment.kavaApi.message) && (
<button
className={styles.detailsButton}
onClick={() => setShowDetails(!showDetails)}
>
{showDetails ? '隐藏详情' : '查看详情'}
</button>
)}
{/* 详细信息 */}
{showDetails && (
<div className={styles.details}>
{environment.messageRouter.message && (
<div className={styles.detailRow}>
<span className={styles.detailLabel}>:</span>
<span className={styles.detailValue}>{environment.messageRouter.message}</span>
</div>
)}
{environment.kavaApi.message && (
<div className={styles.detailRow}>
<span className={styles.detailLabel}>Kava API:</span>
<span className={styles.detailValue}>{environment.kavaApi.message}</span>
</div>
)}
{environment.database.message && (
<div className={styles.detailRow}>
<span className={styles.detailLabel}>:</span>
<span className={styles.detailValue}>{environment.database.message}</span>
</div>
)}
</div>
)}
{/* 手动进入按钮 */}
{(appReady === 'ready' || appReady === 'error') && (
<button className={styles.enterButton} onClick={onComplete}>
</button>
)}
</div>
</div>
);
}