akseljoonas's picture
akseljoonas HF Staff
deploy
39d2475
import { Box, Chip, Link } from '@mui/material';
import LaunchIcon from '@mui/icons-material/Launch';
import CloudQueueIcon from '@mui/icons-material/CloudQueue';
import HourglassEmptyIcon from '@mui/icons-material/HourglassEmpty';
import PlayArrowIcon from '@mui/icons-material/PlayArrow';
import CheckCircleIcon from '@mui/icons-material/CheckCircle';
import ErrorIcon from '@mui/icons-material/Error';
import CancelIcon from '@mui/icons-material/Cancel';
import type { JobStatus } from '@/store/agentStore';
interface JobStatusHeaderProps {
job: JobStatus;
}
const statusConfig: Record<JobStatus['status'], {
label: string;
color: string;
bgColor: string;
icon: React.ReactNode;
}> = {
queued: {
label: 'Queued',
color: '#FFA726',
bgColor: 'rgba(255, 167, 38, 0.15)',
icon: <CloudQueueIcon sx={{ fontSize: 14 }} />,
},
pending: {
label: 'Pending',
color: '#FFA726',
bgColor: 'rgba(255, 167, 38, 0.15)',
icon: <HourglassEmptyIcon sx={{ fontSize: 14 }} />,
},
running: {
label: 'Running',
color: '#42A5F5',
bgColor: 'rgba(66, 165, 245, 0.15)',
icon: <PlayArrowIcon sx={{ fontSize: 14 }} />,
},
completed: {
label: 'Completed',
color: '#66BB6A',
bgColor: 'rgba(102, 187, 106, 0.15)',
icon: <CheckCircleIcon sx={{ fontSize: 14 }} />,
},
failed: {
label: 'Failed',
color: '#EF5350',
bgColor: 'rgba(239, 83, 80, 0.15)',
icon: <ErrorIcon sx={{ fontSize: 14 }} />,
},
canceled: {
label: 'Canceled',
color: '#BDBDBD',
bgColor: 'rgba(189, 189, 189, 0.15)',
icon: <CancelIcon sx={{ fontSize: 14 }} />,
},
error: {
label: 'Error',
color: '#EF5350',
bgColor: 'rgba(239, 83, 80, 0.15)',
icon: <ErrorIcon sx={{ fontSize: 14 }} />,
},
};
export default function JobStatusHeader({ job }: JobStatusHeaderProps) {
const config = statusConfig[job.status] || statusConfig.pending;
return (
<Box
sx={{
bgcolor: 'rgba(0, 0, 0, 0.3)',
borderBottom: '1px solid rgba(255, 255, 255, 0.05)',
px: 2,
py: 1.5,
display: 'flex',
alignItems: 'center',
justifyContent: 'space-between',
gap: 2,
}}
>
{/* Left side: Status + Hardware */}
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5 }}>
{/* Status badge */}
<Chip
icon={config.icon as React.ReactElement}
label={config.label}
size="small"
sx={{
height: 26,
bgcolor: config.bgColor,
color: config.color,
border: `1px solid ${config.color}40`,
fontWeight: 600,
fontSize: '0.7rem',
textTransform: 'uppercase',
letterSpacing: '0.03em',
'& .MuiChip-icon': {
color: config.color,
ml: 0.5,
},
}}
/>
{/* Hardware badge */}
<Chip
label={job.hardware}
size="small"
sx={{
height: 24,
bgcolor: job.isGpu ? 'rgba(156, 39, 176, 0.15)' : 'rgba(255, 255, 255, 0.05)',
color: job.isGpu ? '#BA68C8' : 'var(--muted-text)',
border: job.isGpu ? '1px solid rgba(156, 39, 176, 0.3)' : '1px solid rgba(255, 255, 255, 0.1)',
fontWeight: 500,
fontSize: '0.65rem',
textTransform: 'uppercase',
}}
/>
</Box>
{/* Right side: Link to HF Jobs */}
<Link
href={job.url}
target="_blank"
rel="noopener noreferrer"
sx={{
display: 'flex',
alignItems: 'center',
gap: 0.75,
color: 'var(--accent-yellow)',
fontSize: '0.8rem',
fontWeight: 600,
textDecoration: 'none',
px: 2,
py: 0.75,
borderRadius: 1,
bgcolor: 'rgba(255, 193, 7, 0.1)',
border: '1px solid rgba(255, 193, 7, 0.25)',
transition: 'all 0.15s ease',
'&:hover': {
bgcolor: 'rgba(255, 193, 7, 0.2)',
borderColor: 'rgba(255, 193, 7, 0.4)',
},
}}
>
<LaunchIcon sx={{ fontSize: 16 }} />
View on HF Jobs
</Link>
</Box>
);
}