import { Card, CardBody, CardHeader } from '@heroui/card'; import { Button } from '@heroui/button'; import { Chip } from '@heroui/chip'; import { Spinner } from '@heroui/spinner'; import { Tooltip } from '@heroui/tooltip'; import { useLocalStorage } from '@uidotdev/usehooks'; import { useRequest } from 'ahooks'; import clsx from 'clsx'; import { FaCircleInfo, FaInfo, FaQq } from 'react-icons/fa6'; import { IoLogoChrome, IoLogoOctocat } from 'react-icons/io'; import { RiMacFill } from 'react-icons/ri'; import { useState } from 'react'; import key from '@/const/key'; import WebUIManager from '@/controllers/webui_manager'; import useDialog from '@/hooks/use-dialog'; export interface SystemInfoItemProps { title: string; icon?: React.ReactNode; value?: React.ReactNode; endContent?: React.ReactNode; hasBackground?: boolean; } const SystemInfoItem: React.FC = ({ title, value = '--', icon, endContent, hasBackground = false, }) => { return (
{icon}
{title}
{value}
{endContent}
); }; export interface NewVersionTipProps { currentVersion?: string; } // const NewVersionTip = (props: NewVersionTipProps) => { // const { currentVersion } = props; // const dialog = useDialog(); // const { data: releaseData, error } = useRequest(() => // request.get( // 'https://api.github.com/repos/NapNeko/NapCatQQ/releases' // ) // ); // if (error) { // return ( // // // // ); // } // const latestVersion = releaseData?.data?.[0]?.tag_name; // if (!latestVersion || !currentVersion) { // return null; // } // if (compareVersion(latestVersion, currentVersion) <= 0) { // return null; // } // const middleVersions: GithubRelease[] = []; // for (let i = 0; i < releaseData.data.length; i++) { // const versionInfo = releaseData.data[i]; // if (compareVersion(versionInfo.tag_name, currentVersion) > 0) { // middleVersions.push(versionInfo); // } else { // break; // } // } // const AISummaryComponent = () => { // const { // data: aiSummaryData, // loading: aiSummaryLoading, // error: aiSummaryError, // run: runAiSummary, // } = useRequest( // (version) => // request.get>( // `https://release.nc.152710.xyz/?version=${version}`, // { // timeout: 30000, // } // ), // { // manual: true, // } // ); // useEffect(() => { // runAiSummary(currentVersion); // }, [currentVersion, runAiSummary]); // if (aiSummaryLoading) { // return ( //
// //
// ); // } // if (aiSummaryError) { // return
AI 摘要获取失败
; // } // return {aiSummaryData?.data.data}; // }; // return ( // // // // ); // }; // 更新状态类型 type UpdateStatus = 'idle' | 'updating' | 'success' | 'error'; // 更新对话框内容组件 const UpdateDialogContent: React.FC<{ currentVersion: string; latestVersion: string; status: UpdateStatus; errorMessage?: string; }> = ({ currentVersion, latestVersion, status, errorMessage }) => { return (
{/* 版本信息 */}
当前版本 v{currentVersion}
最新版本 v{latestVersion}
{/* 更新状态显示 */} {status === 'updating' && (

正在更新中...

请耐心等待,更新可能需要几分钟

)} {status === 'success' && (

更新完成

请重启 NapCat 以应用新版本

请手动重启 NapCat,更新才会生效

)} {status === 'error' && (

更新失败

{errorMessage || '请稍后重试或手动更新'}

)}
); }; const NewVersionTip = (props: NewVersionTipProps) => { const { currentVersion } = props; const dialog = useDialog(); const { data: latestVersion, error } = useRequest(WebUIManager.getLatestTag, { cacheKey: 'napcat-latest-tag', staleTime: 10 * 60 * 1000, cacheTime: 30 * 60 * 1000, }); const [updateStatus, setUpdateStatus] = useState('idle'); if (error || !latestVersion || !currentVersion || latestVersion === currentVersion) { return null; } const handleUpdate = async () => { setUpdateStatus('updating'); try { await WebUIManager.UpdateNapCat(); setUpdateStatus('success'); // 显示更新成功对话框 dialog.alert({ title: '更新完成', content: ( ), confirmText: '我知道了', size: 'md', }); } catch (err) { console.error('Update failed:', err); const errMessage = err instanceof Error ? err.message : '未知错误'; setUpdateStatus('error'); // 显示更新失败对话框 dialog.alert({ title: '更新失败', content: ( ), confirmText: '确定', size: 'md', }); } }; const showUpdateDialog = () => { dialog.confirm({ title: '发现新版本', content: ( ), confirmText: '立即更新', cancelText: '稍后更新', size: 'md', onConfirm: handleUpdate, }); }; return ( ); }; interface NapCatVersionProps { hasBackground?: boolean; } const NapCatVersion: React.FC = ({ hasBackground = false }) => { const { data: packageData, loading: packageLoading, error: packageError, } = useRequest(WebUIManager.GetNapCatVersion, { cacheKey: 'napcat-version', staleTime: 60 * 60 * 1000, cacheTime: 24 * 60 * 60 * 1000, }); const currentVersion = packageData?.version; return ( } hasBackground={hasBackground} value={ packageError ? ( `错误:${packageError.message}` ) : packageLoading ? ( ) : ( currentVersion ) } endContent={} /> ); }; export interface SystemInfoProps { archInfo?: string; } const SystemInfo: React.FC = (props) => { const { archInfo } = props; const { data: qqVersionData, loading: qqVersionLoading, error: qqVersionError, } = useRequest(WebUIManager.getQQVersion, { cacheKey: 'qq-version', staleTime: 60 * 60 * 1000, cacheTime: 24 * 60 * 60 * 1000, }); const [backgroundImage] = useLocalStorage(key.backgroundImage, ''); const hasBackground = !!backgroundImage; return ( 系统信息
} hasBackground={hasBackground} value={ qqVersionError ? ( `错误:${qqVersionError.message}` ) : qqVersionLoading ? ( ) : ( qqVersionData ) } /> } value='Next' hasBackground={hasBackground} /> } value={archInfo} hasBackground={hasBackground} />
); }; export default SystemInfo;