Как я могу обновить циклы в таймере React Pomodoro?

#javascript #reactjs #react-native #timer #react-hooks

#язык JavaScript #реагирует на #реагировать-родной #таймер #реагируют-крючки

Вопрос:

Я пытаюсь обновить состояние циклов таймера pomodoro, поэтому, когда он достигнет 4, он должен войти в длительный период отдыха, а затем, после завершения этого периода, он должен начать все сначала со значениями по умолчанию, но по какой-то причине мое состояние «pomodoros» вообще не обновляется… я что-то упускаю? без этой функции цикла все работает просто отлично… Вот мой код:

 import React, { useContext, useState, useEffect, useRef } from "react"; import { Row, Col } from "react-bootstrap"; import { buildStyles, CircularProgressbar } from "react-circular-progressbar"; import Btn from "./Btn"; import SettingsContext from "../context/SettingsContext"; import "react-circular-progressbar/dist/styles.css";  const red = "#e83283"; const green = "#41d7a7";  const Timer = ({ showSettings }) =gt; { const [isPaused, setIsPaused] = useState(true); const [mode, setMode] = useState("work"); // Can be: Work / Rest / Long Rest const [pomodoros, setPomodoros] = useState(0); const [secondsLeft, setSecondsLeft] = useState(null);  const timerInfo = useContext(SettingsContext);  const isPausedRef = useRef(isPaused); const modeRef = useRef(mode); const secondsLeftRef = useRef(secondsLeft); const pomodorosRef = useRef(pomodoros);  const totalSeconds = mode === "work"  ? timerInfo.workMinutes * 60  : mode === "longrest"  ? timerInfo.restMinutes * 4 * 60  : timerInfo.restMinutes * 60;   useEffect(() =gt; { initTimer();  const interval = setInterval(() =gt; {  if (isPausedRef.current) return;   if (secondsLeftRef.current === 0) {  return switchMode();  }   if (modeRef.current === "rest" amp;amp; secondsLeftRef.current === 0) {  return addPomodoro();  }   tick(); }, 1000);  return () =gt; clearInterval(interval);  }, [timerInfo]);   const initTimer = () =gt; { secondsLeftRef.current = totalSeconds; setSecondsLeft(secondsLeftRef.current);  };   const switchMode = () =gt; { const nextMode =  modeRef.current === "work"  ? pomodorosRef.current === 4  ? "longrest"  : "rest"  : "work"; const nextSeconds =  nextMode === "work"  ? timerInfo.workMinutes * 60  : nextMode === "longrest"  ? timerInfo.restMinutes * 4 * 60  : timerInfo.restMinutes * 60;  setMode(nextMode); modeRef.current = nextMode;  setSecondsLeft(nextSeconds); secondsLeftRef.current = nextSeconds;  };   const tick = () =gt; { secondsLeftRef.current--; setSecondsLeft(secondsLeftRef.current);  };   const addPomodoro = () =gt; { const nextPomodoro = pomodorosRef.current   1; setPomodoros(nextPomodoro); pomodorosRef.current = nextPomodoro;  };   const togglePause = () =gt; { setIsPaused(!isPausedRef.current); isPausedRef.current = isPaused === true ? false : true;  };   const percentage = Math.round((secondsLeft / totalSeconds) * 100);  const showMinutes = Math.floor(secondsLeft / 60);  let showSeconds = secondsLeft % 60;   if (showSeconds lt; 10) { showSeconds = "0"   showSeconds;  }