Farmbot-Web-App/frontend/regimens/reducer.ts

90 lines
2.3 KiB
TypeScript
Raw Normal View History

2019-02-04 07:32:26 -07:00
import { times } from "lodash";
import { Dictionary, TaggedResource } from "farmbot";
2017-07-21 15:36:57 -06:00
import { Week, DAYS } from "./bulk_scheduler/interfaces";
2017-06-29 12:54:02 -06:00
import { generateReducer } from "../redux/generate_reducer";
import { Actions } from "../constants";
export interface RegimenState {
dailyOffsetMs: number;
weeks: Week[];
selectedSequenceUUID?: string | undefined;
currentRegimen?: string | undefined;
2019-04-09 19:45:59 -06:00
schedulerOpen: boolean;
2017-06-29 12:54:02 -06:00
}
2020-04-23 13:12:04 -06:00
export function newWeek(): Week {
2017-06-29 12:54:02 -06:00
return {
days: {
day1: false,
day2: false,
day3: false,
day4: false,
day5: false,
day6: false,
day7: false
}
};
}
function newState(): RegimenState {
return {
dailyOffsetMs: 300000,
2019-02-04 07:32:26 -07:00
weeks: times(10, newWeek),
2017-06-29 12:54:02 -06:00
selectedSequenceUUID: undefined,
2019-04-09 19:45:59 -06:00
currentRegimen: undefined,
schedulerOpen: false,
2017-06-29 12:54:02 -06:00
};
}
export const initialState: RegimenState = newState();
2017-06-29 12:54:02 -06:00
export const regimensReducer = generateReducer<RegimenState>(initialState)
2017-06-29 12:54:02 -06:00
.add<TaggedResource>(Actions.DESTROY_RESOURCE_OK, (s, { payload }) => {
switch (payload.uuid) {
case s.selectedSequenceUUID:
case s.currentRegimen:
s.selectedSequenceUUID = undefined;
break;
}
return s;
})
.add<void>(Actions.PUSH_WEEK, (s) => {
2017-06-29 12:54:02 -06:00
s.weeks.push(newWeek());
return s;
})
.add<void>(Actions.POP_WEEK, (s) => {
2017-06-29 12:54:02 -06:00
s.weeks.pop();
return s;
})
.add<void>(Actions.DESELECT_ALL_DAYS, (s) => {
2017-07-21 15:36:57 -06:00
s.weeks.map((week) => DAYS.map((key) => week.days[key] = false));
2017-07-21 13:06:16 -06:00
return s;
})
.add<void>(Actions.SELECT_ALL_DAYS, (s) => {
2017-07-21 15:36:57 -06:00
s.weeks.map((week) => DAYS.map((key) => week.days[key] = true));
2017-07-21 13:06:16 -06:00
return s;
})
2017-06-29 12:54:02 -06:00
.add<{ week: number, day: number }>(Actions.TOGGLE_DAY, (s, { payload }) => {
2017-08-28 05:49:13 -06:00
const week = s.weeks[payload.week];
const day = `day${payload.day}`;
const days = (week.days as Dictionary<boolean>);
2017-06-29 12:54:02 -06:00
days[day] = !days[day];
return s;
})
2018-05-01 22:14:41 -06:00
.add<string>(Actions.SELECT_REGIMEN, (s, { payload }) => {
s.currentRegimen = payload;
2017-06-29 12:54:02 -06:00
return s;
})
.add<string>(Actions.SET_SEQUENCE, (s, { payload }) => {
s.selectedSequenceUUID = payload;
return s;
})
.add<number>(Actions.SET_TIME_OFFSET, (s, { payload }) => {
s.dailyOffsetMs = payload;
return s;
2019-04-09 19:45:59 -06:00
})
.add<boolean>(Actions.SET_SCHEDULER_STATE, (s, { payload }) => {
s.schedulerOpen = payload;
return s;
2017-06-29 12:54:02 -06:00
});