tfrere's picture
update
83003f5
import React, { useState, useEffect } from "react";
import { Box, Typography } from "@mui/material";
import { motion } from "framer-motion";
import CreateIcon from "@mui/icons-material/Create";
import AutoStoriesIcon from "@mui/icons-material/AutoStories";
import PaletteIcon from "@mui/icons-material/Palette";
const defaultMessages = [
"waking up a sleepy AI...",
"teaching robots to tell bedtime stories...",
"bribing pixels to make pretty pictures...",
];
const iconMap = {
story: CreateIcon,
universe: AutoStoriesIcon,
art: PaletteIcon,
};
export const LoadingScreen = ({
messages = defaultMessages,
icon = "story",
messageInterval = 3000,
iconColor = "white",
textColor = "white",
}) => {
const [currentMessage, setCurrentMessage] = useState(0);
const IconComponent = iconMap[icon] || CreateIcon;
useEffect(() => {
const interval = setInterval(() => {
setCurrentMessage((prev) => (prev + 1) % messages.length);
}, messageInterval);
return () => clearInterval(interval);
}, [messages.length, messageInterval]);
return (
<Box
sx={{
position: "absolute",
top: "50%",
left: "50%",
transform: "translate(-50%, -50%)",
display: "flex",
flexDirection: "column",
alignItems: "center",
gap: 2,
}}
>
<motion.div
animate={{
y: [0, -10, 0],
}}
transition={{
duration: 2,
repeat: Infinity,
ease: "easeInOut",
}}
>
<IconComponent
sx={{
fontSize: 40,
color: iconColor,
opacity: 0.2,
}}
/>
</motion.div>
<motion.div
key={currentMessage}
initial={{ opacity: 0, y: 5 }}
animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: -5 }}
transition={{ duration: 0.3 }}
>
<Typography
variant="body1"
sx={{
color: textColor,
opacity: 0.8,
fontStyle: "italic",
}}
>
{messages[currentMessage]}
</Typography>
</motion.div>
</Box>
);
};