You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
1.3 KiB

5 years ago
5 years ago
  1. import {useReducer} from "react";
  2. import calculateDiff from "../helpers/diff";
  3. const DEFAULT = {
  4. milestones: [],
  5. prevDiff: 0,
  6. prevLongDiff: 0,
  7. };
  8. function reducer(state, {type, payload}) {
  9. switch (type) {
  10. case "measure":
  11. let {prevDiff, prevLongDiff, milestones} = state;
  12. const {minutes, seconds, calories, program} = payload;
  13. if (minutes === 0 || seconds !== 0) {
  14. return state;
  15. }
  16. const isFive = minutes % 5 === 0;
  17. const diff = calculateDiff(program, minutes, seconds, calories);
  18. let newMilestones = milestones.filter(m => m.minutes !== minutes);
  19. newMilestones.push({
  20. minutes, seconds, calories, diff,
  21. prevDiff: isFive ? prevLongDiff : prevDiff
  22. });
  23. if (isFive) {
  24. newMilestones = newMilestones.filter(m => m.minutes % 5 === 0);
  25. prevLongDiff = diff;
  26. }
  27. prevDiff = diff;
  28. return {prevLongDiff, prevDiff, milestones: newMilestones};
  29. case "clear":
  30. return {...DEFAULT};
  31. default:
  32. throw new Error(`Unknown type: ${type}`)
  33. }
  34. }
  35. export default function useMilestones() {
  36. const [state, msDispatch] = useReducer(reducer, {...DEFAULT});
  37. const {prevLongDiff, prevDiff, milestones} = state || {...DEFAULT};
  38. return {milestones, prevDiff, prevLongDiff, msDispatch};
  39. }