| 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> | |
| ); | |
| }; | |