Merge branch 'develop' into release/0.0.3

This commit is contained in:
jwu-fisker
2023-03-21 15:59:44 -07:00
20 changed files with 780 additions and 121 deletions

View File

@@ -14,6 +14,30 @@ exports[`App Route / authenticated 1`] = `
<div <div
class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters" class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters"
> >
<button
aria-label="toggle drawer"
class="MuiButtonBase-root MuiIconButton-root makeStyles-menuButton-0 MuiIconButton-colorInherit MuiIconButton-edgeStart"
tabindex="0"
type="button"
>
<span
class="MuiIconButton-label"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"
/>
</svg>
</span>
<span
class="MuiTouchRipple-root"
/>
</button>
<div> <div>
<h6 <h6
class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap" class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap"
@@ -650,6 +674,30 @@ exports[`App Route /home authenticated 1`] = `
<div <div
class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters" class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters"
> >
<button
aria-label="toggle drawer"
class="MuiButtonBase-root MuiIconButton-root makeStyles-menuButton-0 MuiIconButton-colorInherit MuiIconButton-edgeStart"
tabindex="0"
type="button"
>
<span
class="MuiIconButton-label"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"
/>
</svg>
</span>
<span
class="MuiTouchRipple-root"
/>
</button>
<div> <div>
<h6 <h6
class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap" class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap"
@@ -1286,6 +1334,30 @@ exports[`App Route /issue-info authenticated 1`] = `
<div <div
class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters" class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters"
> >
<button
aria-label="toggle drawer"
class="MuiButtonBase-root MuiIconButton-root makeStyles-menuButton-0 MuiIconButton-colorInherit MuiIconButton-edgeStart"
tabindex="0"
type="button"
>
<span
class="MuiIconButton-label"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"
/>
</svg>
</span>
<span
class="MuiTouchRipple-root"
/>
</button>
<div> <div>
<h6 <h6
class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap" class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap"
@@ -1905,6 +1977,30 @@ exports[`App Route /issues authenticated 1`] = `
<div <div
class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters" class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters"
> >
<button
aria-label="toggle drawer"
class="MuiButtonBase-root MuiIconButton-root makeStyles-menuButton-0 MuiIconButton-colorInherit MuiIconButton-edgeStart"
tabindex="0"
type="button"
>
<span
class="MuiIconButton-label"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"
/>
</svg>
</span>
<span
class="MuiTouchRipple-root"
/>
</button>
<div> <div>
<h6 <h6
class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap" class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap"
@@ -2767,6 +2863,30 @@ exports[`App Route /package-deploy authenticated 1`] = `
<div <div
class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters" class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters"
> >
<button
aria-label="toggle drawer"
class="MuiButtonBase-root MuiIconButton-root makeStyles-menuButton-0 MuiIconButton-colorInherit MuiIconButton-edgeStart"
tabindex="0"
type="button"
>
<span
class="MuiIconButton-label"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"
/>
</svg>
</span>
<span
class="MuiTouchRipple-root"
/>
</button>
<div> <div>
<h6 <h6
class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap" class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap"
@@ -3838,6 +3958,30 @@ exports[`App Route /package-status authenticated 1`] = `
<div <div
class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters" class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters"
> >
<button
aria-label="toggle drawer"
class="MuiButtonBase-root MuiIconButton-root makeStyles-menuButton-0 MuiIconButton-colorInherit MuiIconButton-edgeStart"
tabindex="0"
type="button"
>
<span
class="MuiIconButton-label"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"
/>
</svg>
</span>
<span
class="MuiTouchRipple-root"
/>
</button>
<div> <div>
<h6 <h6
class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap" class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap"
@@ -4644,6 +4788,30 @@ exports[`App Route /packages authenticated 1`] = `
<div <div
class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters" class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters"
> >
<button
aria-label="toggle drawer"
class="MuiButtonBase-root MuiIconButton-root makeStyles-menuButton-0 MuiIconButton-colorInherit MuiIconButton-edgeStart"
tabindex="0"
type="button"
>
<span
class="MuiIconButton-label"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"
/>
</svg>
</span>
<span
class="MuiTouchRipple-root"
/>
</button>
<div> <div>
<h6 <h6
class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap" class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap"
@@ -5664,6 +5832,30 @@ exports[`App Route /page-not-found authenticated 1`] = `
<div <div
class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters" class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters"
> >
<button
aria-label="toggle drawer"
class="MuiButtonBase-root MuiIconButton-root makeStyles-menuButton-0 MuiIconButton-colorInherit MuiIconButton-edgeStart"
tabindex="0"
type="button"
>
<span
class="MuiIconButton-label"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"
/>
</svg>
</span>
<span
class="MuiTouchRipple-root"
/>
</button>
<div> <div>
<h6 <h6
class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap" class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap"
@@ -6225,6 +6417,30 @@ exports[`App Route /tools/certificates/add authenticated 1`] = `
<div <div
class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters" class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters"
> >
<button
aria-label="toggle drawer"
class="MuiButtonBase-root MuiIconButton-root makeStyles-menuButton-0 MuiIconButton-colorInherit MuiIconButton-edgeStart"
tabindex="0"
type="button"
>
<span
class="MuiIconButton-label"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"
/>
</svg>
</span>
<span
class="MuiTouchRipple-root"
/>
</button>
<div> <div>
<h6 <h6
class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap" class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap"
@@ -7057,6 +7273,30 @@ exports[`App Route /tools/security-dll authenticated 1`] = `
<div <div
class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters" class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters"
> >
<button
aria-label="toggle drawer"
class="MuiButtonBase-root MuiIconButton-root makeStyles-menuButton-0 MuiIconButton-colorInherit MuiIconButton-edgeStart"
tabindex="0"
type="button"
>
<span
class="MuiIconButton-label"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"
/>
</svg>
</span>
<span
class="MuiTouchRipple-root"
/>
</button>
<div> <div>
<h6 <h6
class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap" class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap"
@@ -7451,6 +7691,30 @@ exports[`App Route /tools/sms/send authenticated 1`] = `
<div <div
class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters" class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters"
> >
<button
aria-label="toggle drawer"
class="MuiButtonBase-root MuiIconButton-root makeStyles-menuButton-0 MuiIconButton-colorInherit MuiIconButton-edgeStart"
tabindex="0"
type="button"
>
<span
class="MuiIconButton-label"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"
/>
</svg>
</span>
<span
class="MuiTouchRipple-root"
/>
</button>
<div> <div>
<h6 <h6
class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap" class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap"
@@ -8149,6 +8413,30 @@ exports[`App Route /vehicle-add authenticated 1`] = `
<div <div
class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters" class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters"
> >
<button
aria-label="toggle drawer"
class="MuiButtonBase-root MuiIconButton-root makeStyles-menuButton-0 MuiIconButton-colorInherit MuiIconButton-edgeStart"
tabindex="0"
type="button"
>
<span
class="MuiIconButton-label"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"
/>
</svg>
</span>
<span
class="MuiTouchRipple-root"
/>
</button>
<div> <div>
<h6 <h6
class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap" class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap"
@@ -9265,6 +9553,30 @@ exports[`App Route /vehicle-status authenticated 1`] = `
<div <div
class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters" class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters"
> >
<button
aria-label="toggle drawer"
class="MuiButtonBase-root MuiIconButton-root makeStyles-menuButton-0 MuiIconButton-colorInherit MuiIconButton-edgeStart"
tabindex="0"
type="button"
>
<span
class="MuiIconButton-label"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"
/>
</svg>
</span>
<span
class="MuiTouchRipple-root"
/>
</button>
<div> <div>
<h6 <h6
class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap" class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap"
@@ -10316,6 +10628,30 @@ exports[`App Route /vehicles authenticated 1`] = `
<div <div
class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters" class="MuiToolbar-root MuiToolbar-regular MuiToolbar-gutters"
> >
<button
aria-label="toggle drawer"
class="MuiButtonBase-root MuiIconButton-root makeStyles-menuButton-0 MuiIconButton-colorInherit MuiIconButton-edgeStart"
tabindex="0"
type="button"
>
<span
class="MuiIconButton-label"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"
/>
</svg>
</span>
<span
class="MuiTouchRipple-root"
/>
</button>
<div> <div>
<h6 <h6
class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap" class="MuiTypography-root MuiTypography-h6 MuiTypography-noWrap"

View File

@@ -72,9 +72,19 @@ const MainForm = ({ id }) => {
}; };
const handleSelectedItemsChange = (event) => { const handleSelectedItemsChange = (event) => {
setSelectedCanSignals(event.target.value); const { value } = event.target;
if (value.some(item => item === "Select All")) {
if (selectedCanSignals.length === canSignals.length) {
setSelectedCanSignals([]);
} else {
setSelectedCanSignals(canSignals.map(signal => signal.signal_name));
}
} else {
setSelectedCanSignals(value);
}
}; };
return ( return (
<div className={classes.paper}> <div className={classes.paper}>
<Grid container spacing={3} justifyContent="center"> <Grid container spacing={3} justifyContent="center">
@@ -163,6 +173,10 @@ const MainForm = ({ id }) => {
</div> </div>
)} )}
> >
<MenuItem value="Select All">
<Checkbox checked={selectedCanSignals.length === canSignals.length} />
<ListItemText primary="Select All" />
</MenuItem>
{canSignals.map((signal) => ( {canSignals.map((signal) => (
<MenuItem key={signal.signal_name} value={signal.signal_name}> <MenuItem key={signal.signal_name} value={signal.signal_name}>
<Checkbox checked={selectedCanSignals.indexOf(signal.signal_name) > -1} /> <Checkbox checked={selectedCanSignals.indexOf(signal.signal_name) > -1} />

View File

@@ -1,13 +1,11 @@
import React from "react";
import { useParams } from "react-router";
import clsx from "clsx";
import { Typography } from "@material-ui/core"; import { Typography } from "@material-ui/core";
import clsx from "clsx";
import React from "react";
import CANFiltersTable from "../../CANFilter/Table"; import CANFiltersTable from "../../CANFilter/Table";
import useStyles from "../../useStyles"; import useStyles from "../../useStyles";
const CANFiltersTab = () => { const CANFiltersTab = ({vin}) => {
const { vin } = useParams();
const classes = useStyles(); const classes = useStyles();
return ( return (

View File

@@ -8,10 +8,10 @@ jest.mock("@material-ui/core/utils/unstable_useId", () =>
import { render, waitFor } from "@testing-library/react"; import { render, waitFor } from "@testing-library/react";
import { BrowserRouter } from "react-router-dom"; import { BrowserRouter } from "react-router-dom";
import { setToken } from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import CANFiltersTab from "./CANFiltersTab";
import addSnapshotSerializer from "../../../utils/snapshot"; import addSnapshotSerializer from "../../../utils/snapshot";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { setToken } from "../../Contexts/UserContext";
import CANFiltersTab from "./CANFiltersTab";
const renderCANFiltersTab = async () => { const renderCANFiltersTab = async () => {
const { container } = render( const { container } = render(

View File

@@ -1,11 +1,11 @@
import React from "react";
import clsx from "clsx";
import { Typography } from "@material-ui/core"; import { Typography } from "@material-ui/core";
import clsx from "clsx";
import React from "react";
import useStyles from "../../useStyles";
import { useUserContext } from "../../Contexts/UserContext"; import { useUserContext } from "../../Contexts/UserContext";
import CANSignals from "../CANSignals";
import { VehicleProvider } from "../../Contexts/VehicleContext"; import { VehicleProvider } from "../../Contexts/VehicleContext";
import useStyles from "../../useStyles";
import CANSignals from "../CANSignals";
const Main = (props) => { const Main = (props) => {
const { const {

View File

@@ -9,14 +9,14 @@ jest.mock("@material-ui/core/utils/unstable_useId", () =>
import { render, waitFor } from "@testing-library/react"; import { render, waitFor } from "@testing-library/react";
import { BrowserRouter } from "react-router-dom"; import { BrowserRouter } from "react-router-dom";
import CANSignalsTab from "./CANSignalsTab";
import {setToken} from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing"; import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { setToken } from "../../Contexts/UserContext";
import CANSignalsTab from "./CANSignalsTab";
const renderCANSignalsTab = async () => { const renderCANSignalsTab = async () => {
const { container } = render( const { container } = render(
<BrowserRouter> <BrowserRouter>
<CANSignalsTab vin="TESTVIN1234567890" token="token"/> <CANSignalsTab vin="TESTVIN1234567890" />
</BrowserRouter> </BrowserRouter>
); );
await waitFor(() => { await waitFor(() => {

View File

@@ -1,7 +1,6 @@
import { Typography } from "@material-ui/core"; import { Typography } from "@material-ui/core";
import clsx from "clsx"; import clsx from "clsx";
import React from "react"; import React from "react";
import { useParams } from "react-router";
import { useUserContext } from "../../Contexts/UserContext"; import { useUserContext } from "../../Contexts/UserContext";
import { VehicleProvider } from "../../Contexts/VehicleContext"; import { VehicleProvider } from "../../Contexts/VehicleContext";
@@ -9,8 +8,7 @@ import CarUpdatesTable from "../../Controls/CarUpdatesTable";
import CarVersionLogTable from "../../Controls/CarVersionLogTable"; import CarVersionLogTable from "../../Controls/CarVersionLogTable";
import useStyles from "../../useStyles"; import useStyles from "../../useStyles";
const MainForm = () => { const MainForm = ({vin}) => {
const { vin } = useParams();
const classes = useStyles(); const classes = useStyles();
const { const {
token: { token: {
@@ -28,9 +26,9 @@ const MainForm = () => {
); );
}; };
const CarUpdatesTab = () => ( const CarUpdatesTab = ({vin}) => (
<VehicleProvider> <VehicleProvider>
<MainForm /> <MainForm vin={vin} />
</VehicleProvider> </VehicleProvider>
); );

View File

@@ -1,13 +1,11 @@
import React from "react";
import { useParams } from "react-router";
import clsx from "clsx";
import { Typography } from "@material-ui/core"; import { Typography } from "@material-ui/core";
import clsx from "clsx";
import React from "react";
import CarDetails from "./Details";
import useStyles from "../../useStyles"; import useStyles from "../../useStyles";
import CarDetails from "./Details";
const CarDetailsTab = () => { const CarDetailsTab = ({vin}) => {
const { vin } = useParams();
const classes = useStyles(); const classes = useStyles();
return ( return (

View File

@@ -1,16 +1,18 @@
import React, { useEffect, useState } from "react";
import clsx from "clsx";
import { Typography } from "@material-ui/core"; import { Typography } from "@material-ui/core";
import clsx from "clsx";
import React, { useEffect, useState } from "react";
import useStyles from "../../useStyles"; import { logger } from "../../../services/monitoring";
import DigitalTwin from "../../DigitalTwin";
import {
useVehicleContext,
VehicleProvider,
} from "../../Contexts/VehicleContext";
import { useStatusContext } from "../../Contexts/StatusContext"; import { useStatusContext } from "../../Contexts/StatusContext";
import { useUserContext } from "../../Contexts/UserContext"; import { useUserContext } from "../../Contexts/UserContext";
import { logger } from "../../../services/monitoring"; import {
useVehicleContext,
VehicleProvider
} from "../../Contexts/VehicleContext";
import DigitalTwin from "../../DigitalTwin";
import useStyles from "../../useStyles";
const REQUEST_INTERVAL = 10000;
const Main = (props) => { const Main = (props) => {
const { getState } = useVehicleContext(); const { getState } = useVehicleContext();
@@ -26,7 +28,13 @@ const Main = (props) => {
useEffect(() => { useEffect(() => {
if (!vin) return; if (!vin) return;
(async () => { getCarState();
const interval = setInterval(getCarState, REQUEST_INTERVAL);
return () => { clearInterval(interval); }
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [vin]);
const getCarState = async () => {
try { try {
const result = await getState(token, vin); const result = await getState(token, vin);
setCarState(result.data); setCarState(result.data);
@@ -34,9 +42,7 @@ const Main = (props) => {
setMessage(e.message); setMessage(e.message);
logger.warn(e.stack); logger.warn(e.stack);
} }
})(); };
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [vin]);
return ( return (
<div className={clsx(classes.paper, classes.tableSize)}> <div className={clsx(classes.paper, classes.tableSize)}>

View File

@@ -1,15 +1,13 @@
import { Typography } from "@material-ui/core"; import { Typography } from "@material-ui/core";
import clsx from "clsx"; import clsx from "clsx";
import React from "react"; import React from "react";
import { useParams } from "react-router";
import { useUserContext } from "../../Contexts/UserContext"; import { useUserContext } from "../../Contexts/UserContext";
import { VehicleProvider } from "../../Contexts/VehicleContext"; import { VehicleProvider } from "../../Contexts/VehicleContext";
import CarECUsTable from "../../Controls/CarECUsTable"; import CarECUsTable from "../../Controls/CarECUsTable";
import useStyles from "../../useStyles"; import useStyles from "../../useStyles";
const MainForm = () => { const MainForm = ({ vin }) => {
const { vin } = useParams();
const classes = useStyles(); const classes = useStyles();
const { const {
token: { token: {
@@ -27,9 +25,9 @@ const MainForm = () => {
); );
}; };
const CarUpdatesTab = () => ( const CarUpdatesTab = ({vin}) => (
<VehicleProvider> <VehicleProvider>
<MainForm /> <MainForm vin={vin}/>
</VehicleProvider> </VehicleProvider>
); );

View File

@@ -24,7 +24,7 @@ exports[`CANFiltersTab Render 1`] = `
> >
<a <a
class="makeStyles-labelInline-0" class="makeStyles-labelInline-0"
href="/filter-add?vin=undefined" href="/filter-add?vin=TESTVIN1234567890"
> >
<svg <svg
aria-hidden="true" aria-hidden="true"
@@ -233,7 +233,7 @@ exports[`CANFiltersTab Render 1`] = `
> >
<a <a
class="" class=""
href="/filter-update?vin=undefined&can_id=123&interval=1000" href="/filter-update?vin=TESTVIN1234567890&can_id=123&interval=1000"
style="margin: 5px;" style="margin: 5px;"
title="Update \\"123\\"" title="Update \\"123\\""
> >
@@ -279,7 +279,7 @@ exports[`CANFiltersTab Render 1`] = `
> >
<a <a
class="" class=""
href="/filter-update?vin=undefined&can_id=456-789&interval=2000" href="/filter-update?vin=TESTVIN1234567890&can_id=456-789&interval=2000"
style="margin: 5px;" style="margin: 5px;"
title="Update \\"456-789\\"" title="Update \\"456-789\\""
> >
@@ -325,7 +325,7 @@ exports[`CANFiltersTab Render 1`] = `
> >
<a <a
class="" class=""
href="/filter-update?vin=undefined&can_id=1&interval=0" href="/filter-update?vin=TESTVIN1234567890&can_id=1&interval=0"
style="margin: 5px;" style="margin: 5px;"
title="Update \\"1\\"" title="Update \\"1\\""
> >

View File

@@ -298,7 +298,46 @@ exports[`CarUpdatesTab Render 1`] = `
</thead> </thead>
<tbody <tbody
class="MuiTableBody-root" class="MuiTableBody-root"
/> >
<tr
class="MuiTableRow-root"
>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
TREX
</td>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
0.9.56
</td>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
1/13/2023 2:11:33 AM
</td>
</tr>
<tr
class="MuiTableRow-root"
>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
DBC
</td>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
386c18977a1be3cda60c953e5902c680dbe82b89523f2527e80cd9db863db991
</td>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
1/13/2023 2:11:33 AM
</td>
</tr>
</tbody>
<tfoot <tfoot
class="MuiTableFooter-root" class="MuiTableFooter-root"
> >
@@ -366,7 +405,7 @@ exports[`CarUpdatesTab Render 1`] = `
<p <p
class="MuiTypography-root MuiTablePagination-caption MuiTypography-body2 MuiTypography-colorInherit" class="MuiTypography-root MuiTablePagination-caption MuiTypography-body2 MuiTypography-colorInherit"
> >
0-0 of 0 1-2 of 2
</p> </p>
<div <div
class="MuiTablePagination-actions" class="MuiTablePagination-actions"

View File

@@ -35,13 +35,34 @@ exports[`DigitalTwinTab Render 1`] = `
true true
</div> </div>
<div> <div>
<div
class="makeStyles-popupSection-0"
>
<h3>
Battery
</h3>
<p> <p>
<b> <b>
Battery Percentage
</b> </b>
: :
95% 95%
</p> </p>
<p>
<b>
Total Mileage
</b>
:
unknown
</p>
<p>
<b>
Max Range
</b>
:
577
</p>
</div>
<div <div
class="makeStyles-popupSection-0" class="makeStyles-popupSection-0"
> >
@@ -102,14 +123,14 @@ exports[`DigitalTwinTab Render 1`] = `
driver driver
</b> </b>
: :
Closed Unlocked
</p> </p>
<p> <p>
<b> <b>
all all
</b> </b>
: :
Locked Unlocked
</p> </p>
</div> </div>
<div <div
@@ -181,7 +202,7 @@ exports[`DigitalTwinTab Render 1`] = `
> >
<p> <p>
<b> <b>
Updated at Updated At
</b> </b>
: :
7/26/2022 12:26:38 AM 7/26/2022 12:26:38 AM
@@ -192,7 +213,7 @@ exports[`DigitalTwinTab Render 1`] = `
> >
<p> <p>
<b> <b>
DBC version DBC Version
</b> </b>
: :
d439abd3662dd20099f49dd8f43f7b145202e961caa2b5aba2c6154c8096348b d439abd3662dd20099f49dd8f43f7b145202e961caa2b5aba2c6154c8096348b

View File

@@ -103,6 +103,98 @@ exports[`ECUsTab Render 1`] = `
</svg> </svg>
</span> </span>
</th> </th>
<th
class="MuiTableCell-root MuiTableCell-head MuiTableCell-alignCenter"
scope="col"
>
<span
aria-disabled="false"
class="MuiButtonBase-root MuiTableSortLabel-root"
role="button"
tabindex="0"
>
Vendor
<svg
aria-hidden="true"
class="MuiSvgIcon-root MuiTableSortLabel-icon MuiTableSortLabel-iconDirectionAsc"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z"
/>
</svg>
</span>
</th>
<th
class="MuiTableCell-root MuiTableCell-head MuiTableCell-alignCenter"
scope="col"
>
<span
aria-disabled="false"
class="MuiButtonBase-root MuiTableSortLabel-root"
role="button"
tabindex="0"
>
Supplier Version
<svg
aria-hidden="true"
class="MuiSvgIcon-root MuiTableSortLabel-icon MuiTableSortLabel-iconDirectionAsc"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z"
/>
</svg>
</span>
</th>
<th
class="MuiTableCell-root MuiTableCell-head MuiTableCell-alignCenter"
scope="col"
>
<span
aria-disabled="false"
class="MuiButtonBase-root MuiTableSortLabel-root"
role="button"
tabindex="0"
>
Serial
<svg
aria-hidden="true"
class="MuiSvgIcon-root MuiTableSortLabel-icon MuiTableSortLabel-iconDirectionAsc"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z"
/>
</svg>
</span>
</th>
<th
class="MuiTableCell-root MuiTableCell-head MuiTableCell-alignCenter"
scope="col"
>
<span
aria-disabled="false"
class="MuiButtonBase-root MuiTableSortLabel-root"
role="button"
tabindex="0"
>
Boot Loader
<svg
aria-hidden="true"
class="MuiSvgIcon-root MuiTableSortLabel-icon MuiTableSortLabel-iconDirectionAsc"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z"
/>
</svg>
</span>
</th>
<th <th
class="MuiTableCell-root MuiTableCell-head MuiTableCell-alignCenter" class="MuiTableCell-root MuiTableCell-head MuiTableCell-alignCenter"
scope="col" scope="col"
@@ -136,7 +228,7 @@ exports[`ECUsTab Render 1`] = `
role="button" role="button"
tabindex="0" tabindex="0"
> >
Created Fingerprint
<svg <svg
aria-hidden="true" aria-hidden="true"
class="MuiSvgIcon-root MuiTableSortLabel-icon MuiTableSortLabel-iconDirectionAsc" class="MuiSvgIcon-root MuiTableSortLabel-icon MuiTableSortLabel-iconDirectionAsc"
@@ -176,7 +268,106 @@ exports[`ECUsTab Render 1`] = `
</thead> </thead>
<tbody <tbody
class="MuiTableBody-root" class="MuiTableBody-root"
>
<tr
class="MuiTableRow-root"
>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
ECUA
</td>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
SWVERSION
</td>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
HWVERSION
</td>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
VENDOR
</td>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
SUPPLIER_SW_VERSION
</td>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
SERIAL_NUMBER
</td>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
BOOT_LOADER
</td>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
CONFIG
</td>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
FINGERPRINT
</td>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
7/14/2021 8:09:40 PM
</td>
</tr>
<tr
class="MuiTableRow-root"
>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
ECUB
</td>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
SWVERSION
</td>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
HWVERSION
</td>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
/> />
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
/>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
/>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
/>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
CONFIG
</td>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
/>
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
7/14/2021 8:09:40 PM
</td>
</tr>
</tbody>
<tfoot <tfoot
class="MuiTableFooter-root" class="MuiTableFooter-root"
> >
@@ -244,7 +435,7 @@ exports[`ECUsTab Render 1`] = `
<p <p
class="MuiTypography-root MuiTablePagination-caption MuiTypography-body2 MuiTypography-colorInherit" class="MuiTypography-root MuiTablePagination-caption MuiTypography-body2 MuiTypography-colorInherit"
> >
0-0 of 0 1-2 of 2
</p> </p>
<div <div
class="MuiTablePagination-actions" class="MuiTablePagination-actions"

View File

@@ -26,10 +26,12 @@ const TabViews = [
{ {
label: "Details", label: "Details",
component: CarDetailsTab, component: CarDetailsTab,
rolesPerProvider: Permissions.FiskerMagnaRead,
}, },
{ {
label: "Car Updates", label: "Car Updates",
component: CarUpdatesTab, component: CarUpdatesTab,
rolesPerProvider: Permissions.FiskerMagnaRead,
}, },
{ {
label: "CAN Filters", label: "CAN Filters",
@@ -39,22 +41,27 @@ const TabViews = [
{ {
label: "Digital Twin", label: "Digital Twin",
component: DigitalTwinTab, component: DigitalTwinTab,
rolesPerProvider: Permissions.FiskerMagnaRead,
}, },
{ {
label: "CAN Signals", label: "CAN Signals",
component: CANSignalsTab, component: CANSignalsTab,
rolesPerProvider: Permissions.FiskerMagnaRead,
}, },
{ {
label: "T.Rex logs", label: "T.Rex logs",
component: TRexLogsTab, component: TRexLogsTab,
rolesPerProvider: Permissions.FiskerMagnaRead,
}, },
{ {
label: "ECUs", label: "ECUs",
component: ECUsTab, component: ECUsTab,
rolesPerProvider: Permissions.FiskerMagnaRead,
}, },
{ {
label: "Remote Commands", label: "Remote Commands",
component: RemoteCommandsTab, component: RemoteCommandsTab,
rolesPerProvider: Permissions.FiskerMagnaCreate,
}, },
{ {
label: "Fleets", label: "Fleets",
@@ -63,7 +70,8 @@ const TabViews = [
}, },
{ {
label: "CAN Signal Export", label: "CAN Signal Export",
component: SelfServeTab component: SelfServeTab,
rolesPerProvider: Permissions.FiskerRead,
} }
]; ];

View File

@@ -1,20 +1,20 @@
import React, { useEffect, useState } from "react";
import { import {
Table, Table,
TableBody, TableBody,
TableCell, TableCell,
TableFooter, TableFooter,
TablePagination, TablePagination,
TableRow, TableRow
} from "@material-ui/core"; } from "@material-ui/core";
import clsx from "clsx"; import clsx from "clsx";
import React, { useEffect, useState } from "react";
import { LocalDateTimeString } from "../../../utils/dates";
import TableHeaderSortable from "../../Table/HeaderSortable";
import { useVehicleContext } from "../../Contexts/VehicleContext";
import { useStatusContext } from "../../Contexts/StatusContext";
import { logger } from "../../../services/monitoring"; import { logger } from "../../../services/monitoring";
import {useLocalStorage} from "../../useLocalStorage"; import { LocalDateTimeString } from "../../../utils/dates";
import { useStatusContext } from "../../Contexts/StatusContext";
import { useVehicleContext } from "../../Contexts/VehicleContext";
import TableHeaderSortable from "../../Table/HeaderSortable";
import { useLocalStorage } from "../../useLocalStorage";
const tableColumns = [ const tableColumns = [
{ {
@@ -29,13 +29,29 @@ const tableColumns = [
id: "hw_version", id: "hw_version",
label: "HW Version", label: "HW Version",
}, },
{
id: "vendor",
label: "Vendor",
},
{
id: "supplier_sw_version",
label: "Supplier Version",
},
{
id: "serial_number",
label: "Serial",
},
{
id: "boot_loader_version",
label: "Boot Loader",
},
{ {
id: "config", id: "config",
label: "Config", label: "Config",
}, },
{ {
id: "created_at", id: "fingerprint",
label: "Created", label: "Fingerprint",
}, },
{ {
id: "updated_at", id: "updated_at",
@@ -117,16 +133,11 @@ const CarECUsTable = ({ vin, token, classes }) => {
<TableBody> <TableBody>
{ecus.map((row, i) => ( {ecus.map((row, i) => (
<TableRow key={row.ecu + i}> <TableRow key={row.ecu + i}>
<TableCell align="center">{row.ecu}</TableCell> {tableColumns.map((column, j) => {
<TableCell align="center">{row.sw_version}</TableCell> const key = `${row.ecu + i}${column.id}`
<TableCell align="center">{row.hw_version}</TableCell> if (column.id === "updated_at") return (<TableCell key={key} align="center">{LocalDateTimeString(row.updated)}</TableCell>);
<TableCell align="center">{row.config}</TableCell> return (<TableCell key={key} align="center">{row[column.id]}</TableCell>);
<TableCell align="center"> })}
{LocalDateTimeString(row.created)}
</TableCell>
<TableCell align="center">
{LocalDateTimeString(row.updated)}
</TableCell>
</TableRow> </TableRow>
))} ))}
</TableBody> </TableBody>

View File

@@ -4,6 +4,10 @@ import { LocalDateTimeString } from "../../utils/dates";
import { ValidateLocationByParam } from "../../utils/locations"; import { ValidateLocationByParam } from "../../utils/locations";
import useStyles from "../useStyles"; import useStyles from "../useStyles";
const UNKNOWN = "unknown";
const LOCKED = "Locked";
const UNLOCKED = "Unlocked";
const keyValueTemplate = (key, value) => ( const keyValueTemplate = (key, value) => (
<p key={key}> <p key={key}>
<b>{key}</b>: {value} <b>{key}</b>: {value}
@@ -23,33 +27,43 @@ const windowState = (value) => {
const DigitalTwin = (props) => { const DigitalTwin = (props) => {
const classes = useStyles(); const classes = useStyles();
const { battery, doors, location, trex_version, ip, updated, windows, misc_windows, sunroof, dbc_version, door_locks } = props; const { battery, doors, location, trex_version, ip, updated, windows, misc_windows, sunroof, dbc_version, door_locks, vcu0x260, charging_metrics, max_range } = props;
return ( return (
<div> <div>
{!battery && !doors && !location && !windows && ( {!battery && !doors && !location && !windows && !vcu0x260 && !charging_metrics && (
<p>No vehicle data to display.</p> <p>No vehicle data to display.</p>
)} )}
{battery != null && keyValueTemplate("Battery", `${battery.percent}%`)} {(battery || max_range) && (
{doors != null && ( <div className={classes.popupSection}>
<h3>Battery</h3>
{keyValueTemplate("Percentage", `${battery?.percent || 0}%`)}
{keyValueTemplate("Total Mileage", battery?.total_mileage_odometer || UNKNOWN)}
{keyValueTemplate("Max Range", max_range?.max_miles || UNKNOWN)}
</div>
)}
{(vcu0x260 || charging_metrics) && (
<div className={classes.popupSection}>
<h3>Charging</h3>
{keyValueTemplate("Charge Type", vcu0x260?.charge_type || UNKNOWN)}
{keyValueTemplate("Remaining Time", charging_metrics?.remaining_charging_time || UNKNOWN)}
</div>
)}
{doors && (
<div className={classes.popupSection}> <div className={classes.popupSection}>
<h3>Doors</h3> <h3>Doors</h3>
{Object.entries(doors).map(mapOpenCloseState)} {Object.entries(doors).map(mapOpenCloseState)}
</div> </div>
)} )}
{door_locks != null && ( {door_locks && (
<div className={classes.popupSection}> <div className={classes.popupSection}>
<h3>Door Locks</h3> <h3>Door Locks</h3>
{Object.entries(door_locks).map((value) => { {Object.entries(door_locks).map((value) => {
if (value[0] === "driver") { return keyValueTemplate(value[0], value[1] ? LOCKED : UNLOCKED);
return keyValueTemplate(value[0], value[1] ? "Open" : "Closed");
} else {
return keyValueTemplate(value[0], value[1] ? "Unlocked" : "Locked");
}
})} })}
</div> </div>
)} )}
{windows != null && ( {windows && (
<div className={classes.popupSection}> <div className={classes.popupSection}>
<h3>Windows</h3> <h3>Windows</h3>
{Object.entries(windows).map((value) => { {Object.entries(windows).map((value) => {
@@ -57,7 +71,7 @@ const DigitalTwin = (props) => {
})} })}
</div> </div>
)} )}
{misc_windows != null && ( {misc_windows && (
<div className={classes.popupSection}> <div className={classes.popupSection}>
<h3>Misc Windows</h3> <h3>Misc Windows</h3>
{Object.entries(misc_windows).map((value) => { {Object.entries(misc_windows).map((value) => {
@@ -65,7 +79,7 @@ const DigitalTwin = (props) => {
})} })}
</div> </div>
)} )}
{sunroof != null && ( {sunroof && (
<div className={classes.popupSection}> <div className={classes.popupSection}>
<h3>Sunroof</h3> <h3>Sunroof</h3>
{Object.entries(sunroof).map((value) => { {Object.entries(sunroof).map((value) => {
@@ -73,7 +87,7 @@ const DigitalTwin = (props) => {
})} })}
</div> </div>
)} )}
{location != null && ( {location && (
<div className={classes.popupSection}> <div className={classes.popupSection}>
<h3>Location</h3> <h3>Location</h3>
{Object.entries(location).map((value) => { {Object.entries(location).map((value) => {
@@ -100,12 +114,12 @@ const DigitalTwin = (props) => {
)} )}
{updated != null && ( {updated != null && (
<div className={classes.popupSection}> <div className={classes.popupSection}>
{keyValueTemplate("Updated at", LocalDateTimeString(updated))} {keyValueTemplate("Updated At", LocalDateTimeString(updated))}
</div> </div>
)} )}
{dbc_version != null && ( {dbc_version != null && (
<div className={classes.popupSection}> <div className={classes.popupSection}>
{keyValueTemplate("DBC version", dbc_version)} {keyValueTemplate("DBC Version", dbc_version)}
</div> </div>
)} )}
</div> </div>

View File

@@ -1,4 +1,4 @@
import React from "react"; import React, { useState } from "react";
import clsx from "clsx"; import clsx from "clsx";
import { import {
Container, Container,
@@ -7,8 +7,10 @@ import {
Toolbar, Toolbar,
Typography, Typography,
Divider, Divider,
IconButton,
} from "@material-ui/core"; } from "@material-ui/core";
import MenuIcon from "@material-ui/icons/Menu";
import SideMenu from "./SideMenu"; import SideMenu from "./SideMenu";
import useStyles from "../useStyles"; import useStyles from "../useStyles";
import { useUserContext } from "../Contexts/UserContext"; import { useUserContext } from "../Contexts/UserContext";
@@ -22,20 +24,40 @@ export default function MenuDrawer({ children }) {
const { title, sitePath } = useStatusContext(); const { title, sitePath } = useStatusContext();
const { token } = useUserContext(); const { token } = useUserContext();
const [drawerOpen, setDrawerOpen] = useState(true);
const toggleDrawer = () => {
setDrawerOpen(!drawerOpen);
};
return ( return (
<div className={classes.root}> <div className={classes.root}>
<AppBar <AppBar
position="fixed" position="fixed"
className={clsx(classes.appBar, { className={clsx(classes.appBar, {
[classes.appBarShift]: token !== null, [classes.appBarShift]: token !== null && drawerOpen,
})} })}
> >
<Toolbar> <Toolbar>
{token !== null && (
<IconButton
edge="start"
color="inherit"
aria-label="toggle drawer"
onClick={toggleDrawer}
className={classes.menuButton}
>
<MenuIcon />
</IconButton>
)}
<div> <div>
<Typography variant="h6" noWrap> <Typography variant="h6" noWrap>
{title} {title}
</Typography> </Typography>
<SiteBreadcrumbs path={sitePath} className={classes.breadcrumbs} /> <SiteBreadcrumbs
path={sitePath}
className={classes.breadcrumbs}
/>
</div> </div>
{token !== null && ( {token !== null && (
<UserMenu color="inherit" className={classes.rightToolbar} /> <UserMenu color="inherit" className={classes.rightToolbar} />
@@ -47,7 +69,7 @@ export default function MenuDrawer({ children }) {
className={classes.drawer} className={classes.drawer}
variant="persistent" variant="persistent"
anchor="left" anchor="left"
open={true} open={drawerOpen}
classes={{ classes={{
paper: classes.drawerPaper, paper: classes.drawerPaper,
}} }}
@@ -65,7 +87,7 @@ export default function MenuDrawer({ children }) {
)} )}
<main <main
className={clsx(classes.content, { className={clsx(classes.content, {
[classes.contentShift]: token !== null, [classes.contentShift]: token !== null && drawerOpen,
})} })}
> >
<div className={classes.drawerHeader} /> <div className={classes.drawerHeader} />

View File

@@ -1,16 +1,16 @@
import React, { useEffect, useState } from "react";
import useStyles from "../useStyles";
import L from "leaflet";
import { MapContainer, TileLayer, Marker, Popup, useMap } from "react-leaflet";
import { Button } from "@material-ui/core"; import { Button } from "@material-ui/core";
import L from "leaflet";
import React, { useEffect, useState } from "react";
import { MapContainer, Marker, Popup, TileLayer, useMap } from "react-leaflet";
import useStyles from "../useStyles";
import GrayMarkerIcon from "../../assets/gray-marker.png";
import GreenMarkerIcon from "../../assets/green-marker.png";
import { logger } from "../../services/monitoring";
import { ValidateLocationData } from "../../utils/locations";
import { useUserContext } from "../Contexts/UserContext"; import { useUserContext } from "../Contexts/UserContext";
import { useVehicleContext, VehicleProvider } from "../Contexts/VehicleContext"; import { useVehicleContext, VehicleProvider } from "../Contexts/VehicleContext";
import { VehiclePopUp } from "./popup"; import { VehiclePopUp } from "./popup";
import { ValidateLocationData } from "../../utils/locations"
import GreenMarkerIcon from "../../assets/green-marker.png";
import GrayMarkerIcon from "../../assets/gray-marker.png";
import { logger } from "../../services/monitoring";
const Component = () => { const Component = () => {
const classes = useStyles(); const classes = useStyles();
@@ -39,7 +39,7 @@ const Component = () => {
return () => { return () => {
clearInterval(id); clearInterval(id);
}; };
// eslint-disable-next-line // eslint-disable-next-line react-hooks/exhaustive-deps
}, [token]); }, [token]);
const retrieveAndStoreLocations = (accessToken) => { const retrieveAndStoreLocations = (accessToken) => {

View File

@@ -33,11 +33,16 @@ const data = [
const ecusData = [ const ecusData = [
{ {
config: "CONFIG",
created: "2021-07-14T20:09:40.98187Z", created: "2021-07-14T20:09:40.98187Z",
ecu: "ECUA", ecu: "ECUA",
hw_version: "HWVERSION", hw_version: "HWVERSION",
sw_version: "SWVERSION", sw_version: "SWVERSION",
vendor: "VENDOR",
supplier_sw_version: "SUPPLIER_SW_VERSION",
serial_number: "SERIAL_NUMBER",
boot_loader_version: "BOOT_LOADER",
config: "CONFIG",
fingerprint: "FINGERPRINT",
updated: "2021-07-14T20:09:40.98187Z", updated: "2021-07-14T20:09:40.98187Z",
}, },
{ {