import * as React from "react"; import axios from "axios"; import { t } from "../../i18next_wrapper"; import { FarmbotOsProps, FarmbotOsState, Feature } from "../interfaces"; import { Widget, WidgetHeader, WidgetBody, Row, Col } from "../../ui"; import { save, edit } from "../../api/crud"; import { isBotOnline } from "../must_be_online"; import { Content, DeviceSetting } from "../../constants"; import { TimezoneSelector } from "../timezones/timezone_selector"; import { timezoneMismatch } from "../timezones/guess_timezone"; import { CameraSelection } from "./fbos_settings/camera_selection"; import { BoardType } from "./fbos_settings/board_type"; import { FarmbotOsRow } from "./fbos_settings/farmbot_os_row"; import { AutoUpdateRow } from "./fbos_settings/auto_update_row"; import { AutoSyncRow } from "./fbos_settings/auto_sync_row"; import { PowerAndReset } from "./fbos_settings/power_and_reset"; import { BootSequenceSelector } from "./fbos_settings/boot_sequence_selector"; import { ExternalUrl } from "../../external_urls"; import { Highlight } from "./maybe_highlight"; import { OtaTimeSelectorRow } from "./fbos_settings/ota_time_selector"; export enum ColWidth { label = 3, description = 7, button = 2 } export class FarmbotOsSettings extends React.Component { state: FarmbotOsState = { allOsReleaseNotes: "" }; componentDidMount() { this.fetchReleaseNotes(ExternalUrl.osReleaseNotes); } get osMajorVersion() { return (this.props.bot.hardware.informational_settings .controller_version || "6").split(".")[0]; } fetchReleaseNotes = (url: string) => { axios .get(url) .then(resp => this.setState({ allOsReleaseNotes: resp.data })) .catch(() => this.setState({ allOsReleaseNotes: "" })); } get osReleaseNotes() { const notes = (this.state.allOsReleaseNotes .split("# v") .filter(x => x.startsWith(this.osMajorVersion))[0] || "") .split("\n\n").slice(1).join("\n") || t("Could not get release notes."); const heading = "FarmBot OS v" + this.osMajorVersion; return { heading, notes }; } changeBot = (e: React.FormEvent) => { const { deviceAccount, dispatch } = this.props; dispatch(edit(deviceAccount, { name: e.currentTarget.value })); } updateBot = () => { const { deviceAccount, dispatch } = this.props; dispatch(save(deviceAccount.uuid)); } handleTimezone = (timezone: string) => { const { deviceAccount, dispatch } = this.props; dispatch(edit(deviceAccount, { timezone })); dispatch(save(deviceAccount.uuid)); } maybeWarnTz = () => { const wrongTZ = timezoneMismatch(this.props.deviceAccount.body.timezone); return wrongTZ ? t(Content.DIFFERENT_TZ_WARNING) : ""; } render() { const { bot, sourceFbosConfig, botToMqttStatus } = this.props; const { sync_status } = bot.hardware.informational_settings; const botOnline = isBotOnline(sync_status, botToMqttStatus); return
e.preventDefault()}>
{this.maybeWarnTz()}
{this.props.shouldDisplay(Feature.boot_sequence) && }
; } }