demo / frontend /src /components /ServerLoadingIndicator.tsx
Pierre Andrews
Initial commit
f52d137
import React from "react";
import {
Box,
CircularProgress,
LinearProgress,
Paper,
Typography,
} from "@mui/material";
interface ServerLoadingIndicatorProps {
progress?: {
attempt: number;
maxAttempts: number;
} | null;
message?: string;
}
export const ServerLoadingIndicator: React.FC<ServerLoadingIndicatorProps> = ({
progress,
message = "Starting server...",
}) => {
const progressPercentage = progress
? Math.round((progress.attempt / progress.maxAttempts) * 100)
: 0;
// Fun quotes about agents taking over
const agentQuotes = [
"Agents are calibrating the space protocols...",
"Teaching agents the fine art of space conquest...",
"Agents are learning to navigate the cosmic frontier...",
"Preparing agents for their intergalactic mission...",
"Agents are studying the universe's source code...",
"Installing agent confidence modules...",
"Agents are fine-tuning their cosmic algorithms...",
"Briefing agents on proper space etiquette...",
"Agents are calculating optimal space trajectories...",
"Teaching agents to think beyond planetary boundaries...",
];
// Select quote based on progress attempt
const currentQuoteIndex = progress
? (progress.attempt - 1) % agentQuotes.length
: 0;
return (
<Box
sx={{
display: "flex",
alignItems: "center",
justifyContent: "center",
p: 2,
}}
>
<Paper
elevation={3}
sx={{
display: "flex",
flexDirection: "column",
alignItems: "center",
gap: 3,
p: 4,
borderRadius: 2,
minWidth: 400,
maxWidth: 500,
}}
>
{/* Main spinner */}
<CircularProgress size={48} color="secondary" />
{/* Status message */}
<Typography
variant="h6"
sx={{
textAlign: "center",
fontWeight: 500,
color: "text.primary",
}}
>
{message}
</Typography>
{/* Progress bar */}
{progress && (
<Box sx={{ width: "100%", gap: 2, display: "flex", flexDirection: "column" }}>
<LinearProgress
variant="determinate"
value={progressPercentage}
sx={{
height: 8,
borderRadius: 4,
backgroundColor: "action.hover",
"& .MuiLinearProgress-bar": {
borderRadius: 4,
},
}}
/>
{/* Fun rotating quote */}
<Typography
variant="body2"
sx={{
color: "text.secondary",
textAlign: "center",
fontSize: "0.875rem",
minHeight: "1.5em",
fontStyle: "italic",
}}
>
{agentQuotes[currentQuoteIndex]}
</Typography>
</Box>
)}
</Paper>
</Box>
);
};