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.
 
 
 
 

49 lines
1.4 KiB

import {useReducer} from "react";
import calculateDiff from "../helpers/diff";
const DEFAULT = {
milestones: [],
prevDiff: 0,
prevLongDiff: 0,
};
function reducer(state, {type, payload}) {
switch (type) {
case "measure":
let {prevDiff, prevLongDiff, milestones} = state;
const {minutes, seconds, calories, program, cooldownMin} = payload;
if (minutes === 0 || seconds !== 0) {
return state;
}
const isFive = minutes % 5 === 0;
const diff = calculateDiff({program, minutes, seconds, calories, cooldownMin});
let newMilestones = [...milestones];
if (newMilestones.find(m => m.minutes === minutes) === void(0)) {
newMilestones.push({
minutes, seconds, calories, diff,
prevDiff: isFive ? prevLongDiff : prevDiff
});
}
if (isFive) {
newMilestones = newMilestones.filter(m => m.minutes % 5 === 0);
prevLongDiff = diff;
}
prevDiff = diff;
return {prevLongDiff, prevDiff, milestones: newMilestones};
case "clear":
return {...DEFAULT};
default:
throw new Error(`Unknown type: ${type}`)
}
}
export default function useMilestones() {
const [state, msDispatch] = useReducer(reducer, {...DEFAULT});
const {prevLongDiff, prevDiff, milestones} = state || {...DEFAULT};
return {milestones, prevDiff, prevLongDiff, msDispatch};
}