Czego się nauczysz?
- Praca z
setIntervaliclearIntervalw React (useEffect) - Maszyna stanów (work → short-break → long-break → work)
- Web Notifications API
- Dokładne odliczanie czasu w JS
Zbudujesz timer do techniki Pomodoro — 25 minut pracy, 5 minut przerwy, po 4 cyklach dłuższa przerwa (15 min). Z powiadomieniami dźwiękowymi i historią sesji.
Czego się nauczysz?
setInterval i clearInterval w React (useEffect)const PHASES = { work: { label: 'Praca', duration: 25 * 60 }, shortBreak: { label: 'Krótka przerwa', duration: 5 * 60 }, longBreak: { label: 'Długa przerwa', duration: 15 * 60 },};
// Sekwencja: work, shortBreak, work, shortBreak, work, shortBreak, work, longBreakfunction usePomodoroTimer() { const [phase, setPhase] = useState('work'); const [timeLeft, setTimeLeft] = useState(PHASES.work.duration); const [isRunning, setIsRunning] = useState(false); const [completedPomodoros, setCompletedPomodoros] = useState(0);
useEffect(() => { if (!isRunning) return;
const interval = setInterval(() => { setTimeLeft((prev) => { if (prev <= 1) { // Przejście do następnej fazy handlePhaseEnd(); return 0; } return prev - 1; }); }, 1000);
return () => clearInterval(interval); }, [isRunning]);
function formatTime(seconds) { const m = Math.floor(seconds / 60).toString().padStart(2, '0'); const s = (seconds % 60).toString().padStart(2, '0'); return `${m}:${s}`; }
return { phase, timeLeft, isRunning, completedPomodoros, formatTime, setIsRunning };}usePomodoro z maszyną stanówPowodzenia!
Timer Pomodoro to klasyczny projekt React — pokazuje jak pracować z setInterval w useEffect bez memory leaks. Pamiętaj o cleanup funkcji w useEffect! Brzmi prosto, ale prawidłowa maszyna stanów (praca → przerwa → praca) wymaga przemyślanej logiki.