Farmbot-Web-App/frontend/devices/components/fbos_settings/firmware_hardware_status.tsx

124 lines
4.3 KiB
TypeScript
Raw Normal View History

2019-04-09 20:09:57 -06:00
import * as React from "react";
import { Popover, Position } from "@blueprintjs/core";
2019-07-15 16:53:28 -06:00
import { FIRMWARE_CHOICES_DDI } from "../firmware_hardware_support";
2019-04-09 20:31:25 -06:00
import { flashFirmware } from "../../actions";
import { t } from "../../../i18next_wrapper";
2020-02-15 11:29:31 -07:00
import { BotState } from "../../interfaces";
2019-04-16 11:03:44 -06:00
import { FirmwareAlerts } from "../../../messages/alerts";
2019-04-11 21:17:01 -06:00
import { TimeSettings } from "../../../interfaces";
import { trim } from "../../../util";
2019-07-12 14:39:40 -06:00
import { Alert } from "farmbot";
2019-07-15 16:53:28 -06:00
import { isFwHardwareValue, boardType } from "../firmware_hardware_support";
2019-04-09 20:09:57 -06:00
export interface FirmwareHardwareStatusIconProps {
firmwareHardware: string | undefined;
2019-04-09 20:31:25 -06:00
status: boolean;
2019-04-09 20:09:57 -06:00
}
export const FirmwareHardwareStatusIcon =
(props: FirmwareHardwareStatusIconProps) => {
2019-04-11 21:17:01 -06:00
const okNoStatus = props.status ? "ok" : "no";
2019-04-09 20:09:57 -06:00
const status = props.firmwareHardware ? okNoStatus : "unknown";
2019-04-09 20:31:25 -06:00
const okNoStatusText = props.status ? t("ok") : t("error");
const statusText = props.firmwareHardware ? okNoStatusText : t("unknown");
const okNoIcon = props.status ? "fa-check-circle" : "fa-times-circle";
2019-04-09 20:09:57 -06:00
const icon = props.firmwareHardware ? okNoIcon : "fa-question-circle";
2019-04-09 20:31:25 -06:00
return <i className={`fa ${icon} status-icon ${status}`} title={statusText} />;
2019-04-09 20:09:57 -06:00
};
2020-02-28 09:50:14 -07:00
export const lookup = (value: string | undefined) =>
2019-04-09 20:09:57 -06:00
value && Object.keys(FIRMWARE_CHOICES_DDI).includes(value)
? FIRMWARE_CHOICES_DDI[value].label : undefined;
2019-04-09 20:31:25 -06:00
export interface FirmwareHardwareStatusDetailsProps {
botOnline: boolean;
2019-07-12 14:39:40 -06:00
alerts: Alert[];
2019-04-09 20:31:25 -06:00
apiFirmwareValue: string | undefined;
botFirmwareValue: string | undefined;
mcuFirmwareValue: string | undefined;
2019-04-11 21:17:01 -06:00
timeSettings: TimeSettings;
2019-04-16 11:03:44 -06:00
dispatch: Function;
2019-04-09 20:09:57 -06:00
}
2019-04-18 16:58:09 -06:00
export interface FlashFirmwareBtnProps {
apiFirmwareValue: string | undefined;
botOnline: boolean;
}
export const FlashFirmwareBtn = (props: FlashFirmwareBtnProps) => {
const { apiFirmwareValue } = props;
return <button className="fb-button yellow"
disabled={!apiFirmwareValue || !props.botOnline}
2020-02-28 09:34:28 -07:00
title={t("flash firmware")}
2019-04-18 16:58:09 -06:00
onClick={() => isFwHardwareValue(apiFirmwareValue) &&
flashFirmware(apiFirmwareValue)}>
{t("flash firmware")}
</button>;
};
2019-04-09 20:31:25 -06:00
export interface FirmwareActionsProps {
apiFirmwareValue: string | undefined;
botOnline: boolean;
}
export const FirmwareActions = (props: FirmwareActionsProps) => {
const { apiFirmwareValue } = props;
return <div className="firmware-actions">
2019-04-11 21:17:01 -06:00
<p>
{trim(`${t("Flash the")} ${lookup(apiFirmwareValue) || ""}
${t("firmware to your device")}:`)}
</p>
2019-04-18 16:58:09 -06:00
<FlashFirmwareBtn {...props} />
2019-04-09 20:31:25 -06:00
</div>;
};
2019-04-09 20:09:57 -06:00
export const FirmwareHardwareStatusDetails =
2019-04-09 20:31:25 -06:00
(props: FirmwareHardwareStatusDetailsProps) => {
return <div className="firmware-hardware-status-details">
<label>{t("Web App")}</label>
2019-04-11 21:17:01 -06:00
<p>{lookup(props.apiFirmwareValue) || t("unknown")}</p>
2019-04-09 20:31:25 -06:00
<label>{t("FarmBot OS")}</label>
2019-04-11 21:17:01 -06:00
<p>{lookup(props.botFirmwareValue) || t("unknown")}</p>
2019-04-09 20:31:25 -06:00
<label>{t("Arduino/Farmduino")}</label>
2019-04-11 21:17:01 -06:00
<p>{lookup(props.mcuFirmwareValue) || t("unknown")}</p>
2020-02-15 11:29:31 -07:00
<label>{t("Actions")}</label>
<FirmwareActions
apiFirmwareValue={props.apiFirmwareValue}
botOnline={props.botOnline} />
2019-04-11 21:17:01 -06:00
<FirmwareAlerts
2019-07-12 14:39:40 -06:00
alerts={props.alerts}
2019-04-16 11:03:44 -06:00
dispatch={props.dispatch}
2019-04-11 21:17:01 -06:00
apiFirmwareValue={props.apiFirmwareValue}
timeSettings={props.timeSettings} />
2019-04-09 20:09:57 -06:00
</div>;
2019-04-09 20:31:25 -06:00
};
2019-04-09 20:09:57 -06:00
2019-04-09 20:31:25 -06:00
export interface FirmwareHardwareStatusProps {
2019-04-09 20:09:57 -06:00
apiFirmwareValue: string | undefined;
2019-07-12 14:39:40 -06:00
alerts: Alert[];
2019-04-09 20:31:25 -06:00
bot: BotState;
botOnline: boolean;
2019-04-11 21:17:01 -06:00
timeSettings: TimeSettings;
2019-04-16 11:03:44 -06:00
dispatch: Function;
2019-04-09 20:09:57 -06:00
}
export const FirmwareHardwareStatus = (props: FirmwareHardwareStatusProps) => {
2019-04-09 20:31:25 -06:00
const { firmware_version } = props.bot.hardware.informational_settings;
const { firmware_hardware } = props.bot.hardware.configuration;
const status = props.apiFirmwareValue == firmware_hardware &&
props.apiFirmwareValue == boardType(firmware_version);
2019-04-18 16:58:09 -06:00
return <Popover position={Position.TOP}>
2019-04-09 20:09:57 -06:00
<FirmwareHardwareStatusIcon
2019-04-09 20:31:25 -06:00
firmwareHardware={firmware_hardware}
status={status} />
<FirmwareHardwareStatusDetails
2019-07-12 14:39:40 -06:00
alerts={props.alerts}
2019-04-09 20:31:25 -06:00
botOnline={props.botOnline}
apiFirmwareValue={props.apiFirmwareValue}
botFirmwareValue={firmware_hardware}
mcuFirmwareValue={boardType(firmware_version)}
2019-04-11 21:17:01 -06:00
timeSettings={props.timeSettings}
2020-02-15 11:29:31 -07:00
dispatch={props.dispatch} />
2019-04-09 20:09:57 -06:00
</Popover>;
};