feat(api): Add system controller and version check endpoint
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}));
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user