dep updates (fe)

pull/1776/head
gabrielburnworth 2020-05-06 15:03:15 -07:00
parent 426f97ddc2
commit 73e9daed05
16 changed files with 210 additions and 95 deletions

View File

@ -1,3 +1,5 @@
jest.mock("../../redux/store", () => ({ store: jest.fn() }));
import { botReducer, initialState } from "../reducer"; import { botReducer, initialState } from "../reducer";
import { Actions } from "../../constants"; import { Actions } from "../../constants";
import { ControlPanelState, BotState } from "../interfaces"; import { ControlPanelState, BotState } from "../interfaces";

View File

@ -43,16 +43,6 @@ describe("<BoardType/>", () => {
expect(wrapper.text()).toContain("Farmduino"); expect(wrapper.text()).toContain("Farmduino");
}); });
it("sets sending status", () => {
const wrapper = mount<BoardType>(<BoardType {...fakeProps()} />);
expect(wrapper.state().sending).toBeFalsy();
const p = fakeProps();
p.sourceFbosConfig = () => ({ value: true, consistent: false });
wrapper.setProps(p);
wrapper.mount();
expect(wrapper.state().sending).toBeTruthy();
});
it("calls updateConfig", () => { it("calls updateConfig", () => {
const p = fakeProps(); const p = fakeProps();
const wrapper = mount<BoardType>(<BoardType {...p} />); const wrapper = mount<BoardType>(<BoardType {...p} />);

View File

@ -13,17 +13,7 @@ import { Highlight } from "../maybe_highlight";
import { DeviceSetting } from "../../../constants"; import { DeviceSetting } from "../../../constants";
import { DevSettings } from "../../../account/dev/dev_support"; import { DevSettings } from "../../../account/dev/dev_support";
interface BoardTypeState { sending: boolean } export class BoardType extends React.Component<BoardTypeProps, {}> {
export class BoardType extends React.Component<BoardTypeProps, BoardTypeState> {
state = {
sending: this.sending
};
UNSAFE_componentWillReceiveProps() {
this.setState({ sending: this.sending });
}
get sending() { get sending() {
return !this.props.sourceFbosConfig("firmware_hardware").consistent; return !this.props.sourceFbosConfig("firmware_hardware").consistent;
} }
@ -39,15 +29,14 @@ export class BoardType extends React.Component<BoardTypeProps, BoardTypeState> {
if (selectedItem && isFwHardwareValue(firmware_hardware)) { if (selectedItem && isFwHardwareValue(firmware_hardware)) {
info(t("Sending firmware configuration..."), t("Sending")); info(t("Sending firmware configuration..."), t("Sending"));
this.props.dispatch(updateConfig({ firmware_hardware })); this.props.dispatch(updateConfig({ firmware_hardware }));
this.setState({ sending: true });
this.forceUpdate(); this.forceUpdate();
} }
} }
FirmwareSelection = () => FirmwareSelection = () =>
<FBSelect <FBSelect
key={this.props.firmwareHardware} key={this.props.firmwareHardware + "" + this.sending}
extraClass={this.state.sending ? "dim" : ""} extraClass={this.sending ? "dim" : ""}
list={getFirmwareChoices()} list={getFirmwareChoices()}
selectedItem={this.selectedBoard} selectedItem={this.selectedBoard}
onChange={this.sendOffConfig} /> onChange={this.sendOffConfig} />

View File

@ -545,7 +545,10 @@ describe("<RepeatForm />", () => {
const fakeProps = (): RepeatFormProps => ({ const fakeProps = (): RepeatFormProps => ({
isRegimen: false, isRegimen: false,
fieldGet: jest.fn(key => fieldGet: jest.fn(key =>
"" + ({ endDate: "2017-07-26" } as FarmEventViewModel)[key]), "" + ({
endDate: "2017-07-26", endTime: "08:57",
startDate: "2017-07-25", startTime: "08:57"
} as FarmEventViewModel)[key]),
fieldSet: jest.fn(), fieldSet: jest.fn(),
timeSettings: fakeTimeSettings(), timeSettings: fakeTimeSettings(),
}); });

View File

@ -1,24 +1,30 @@
import * as React from "react"; jest.mock("../../../../../api/crud", () => ({
import { ImageFilterMenu, ImageFilterMenuProps } from "../image_filter_menu"; edit: jest.fn(),
import { shallow, mount } from "enzyme"; save: jest.fn(),
}));
import { import {
fakeWebAppConfig, fakeWebAppConfig,
} from "../../../../../__test_support__/fake_state/resources"; } from "../../../../../__test_support__/fake_state/resources";
import { StringConfigKey } from "farmbot/dist/resources/configs/web_app";
import { setWebAppConfigValue } from "../../../../../config_storage/actions";
import {
fakeTimeSettings,
} from "../../../../../__test_support__/fake_time_settings";
const mockConfig = fakeWebAppConfig(); const mockConfig = fakeWebAppConfig();
jest.mock("../../../../../resources/selectors", () => ({ jest.mock("../../../../../resources/selectors", () => ({
getWebAppConfig: () => mockConfig, getWebAppConfig: () => mockConfig,
assertUuid: jest.fn(), assertUuid: jest.fn(),
})); }));
jest.mock("../../../../../config_storage/actions", () => ({ import * as React from "react";
setWebAppConfigValue: jest.fn(), import { ImageFilterMenu, ImageFilterMenuProps } from "../image_filter_menu";
})); import { shallow, mount } from "enzyme";
import { StringConfigKey } from "farmbot/dist/resources/configs/web_app";
import {
fakeTimeSettings,
} from "../../../../../__test_support__/fake_time_settings";
import { edit, save } from "../../../../../api/crud";
import { fakeState } from "../../../../../__test_support__/fake_state";
import {
buildResourceIndex,
} from "../../../../../__test_support__/resource_index_builder";
describe("<ImageFilterMenu />", () => { describe("<ImageFilterMenu />", () => {
mockConfig.body.photo_filter_begin = ""; mockConfig.body.photo_filter_begin = "";
@ -45,13 +51,19 @@ describe("<ImageFilterMenu />", () => {
["endDate", "photo_filter_end", 2], ["endDate", "photo_filter_end", 2],
])("sets filter: %s", (filter, key, i) => { ])("sets filter: %s", (filter, key, i) => {
const p = fakeProps(); const p = fakeProps();
const state = fakeState();
const config = fakeWebAppConfig();
state.resources = buildResourceIndex([config]);
p.dispatch = jest.fn(x => x(jest.fn(), () => state));
const wrapper = shallow<ImageFilterMenu>(<ImageFilterMenu {...p} />); const wrapper = shallow<ImageFilterMenu>(<ImageFilterMenu {...p} />);
wrapper.find("BlurableInput").at(i).simulate("commit", { wrapper.find("BlurableInput").at(i).simulate("commit", {
currentTarget: { value: "2001-01-03" } currentTarget: { value: "2001-01-03" }
}); });
expect(wrapper.instance().state[filter]).toEqual("2001-01-03"); expect(wrapper.instance().state[filter]).toEqual("2001-01-03");
expect(setWebAppConfigValue) expect(edit).toHaveBeenCalledWith(config, {
.toHaveBeenCalledWith(key, "2001-01-03T00:00:00.000Z"); [key]: "2001-01-03T00:00:00.000Z"
});
expect(save).toHaveBeenCalledWith(config.uuid);
}); });
it.each<[ it.each<[
@ -61,14 +73,64 @@ describe("<ImageFilterMenu />", () => {
["endTime", "photo_filter_end", 3], ["endTime", "photo_filter_end", 3],
])("sets filter: %s", (filter, key, i) => { ])("sets filter: %s", (filter, key, i) => {
const p = fakeProps(); const p = fakeProps();
const state = fakeState();
const config = fakeWebAppConfig();
state.resources = buildResourceIndex([config]);
p.dispatch = jest.fn(x => x(jest.fn(), () => state));
const wrapper = shallow<ImageFilterMenu>(<ImageFilterMenu {...p} />); const wrapper = shallow<ImageFilterMenu>(<ImageFilterMenu {...p} />);
wrapper.setState({ beginDate: "2001-01-03", endDate: "2001-01-03" }); wrapper.setState({ beginDate: "2001-01-03", endDate: "2001-01-03" });
wrapper.find("BlurableInput").at(i).simulate("commit", { wrapper.find("BlurableInput").at(i).simulate("commit", {
currentTarget: { value: "05:00" } currentTarget: { value: "05:00" }
}); });
expect(wrapper.instance().state[filter]).toEqual("05:00"); expect(wrapper.instance().state[filter]).toEqual("05:00");
expect(setWebAppConfigValue) expect(edit).toHaveBeenCalledWith(config, {
.toHaveBeenCalledWith(key, "2001-01-03T05:00:00.000Z"); [key]: "2001-01-03T05:00:00.000Z"
});
expect(save).toHaveBeenCalledWith(config.uuid);
});
it.each<[
"beginDate" | "endDate",
"photo_filter_begin" | "photo_filter_end",
number
]>([
["beginDate", "photo_filter_begin", 0],
["endDate", "photo_filter_end", 2],
])("unsets filter: %s", (filter, key, i) => {
const p = fakeProps();
const state = fakeState();
const config = fakeWebAppConfig();
state.resources = buildResourceIndex([config]);
p.dispatch = jest.fn(x => x(jest.fn(), () => state));
const wrapper = shallow<ImageFilterMenu>(<ImageFilterMenu {...p} />);
wrapper.setState({ beginDate: "2001-01-03", endDate: "2001-01-03" });
wrapper.find("BlurableInput").at(i).simulate("commit", {
currentTarget: { value: "" }
});
expect(wrapper.instance().state[filter]).toEqual(undefined);
// tslint:disable-next-line:no-null-keyword
expect(edit).toHaveBeenCalledWith(config, { [key]: null });
expect(save).toHaveBeenCalledWith(config.uuid);
});
it.each<[
"beginTime" | "endTime", number
]>([
["beginTime", 1],
["endTime", 3],
])("doesn't set filter: %s", (filter, i) => {
const p = fakeProps();
const state = fakeState();
const config = fakeWebAppConfig();
state.resources = buildResourceIndex([config]);
p.dispatch = jest.fn(x => x(jest.fn(), () => state));
const wrapper = shallow<ImageFilterMenu>(<ImageFilterMenu {...p} />);
wrapper.find("BlurableInput").at(i).simulate("commit", {
currentTarget: { value: "05:00" }
});
expect(wrapper.instance().state[filter]).toEqual("05:00");
expect(edit).not.toHaveBeenCalled();
expect(save).not.toHaveBeenCalled();
}); });
it("loads values from config", () => { it("loads values from config", () => {
@ -83,14 +145,34 @@ describe("<ImageFilterMenu />", () => {
it("changes slider", () => { it("changes slider", () => {
const p = fakeProps(); const p = fakeProps();
const state = fakeState();
const config = fakeWebAppConfig();
state.resources = buildResourceIndex([config]);
p.dispatch = jest.fn(x => x(jest.fn(), () => state));
p.getConfigValue = () => undefined;
p.imageAgeInfo.newestDate = "2001-01-03T05:00:00.000Z"; p.imageAgeInfo.newestDate = "2001-01-03T05:00:00.000Z";
const wrapper = shallow<ImageFilterMenu>(<ImageFilterMenu {...p} />); const wrapper = shallow<ImageFilterMenu>(<ImageFilterMenu {...p} />);
wrapper.instance().sliderChange(1); wrapper.instance().sliderChange(1);
expect(wrapper.instance().state.slider).toEqual(1); expect(wrapper.instance().state.slider).toEqual(1);
expect(setWebAppConfigValue) expect(edit).toHaveBeenCalledWith(config, {
.toHaveBeenCalledWith("photo_filter_begin", "2001-01-02T00:00:00.000Z"); photo_filter_begin: "2001-01-02T00:00:00.000Z",
expect(setWebAppConfigValue) photo_filter_end: "2001-01-03T00:00:00.000Z",
.toHaveBeenCalledWith("photo_filter_end", "2001-01-03T00:00:00.000Z"); });
expect(save).toHaveBeenCalledWith(config.uuid);
});
it("doesn't update config", () => {
const p = fakeProps();
const state = fakeState();
state.resources = buildResourceIndex([]);
p.dispatch = jest.fn(x => x(jest.fn(), () => state));
p.getConfigValue = () => 1;
p.imageAgeInfo.newestDate = "2001-01-03T05:00:00.000Z";
const wrapper = shallow<ImageFilterMenu>(<ImageFilterMenu {...p} />);
wrapper.instance().sliderChange(1);
expect(wrapper.instance().state.slider).toEqual(1);
expect(edit).not.toHaveBeenCalled();
expect(save).not.toHaveBeenCalled();
}); });
it("displays slider labels", () => { it("displays slider labels", () => {

View File

@ -1,9 +1,7 @@
import * as React from "react"; import * as React from "react";
import { BlurableInput } from "../../../../ui/index"; import { BlurableInput } from "../../../../ui/index";
import { offsetTime } from "../../../farm_events/edit_fe_form"; import { offsetTime } from "../../../farm_events/edit_fe_form";
import { import { GetWebAppConfigValue } from "../../../../config_storage/actions";
setWebAppConfigValue, GetWebAppConfigValue,
} from "../../../../config_storage/actions";
import moment from "moment"; import moment from "moment";
import { import {
formatDate, formatTime, formatDate, formatTime,
@ -11,8 +9,13 @@ import {
import { Slider } from "@blueprintjs/core"; import { Slider } from "@blueprintjs/core";
import { t } from "../../../../i18next_wrapper"; import { t } from "../../../../i18next_wrapper";
import { TimeSettings } from "../../../../interfaces"; import { TimeSettings } from "../../../../interfaces";
import { StringConfigKey } from "farmbot/dist/resources/configs/web_app";
import { GetState } from "../../../../redux/interfaces";
import { getWebAppConfig } from "../../../../resources/getters";
import { edit, save } from "../../../../api/crud";
import { isString, isUndefined } from "lodash";
interface ImageFilterMenuState { interface FullImageFilterMenuState {
beginDate: string | undefined; beginDate: string | undefined;
beginTime: string | undefined; beginTime: string | undefined;
endDate: string | undefined; endDate: string | undefined;
@ -20,6 +23,8 @@ interface ImageFilterMenuState {
slider: number; slider: number;
} }
type ImageFilterMenuState = Partial<FullImageFilterMenuState>;
export interface ImageFilterMenuProps { export interface ImageFilterMenuProps {
timeSettings: TimeSettings; timeSettings: TimeSettings;
dispatch: Function; dispatch: Function;
@ -28,26 +33,48 @@ export interface ImageFilterMenuProps {
} }
export class ImageFilterMenu export class ImageFilterMenu
extends React.Component<ImageFilterMenuProps, Partial<ImageFilterMenuState>> { extends React.Component<ImageFilterMenuProps, ImageFilterMenuState> {
constructor(props: ImageFilterMenuProps) { state: ImageFilterMenuState = {};
super(props);
this.state = {};
}
UNSAFE_componentWillMount() { componentDidMount() {
const { newestDate, toOldest } = this.props.imageAgeInfo;
const beginDatetime = this.props.getConfigValue("photo_filter_begin"); const beginDatetime = this.props.getConfigValue("photo_filter_begin");
this.setState({ if (isString(beginDatetime) || isUndefined(beginDatetime)) {
slider: toOldest + 1 - (beginDatetime this.updateSliderState(beginDatetime);
? Math.abs(moment(beginDatetime.toString()) }
.diff(moment(newestDate).clone(), "days")) : 0)
});
this.updateState(); this.updateState();
} }
UNSAFE_componentWillReceiveProps() { updateSliderState = (begin: string | undefined) => {
this.updateState(); const { newestDate, toOldest } = this.props.imageAgeInfo;
} const offset = begin ? Math.abs(moment(begin.toString())
.diff(moment(newestDate).clone(), "days")) : 0;
this.setState({ slider: toOldest + 1 - offset });
};
setValues = (update: StringValueUpdate) => {
Object.entries(update).map(([key, value]) => {
switch (key) {
case "photo_filter_begin":
this.updateSliderState(value);
value
? this.setState({
beginDate: formatDate(value.toString(), this.props.timeSettings),
beginTime: formatTime(value.toString(), this.props.timeSettings),
})
: this.setState({ beginDate: undefined, beginTime: undefined });
break;
case "photo_filter_end":
value
? this.setState({
endDate: formatDate(value.toString(), this.props.timeSettings),
endTime: formatTime(value.toString(), this.props.timeSettings),
})
: this.setState({ endDate: undefined, endTime: undefined });
break;
}
});
this.props.dispatch(setWebAppConfigValues(update));
};
updateState = () => { updateState = () => {
const beginDatetime = this.props.getConfigValue("photo_filter_begin"); const beginDatetime = this.props.getConfigValue("photo_filter_begin");
@ -70,27 +97,27 @@ export class ImageFilterMenu
const input = e.currentTarget.value; const input = e.currentTarget.value;
this.setState({ [datetime]: input }); this.setState({ [datetime]: input });
const { beginDate, beginTime, endDate, endTime } = this.state; const { beginDate, beginTime, endDate, endTime } = this.state;
const { dispatch, timeSettings } = this.props; const { timeSettings } = this.props;
let value = undefined; let value = undefined;
switch (datetime) { switch (datetime) {
case "beginDate": case "beginDate":
value = offsetTime(input, beginTime || "00:00", timeSettings); value = offsetTime(input, beginTime || "00:00", timeSettings);
dispatch(setWebAppConfigValue("photo_filter_begin", value)); this.setValues({ photo_filter_begin: value });
break; break;
case "beginTime": case "beginTime":
if (beginDate) { if (beginDate) {
value = offsetTime(beginDate, input, timeSettings); value = offsetTime(beginDate, input, timeSettings);
dispatch(setWebAppConfigValue("photo_filter_begin", value)); this.setValues({ photo_filter_begin: value });
} }
break; break;
case "endDate": case "endDate":
value = offsetTime(input, endTime || "00:00", timeSettings); value = offsetTime(input, endTime || "00:00", timeSettings);
dispatch(setWebAppConfigValue("photo_filter_end", value)); this.setValues({ photo_filter_end: value });
break; break;
case "endTime": case "endTime":
if (endDate) { if (endDate) {
value = offsetTime(endDate, input, timeSettings); value = offsetTime(endDate, input, timeSettings);
dispatch(setWebAppConfigValue("photo_filter_end", value)); this.setValues({ photo_filter_end: value });
} }
break; break;
} }
@ -100,13 +127,12 @@ export class ImageFilterMenu
sliderChange = (slider: number) => { sliderChange = (slider: number) => {
const { newestDate, toOldest } = this.props.imageAgeInfo; const { newestDate, toOldest } = this.props.imageAgeInfo;
this.setState({ slider }); this.setState({ slider });
const { dispatch, timeSettings } = this.props; const { timeSettings } = this.props;
const calcDate = (day: number) => const calcDate = (day: number) =>
moment(newestDate).subtract(toOldest - day, "days").toISOString(); moment(newestDate).subtract(toOldest - day, "days").toISOString();
const begin = offsetTime(calcDate(slider - 1), "00:00", timeSettings); const begin = offsetTime(calcDate(slider - 1), "00:00", timeSettings);
const end = offsetTime(calcDate(slider), "00:00", timeSettings); const end = offsetTime(calcDate(slider), "00:00", timeSettings);
dispatch(setWebAppConfigValue("photo_filter_begin", begin)); this.setValues({ photo_filter_begin: begin, photo_filter_end: end });
dispatch(setWebAppConfigValue("photo_filter_end", end));
} }
renderLabel = (day: number) => { renderLabel = (day: number) => {
@ -191,3 +217,14 @@ export class ImageFilterMenu
</div>; </div>;
} }
} }
type StringValueUpdate = Partial<Record<StringConfigKey, string | undefined>>;
const setWebAppConfigValues = (update: StringValueUpdate) =>
(dispatch: Function, getState: GetState) => {
const webAppConfig = getWebAppConfig(getState().resources.index);
if (webAppConfig) {
dispatch(edit(webAppConfig, update));
dispatch(save(webAppConfig.uuid));
}
};

View File

@ -73,7 +73,7 @@ export class SpreadCircle extends
React.Component<SpreadCircleProps, SpreadCircleState> { React.Component<SpreadCircleProps, SpreadCircleState> {
state: SpreadCircleState = { spread: undefined }; state: SpreadCircleState = { spread: undefined };
UNSAFE_componentWillMount = () => { componentDidMount = () => {
cachedCrop(this.props.plant.body.openfarm_slug) cachedCrop(this.props.plant.body.openfarm_slug)
.then(({ spread }) => this.setState({ spread })); .then(({ spread }) => this.setState({ spread }));
} }

View File

@ -78,12 +78,12 @@ describe("<CreatePoints />", () => {
it("updates specific fields", () => { it("updates specific fields", () => {
const p = fakeProps(); const p = fakeProps();
p.drawnPoint = FAKE_POINT; p.drawnPoint = FAKE_POINT;
const i = new CreatePoints(p); const wrapper = mount<CreatePoints>(<CreatePoints {...p} />);
i.updateValue("color")(inputEvent("cheerful hue")); wrapper.instance().updateValue("color")(inputEvent("cheerful hue"));
expect(i.props.drawnPoint).toBeTruthy(); expect(wrapper.instance().props.drawnPoint).toBeTruthy();
const expected = cloneDeep(FAKE_POINT); const expected = cloneDeep(FAKE_POINT);
expected.color = "cheerful hue"; expected.color = "cheerful hue";
expect(i.props.dispatch).toHaveBeenCalledWith({ expect(wrapper.instance().props.dispatch).toHaveBeenCalledWith({
type: "SET_DRAWN_POINT_DATA", type: "SET_DRAWN_POINT_DATA",
payload: expected, payload: expected,
}); });

View File

@ -122,7 +122,7 @@ export class RawCreatePoints
}); });
} }
UNSAFE_componentWillMount() { componentDidMount() {
this.loadDefaultPoint(); this.loadDefaultPoint();
} }

View File

@ -73,11 +73,11 @@ export const AdditionalWeedProperties = (props: AdditionalWeedPropertiesProps) =
case "type": return <div key={key} case "type": return <div key={key}
className={`meta-${key}-not-displayed`} />; className={`meta-${key}-not-displayed`} />;
case "created_by": case "created_by":
return <ListItem name={t("Source")}> return <ListItem name={t("Source")} key={key}>
{SOURCE_LOOKUP()[value || ""] || t("unknown")} {SOURCE_LOOKUP()[value || ""] || t("unknown")}
</ListItem>; </ListItem>;
case "removal_method": case "removal_method":
return <ListItem name={t("Removal method")}> return <ListItem name={t("Removal method")} key={key}>
<div className="weed-removal-method-section"> <div className="weed-removal-method-section">
{REMOVAL_METHODS.map(method => {REMOVAL_METHODS.map(method =>
<div className={"weed-removal-method"} key={method}> <div className={"weed-removal-method"} key={method}>
@ -93,7 +93,7 @@ export const AdditionalWeedProperties = (props: AdditionalWeedPropertiesProps) =
</div> </div>
</ListItem>; </ListItem>;
default: default:
return <ListItem name={key}> return <ListItem name={key} key={key}>
{value || ""} {value || ""}
</ListItem>; </ListItem>;
} }

View File

@ -124,7 +124,7 @@ export class RawFarmwarePage extends React.Component<FarmwareProps, {}> {
return isBotOnline(this.props.syncStatus, this.props.botToMqttStatus); return isBotOnline(this.props.syncStatus, this.props.botToMqttStatus);
} }
UNSAFE_componentWillMount() { componentDidMount() {
if (window.innerWidth > 450) { if (window.innerWidth > 450) {
this.props.dispatch({ this.props.dispatch({
type: Actions.SELECT_FARMWARE, type: Actions.SELECT_FARMWARE,

View File

@ -26,6 +26,8 @@ jest.mock("../../api", () => ({
} }
})); }));
jest.mock("../laptop_splash", () => ({ LaptopSplash: () => <div /> }));
import * as React from "react"; import * as React from "react";
import { mount, shallow } from "enzyme"; import { mount, shallow } from "enzyme";
import { FrontPage, setField, PartialFormEvent } from "../front_page"; import { FrontPage, setField, PartialFormEvent } from "../front_page";

View File

@ -0,0 +1,10 @@
import * as React from "react";
import { shallow } from "enzyme";
import { LaptopSplash } from "../laptop_splash";
describe("<LaptopSplash />", () => {
it("renders", () => {
const wrapper = shallow(<LaptopSplash className={""} />);
expect(wrapper.find("video").length).toEqual(1);
});
});

View File

@ -28,7 +28,7 @@ export const RegimenBackButton = (props: RegimenBackButtonProps) => {
}; };
export class RawRegimens extends React.Component<Props, {}> { export class RawRegimens extends React.Component<Props, {}> {
UNSAFE_componentWillMount() { componentDidMount() {
if (!this.props.current) { setActiveRegimenByName(); } if (!this.props.current) { setActiveRegimenByName(); }
} }

View File

@ -28,7 +28,7 @@ export const SequenceBackButton = (props: SequenceBackButtonProps) => {
}; };
export class RawSequences extends React.Component<Props, {}> { export class RawSequences extends React.Component<Props, {}> {
UNSAFE_componentWillMount() { componentDidMount() {
if (!this.props.sequence) { setActiveSequenceByName(); } if (!this.props.sequence) { setActiveSequenceByName(); }
} }

View File

@ -24,16 +24,16 @@
"author": "farmbot.io", "author": "farmbot.io",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/core": "7.9.0", "@babel/core": "7.9.6",
"@blueprintjs/core": "3.26.0", "@blueprintjs/core": "3.26.1",
"@blueprintjs/datetime": "3.16.1", "@blueprintjs/datetime": "3.17.0",
"@blueprintjs/select": "3.12.2", "@blueprintjs/select": "3.12.3",
"@types/enzyme": "3.10.5", "@types/enzyme": "3.10.5",
"@types/jest": "25.2.1", "@types/jest": "25.2.1",
"@types/lodash": "4.14.150", "@types/lodash": "4.14.150",
"@types/markdown-it": "10.0.1", "@types/markdown-it": "10.0.1",
"@types/moxios": "0.4.9", "@types/moxios": "0.4.9",
"@types/node": "13.13.4", "@types/node": "13.13.5",
"@types/promise-timeout": "1.3.0", "@types/promise-timeout": "1.3.0",
"@types/react": "16.9.34", "@types/react": "16.9.34",
"@types/react-color": "3.0.1", "@types/react-color": "3.0.1",
@ -51,21 +51,21 @@
"lodash": "4.17.15", "lodash": "4.17.15",
"markdown-it": "10.0.0", "markdown-it": "10.0.0",
"markdown-it-emoji": "1.4.0", "markdown-it-emoji": "1.4.0",
"moment": "2.24.0", "moment": "2.25.3",
"moxios": "0.4.0", "moxios": "0.4.0",
"mqtt": "4.0.0", "mqtt": "4.0.0",
"npm": "6.14.4", "npm": "6.14.5",
"parcel-bundler": "1.12.4", "parcel-bundler": "1.12.4",
"promise-timeout": "1.3.0", "promise-timeout": "1.3.0",
"raf": "3.4.1", "raf": "3.4.1",
"react": "16.13.1", "react": "16.13.1",
"react-addons-test-utils": "15.6.2", "react-addons-test-utils": "15.6.2",
"react-color": "2.18.0", "react-color": "2.18.1",
"react-dom": "16.13.1", "react-dom": "16.13.1",
"react-joyride": "2.2.1", "react-joyride": "2.2.1",
"react-redux": "7.2.0", "react-redux": "7.2.0",
"react-test-renderer": "16.13.1", "react-test-renderer": "16.13.1",
"react-transition-group": "4.3.0", "react-transition-group": "4.4.1",
"redux": "4.0.5", "redux": "4.0.5",
"redux-immutable-state-invariant": "2.1.0", "redux-immutable-state-invariant": "2.1.0",
"redux-thunk": "2.3.0", "redux-thunk": "2.3.0",
@ -78,8 +78,8 @@
"which": "2.0.2" "which": "2.0.2"
}, },
"devDependencies": { "devDependencies": {
"jest": "25.4.0", "jest": "25.5.4",
"jest-cli": "25.4.0", "jest-cli": "25.5.4",
"jest-junit": "10.0.0", "jest-junit": "10.0.0",
"jest-skipped-reporter": "0.0.5", "jest-skipped-reporter": "0.0.5",
"jshint": "2.11.0", "jshint": "2.11.0",