Sobes.tech
Back to tasks
Junior — Senior
35

Ревью и рефакторинг таймера в React‑компоненте

Companies where asked:

Фоксфорд
Get help with live coding in real time with Sobes Copilot
Task condition

В данном задании представлен React‑компонент, реализующий простой таймер. Требуется провести код‑ревью и выполнить рефакторинг, улучшив читаемость и структуру кода, а также избавиться от потенциальных проблем.

Что нужно сделать:

  • Проанализировать текущую реализацию, выявить места, где код можно упростить или сделать более надёжным.
  • Переписать компонент, используя более понятные имена переменных и функций, избавиться от дублирования логики.
  • При необходимости добавить комментарии, улучшить работу с эффектами и очисткой ресурсов.
  • Сохранить функциональность: кнопка «Start/Pause» должна запускать и приостанавливать счёт, кнопка «Stop» — сбрасывать таймер, а каждый пятый тик должен визуально подсвечиваться.
import { useEffect, useRef, useState } from "react";
import "./App.css";

export default function App() {
  const [isRunning, setIsRunning] = useState(false);
  const [seconds, setSeconds] = useState(0);

  const timerRef = useRef();

  const handleStop = () => {
    setSeconds(0);
    setIsRunning(false);
    clearInterval(timerRef.current);
    timerRef.current = null;
  };

  const handleToggle = () => {
    if (isRunning) {
      clearInterval(timerRef.current);
      timerRef.current = null;
    } else {
      timerRef.current = setInterval(() => {
        setSeconds((prev) => prev + 1);
      }, 1000);
    }
    setIsRunning(!isRunning);
  };

  useEffect(() => {
    if (seconds % 5 === 0 && seconds !== 0) {
      document.querySelector(".timer").classList.add("pulsate");
    }
  }, [seconds]);

  return (
    <div className="main">
      <div>
        <button onClick={handleToggle}>{isRunning ? "Pause" : "Start"}</button>
        <button onClick={handleStop}>Stop</button>
      </div>
      <div className="timer">{seconds}</div>
    </div>
  );
}

Ожидаемый результат: После рефакторинга код должен быть проще для восприятия, не содержать лишних побочных эффектов и корректно работать во всех браузерах.