feat(api): Add system controller and version check endpoint

This commit is contained in:
Peifan Li
2025-12-29 17:40:05 -05:00
parent 21c3f4c514
commit db3d917427
5 changed files with 162 additions and 3 deletions

View File

@@ -6,6 +6,17 @@ import App from '../App';
// Mock axios
vi.mock('axios', () => ({
default: {
create: vi.fn(() => ({
get: vi.fn(() => Promise.resolve({ data: {} })),
post: vi.fn(() => Promise.resolve({ data: {} })),
put: vi.fn(() => Promise.resolve({ data: {} })),
delete: vi.fn(() => Promise.resolve({ data: {} })),
interceptors: {
request: { use: vi.fn(), eject: vi.fn() },
response: { use: vi.fn(), eject: vi.fn() }
},
defaults: { headers: { common: {} } }
})),
get: vi.fn(() => Promise.resolve({ data: {} })),
post: vi.fn(() => Promise.resolve({ data: {} })),
put: vi.fn(() => Promise.resolve({ data: {} })),
@@ -13,7 +24,8 @@ vi.mock('axios', () => ({
interceptors: {
request: { use: vi.fn(), eject: vi.fn() },
response: { use: vi.fn(), eject: vi.fn() }
}
},
isAxiosError: vi.fn(() => false)
}
}));

View File

@@ -1,9 +1,31 @@
import { GitHub } from '@mui/icons-material';
import { Box, Container, Link, Typography, useTheme } from '@mui/material';
import { Box, Chip, Container, Link, Tooltip, Typography, useTheme } from '@mui/material';
import { useEffect, useState } from 'react';
import { api } from '../utils/apiClient';
const Footer = () => {
const theme = useTheme();
const [updateInfo, setUpdateInfo] = useState<{
hasUpdate: boolean;
latestVersion: string;
releaseUrl: string;
} | null>(null);
useEffect(() => {
const checkVersion = async () => {
try {
const response = await api.get('/system/version');
if (response.data && response.data.hasUpdate) {
setUpdateInfo(response.data);
}
} catch (error) {
// Silently fail for version check
console.debug('Failed to check version:', error);
}
};
checkVersion();
}, []);
return (
<Box
@@ -37,6 +59,28 @@ const Footer = () => {
<Typography variant="caption" color="text.secondary">
v{import.meta.env.VITE_APP_VERSION}
</Typography>
{updateInfo?.hasUpdate && (
<Tooltip title={`New version available: v${updateInfo.latestVersion}`}>
<Link
href={updateInfo.releaseUrl}
target="_blank"
rel="noopener noreferrer"
sx={{ ml: 1, textDecoration: 'none', display: 'flex', alignItems: 'center' }}
>
<Chip
label="Update"
color="success"
size="small"
sx={{
height: 16,
fontSize: '0.65rem',
cursor: 'pointer',
'& .MuiChip-label': { px: 1 }
}}
/>
</Link>
</Tooltip>
)}
</Box>
<Typography variant="caption" color="text.secondary" sx={{ mt: 0.5 }}>
Created by franklioxygen