import React, { useState, useEffect } from 'react'; export default function App() { const [time, setTime] = useState(0); const [isRunning, setIsRunning] = useState(false); const [bgImage, setBgImage] = useState(null); const [isFinished, setIsFinished] = useState(false); // 타이머 종료 상태 추가 // 사용자가 올린 이미지를 배경으로 설정하는 함수 const handleImageUpload = (e) => { const file = e.target.files[0]; if (file) { const imageUrl = URL.createObjectURL(file); setBgImage(imageUrl); } }; // 타이머 동작 로직 useEffect(() => { let interval = null; if (isRunning && time > 0) { interval = setInterval(() => { setTime((prevTime) => prevTime - 1); }, 1000); } else if (isRunning && time === 0) { setIsRunning(false); setIsFinished(true); // 시간이 다 되면 종료 상태를 true로 변경 clearInterval(interval); } else if (!isRunning && time === 0) { clearInterval(interval); } return () => clearInterval(interval); }, [isRunning, time]); // 시간 포맷 변환 (MM:SS 또는 HH:MM:SS) const formatTime = (seconds) => { const h = Math.floor(seconds / 3600); const m = Math.floor((seconds % 3600) / 60); const s = seconds % 60; if (h > 0) { return `${h}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`; } return `${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`; }; // 시간 추가 함수 const addTime = (minutes) => { setTime((prev) => prev + minutes * 60); setIsFinished(false); // 시간을 추가하면 흔들림 멈춤 }; // 리셋 함수 const resetTimer = () => { setIsRunning(false); setTime(0); setIsFinished(false); // 리셋하면 흔들림 멈춤 }; // 5초 전부터 서서히 빨간색으로 변하게 하는 스타일 함수 const getWarningStyle = () => { if (isFinished) return {}; if (time <= 5 && time > 0) { const ratio = (5 - time + 1) / 5; // 5초일 때 20%, 1초일 때 100% 진행 // 검은색(17, 17, 17)에서 빨간색(239, 68, 68)으로 서서히 보간 const r = Math.round(17 + (239 - 17) * ratio); const g = Math.round(17 + (68 - 17) * ratio); const b = Math.round(17 + (68 - 17) * ratio); return { borderColor: `rgb(${r}, ${g}, ${b})`, color: `rgb(${r}, ${g}, ${b})`, transition: 'transform 0.2s ease, box-shadow 0.2s ease, color 1s linear, border-color 1s linear' }; } return {}; }; return (