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