App_timer_container.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import logo from './logo.svg';
  2. import React, { useState, useEffect } from 'react';
  3. import './App.scss';
  4. import { getTimeData, getTotalSeconds } from './utills';
  5. const TimerContainer = ({ count, render, refresh = 1000 , running = false}) => {
  6. let [state, setState] = useState({ paused: !running, count, ...getTimeData(count) });
  7. useEffect(() => {
  8. let timer = undefined;
  9. if (!state.paused) {
  10. if (state.count > 0) {
  11. const now = new Date();
  12. const nextTime = Math.max(1, 1000 - (now.getTime() % refresh));
  13. timer = setInterval(() => setStateInt({ count: state.count - 1 }), nextTime);
  14. }
  15. else
  16. pause();
  17. }
  18. return () => clearInterval(timer);
  19. }, [state]);
  20. const setStateInt = newState => setState(state = { ...state, ...newState });
  21. const start = () => setStateInt({ paused: false });
  22. const pause = () => setStateInt({ paused: true });
  23. const reset = () => setStateInt({ count });
  24. const stop = () => {
  25. pause();
  26. reset();
  27. }
  28. let timer = getTimeData(state.count);
  29. let Render = render;
  30. return (
  31. <>
  32. <input value={state.hours}
  33. onChange={e => setStateInt({ hours: e.target.value, count: getTotalSeconds(e.target.value, state.minutes, state.seconds) })}
  34. type="number" />
  35. <input value={state.minutes}
  36. onChange={e => setStateInt({ minutes: e.target.value, count: getTotalSeconds(state.hours, e.target.value, state.seconds) })}
  37. type="number" />
  38. <input value={state.seconds}
  39. onChange={e => setStateInt({ seconds: e.target.value, count: getTotalSeconds(state.hours, state.minutes, e.target.value) })}
  40. type="number" />
  41. {/*{time.hours} : {time.minutes} : {time.seconds}*/}
  42. {/*React.cloneElement(render, { ...render.props, timer })*/}
  43. <Render timer={timer} />
  44. <br />
  45. <button onClick={() => start()}>Start</button>
  46. <button onClick={() => pause()}>Pause</button>
  47. <button onClick={() => reset()}>Reset</button>
  48. <button onClick={() => stop()}>Stop</button>
  49. </>
  50. );
  51. }
  52. const SecondsTimer = (props) => <h2>{props.timer.totalSeconds}</h2>;
  53. function App() {
  54. return (
  55. <>
  56. <div className="App">
  57. <TimerContainer count={10} render={SecondsTimer} />
  58. </div>
  59. </>
  60. );
  61. }
  62. export default App;