TimerControl.jsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import { useState, useEffect } from "react";
  2. function Timer({sec}) {
  3. const [count, setCount] = useState(sec);
  4. const [isPaused, setIsPaused] = useState(false);
  5. useEffect(() => {
  6. let timer;
  7. if (count > 0 && isPaused === true) {
  8. timer = setTimeout(() => setCount(count - 1), 1000);
  9. }
  10. return () => {
  11. clearTimeout(timer);
  12. };
  13. }, [count, isPaused]);
  14. useEffect(() => {
  15. setCount(sec);
  16. }, [sec]);
  17. const onBtnPauseClick = () => {
  18. setIsPaused(!isPaused);
  19. };
  20. const h = Math.floor(count / 3600);
  21. const s = count % 60;
  22. const min = Math.floor(count % 3600 / 60);
  23. return (
  24. <div>
  25. <div>{h < 10 ? '0' + h : h}:{min < 10 ? '0' + min : min}:{s < 10 ? '0' + s : s}</div>
  26. <button
  27. className="buttonForTimer"
  28. onClick={onBtnPauseClick}>
  29. {isPaused ? 'Pause' : 'Start'}
  30. </button>
  31. </div>
  32. );
  33. }
  34. function TimerControle() {
  35. const [sec, setSec] = useState(0);
  36. const [min, setMin] = useState(0);
  37. const [hours, setHours] = useState(0);
  38. return (
  39. <div>
  40. <input
  41. name="hours"
  42. type="number"
  43. placeholder="Часы"
  44. onChange={(e) => setHours(+e.target.value)}
  45. />
  46. <input
  47. name="minutes"
  48. type="number"
  49. placeholder="Минуты"
  50. onChange={(e) => setMin(+e.target.value)}
  51. />
  52. <input
  53. name="sec"
  54. type="number"
  55. placeholder="Секунды"
  56. onChange={(e) => setSec(+e.target.value)}
  57. />
  58. <Timer sec={hours * 3600 + min * 60 + sec} />
  59. </div>
  60. );
  61. }
  62. export default TimerControle;