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
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};
|
|
}
|