import React from "react"; import { LocalDateTimeString } from "../../utils/dates"; import { ValidateLocationByParam } from "../../utils/locations"; import useStyles from "../useStyles"; const UNKNOWN = "unknown"; const LOCKED = "Locked"; const UNLOCKED = "Unlocked"; const appendUnits = (value, units) => { if (value || value === 0) return `${value}${units}`; return UNKNOWN; } const keyValueTemplate = (key, value) => (

{key}: {value}

); const openCloseState = (value) => (value ? "open" : "closed"); const mapOpenCloseState = (value) => keyValueTemplate(value[0], openCloseState(value[1])); const windowState = (value) => { if (value[1] === 0 || value[1] > 100) { return keyValueTemplate(value[0], `closed (${value[1]})`); } else { return keyValueTemplate(value[0], `${value[1]}% open`); } } const DigitalTwin = (props) => { const classes = useStyles(); const { battery, doors, location, trex_version, ip, updated, windows, misc_windows, sunroof, dbc_version, door_locks, vcu0x260, charging_metrics, max_range, vehicle_speed } = props; return (
{!battery && !doors && !location && !windows && !vcu0x260 && !charging_metrics && (

No vehicle data to display.

)} {(battery || max_range) && (

Battery

{keyValueTemplate("Percentage", appendUnits(battery?.percent || 0, "%"))} {keyValueTemplate("Total Mileage", appendUnits(battery?.total_mileage_odometer, " km"))} {keyValueTemplate("Voltage", appendUnits(battery?.battery_voltage, " V"))} {keyValueTemplate("Max Range", appendUnits(max_range?.max_miles, " km"))}
)} {(vcu0x260 || charging_metrics) && (

Charging

{keyValueTemplate("Charge Type", vcu0x260?.charge_type || UNKNOWN)} {keyValueTemplate("Remaining Time", appendUnits(charging_metrics?.remaining_charging_time, " min"))}
)} {doors && (

Doors

{Object.entries(doors).map(mapOpenCloseState)}
)} {door_locks && (

Door Locks

{Object.entries(door_locks).map((value) => { return keyValueTemplate(value[0], value[1] ? LOCKED : UNLOCKED); })}
)} {windows && (

Windows

{Object.entries(windows).map((value) => { return windowState(value); })}
)} {misc_windows && (

Misc Windows

{Object.entries(misc_windows).map((value) => { return windowState(value); })}
)} {sunroof && (

Sunroof

{Object.entries(sunroof).map((value) => { return windowState(value); })}
)} {location && (

Location

{Object.entries(location).map((value) => { if (ValidateLocationByParam(value[0], value[1]) === false) { return keyValueTemplate(value[0], "Invalid") } if (value[0] === "altitude") { return keyValueTemplate(value[0], appendUnits(value[1], " m")); } else { return keyValueTemplate(value[0], appendUnits(value[1], "°")); } })}
)} {trex_version && (
{keyValueTemplate("Trex Version", trex_version)}
)} {ip && (
{keyValueTemplate("Trex IP", ip)}
)} {updated != null && (
{keyValueTemplate("Updated At", LocalDateTimeString(updated))}
)} {dbc_version != null && (
{keyValueTemplate("DBC Version", dbc_version)}
)} {vehicle_speed && (
{keyValueTemplate("Vehicle Speed", appendUnits(vehicle_speed?.speed, " km/h"))}
)}
); }; export default DigitalTwin;