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.
 
 
 
 

47 lines
1.3 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} = payload;
if (minutes === 0 || seconds !== 0) {
return state;
}
const isFive = minutes % 5 === 0;
const diff = calculateDiff(program, minutes, seconds, calories);
let newMilestones = milestones.filter(m => m.minutes !== minutes);
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};
}