Вы забыли об обратном вызове в setInterval
, но я все равно предпочел бы сделать это так:
import React, { useState, useEffect } from "react";
export default function Pomodoro() {
const [seconds, setSeconds] = useState(25 * 60);
const [paused, setPaused] = useState(true);
useEffect(() => {
const int = setInterval(() => {
console.log(`${Date.now()} - paused: ${paused}`);
if (!paused) {
setSeconds(s => s - 1);
}
}, 1000);
return () => {
clearInterval(int);
};
}, [paused]);
function startTimer() {
setPaused(false);
}
function pauseTimer() {
setPaused(true);
}
function resetTimer() {
setPaused(true);
setSeconds(25 * 60);
}
return (
<>
{`${Math.floor(seconds / 60)}:${("00" + (seconds % 60)).slice(-2)}`}
<button onClick={paused ? startTimer : pauseTimer}>
{paused ? "Start" : "Pause"}
</button>
<button onClick={resetTimer}>Reset</button>
</>
);
}
Песочница: https://codesandbox.io/s/k9j70jrjy5
Вам на самом деле не нужно так много состояний - они зависят друг от друга, так что вы можете упростить логику (конечно, вы можете сделать еще одну функцию для работы / отдыха, которую я не беспокоил).
Вы работаете с таймером расслабления, просто начав с 10 минут вместо 25 минут:
function startRelaxTimer() {
setSeconds(10 * 60);
}
или обрабатывая его в других состояниях, но тогда вам нужно сделать все дважды (это хорошо, только если вы заботитесь о том, чтобы помнить старое состояние при переключении).
const [relax, setRelax] = useState(false);
const [relaxSeconds, setRelaxSeconds] = useState(10 * 60);
useEffect(() => {
const int = setInterval(() => {
console.log(`${Date.now()} - paused: ${paused}`);
if (!paused) {
relax ? setRelaxSecdonds(s => s - 1) : setSeconds(s => s - 1);
}
}, 1000);
return () => {
clearInterval(int);
};
}, [paused, relax]);