farmbot-web-frontend
Version:
Farmbot web frontend.
55 lines (51 loc) • 1.6 kB
text/typescript
import { Plant, CropLiveSearchResult } from "./interfaces";
import { Plant as newPlant } from "./plant";
import { generateReducer } from "../generate_reducer";
import { DesignerState } from "./interfaces";
import { cloneDeep } from "lodash";
import { HardwareState } from "../devices/interfaces";
let DEFAULT_STATE = {
plants: [],
x_size: 0,
y_size: 0,
cropSearchQuery: "",
cropSearchResults: []
};
export let designer = generateReducer<DesignerState>(DEFAULT_STATE)
.add<Plant[]>("FETCH_PLANTS_OK", function(s, a) {
let state = cloneDeep(s);
state.plants = a.payload;
return state;
})
.add<Plant>("SAVE_PLANT_OK", function(s, a) {
let state = cloneDeep(s);
// Exxxttrraaa runtime safety.
let plant = newPlant(a.payload);
state.plants.push(plant);
return state;
})
.add<Plant>("DESTROY_PLANT_OK", function(s, { payload }) {
let state = cloneDeep(s);
let a = state.plants;
a.splice(a.indexOf(payload), 1);
return state;
})
.add<HardwareState>("BOT_CHANGE", function(s, { payload }) {
let state = cloneDeep(s);
let [x, y] = [payload.movement_axis_nr_steps_x, payload.movement_axis_nr_steps_y];
if (x && y) {
state.x_size = x;
state.y_size = y;
}
return state;
})
.add<string>("SEARCH_QUERY_CHANGE", function(s, { payload }) {
let state = cloneDeep(s);
state.cropSearchQuery = payload;
return state;
})
.add<CropLiveSearchResult[]>("OF_SEARCH_RESULTS_OK", function(s, { payload }) {
let state = cloneDeep(s);
state.cropSearchResults = payload;
return state;
});