Reduced unused imports, cleaned up warnings

main
AdamSBlack 2022-01-06 00:53:07 +00:00
parent 4597a904f5
commit bc026e55f3
15 changed files with 270 additions and 761 deletions

View File

@ -1,27 +1,14 @@
import logo from './logo.svg';
import React, { useEffect, useState, useContext } from 'react';
import Login from "./components/views/login"
import Home from "./components/views/home"
import UserAdmin from "./components/views/useradmin"
import Tabs from '@mui/material/Tabs';
import Tab from '@mui/material/Tab';
import Typography from '@mui/material/Typography';
import Box from '@mui/material/Box';
import {
BrowserRouter as Router,
Switch,
Route,
Link
} from "react-router-dom";
import { UserProvider, UserContext } from "./context/users"
import DeviceStore from "./context/devices"
import ToastStore from "./context/toast"
import GlobalSnack from './components/widgets/globalSnack'
import useMediaQuery from '@mui/material/useMediaQuery';
import { createTheme, ThemeProvider } from '@mui/material/styles';
import CssBaseline from '@mui/material/CssBaseline';
import { createTheme, ThemeProvider } from '@mui/material/styles';
import React, { useState } from 'react';
import Login from "./components/views/login";
import UserAdmin from "./components/views/useradmin";
import GlobalSnack from './components/widgets/globalSnack';
import DeviceStore from "./context/devices";
import ToastStore from "./context/toast";
import { UserProvider } from "./context/users";
import * as authenticationController from "./controllers/authentication";
// Connection opened
@ -32,6 +19,15 @@ import CssBaseline from '@mui/material/CssBaseline';
function App() {
const [session, setSession] = useState(false)
authenticationController.getSession().then((res) => {
setSession(res.data.authenticated)
})
const theme = React.useMemo(
@ -56,7 +52,7 @@ function App() {
<GlobalSnack />
<UserAdmin />
{session ? <UserAdmin/> : <Login />}
</ToastStore>
</DeviceStore>

View File

@ -1,93 +1,15 @@
import React, { useEffect, useState, useContext } from 'react';
import Avatar from '@mui/material/Avatar';
import LoadingButton from '@mui/lab/LoadingButton';
import CssBaseline from '@mui/material/CssBaseline';
import TextField from '@mui/material/TextField';
import FormControlLabel from '@mui/material/FormControlLabel';
import Checkbox from '@mui/material/Checkbox';
import Grid from '@mui/material/Grid';
import Paper from '@mui/material/Paper';
import Box from '@mui/material/Box';
import CircularProgress from '@mui/material/CircularProgress';
import LockOutlinedIcon from '@mui/icons-material/LockOutlined';
import Typography from '@mui/material/Typography';
import Container from '@mui/material/Container';
import { createTheme, ThemeProvider } from '@mui/material/styles';
import {context as DeviceContext} from "./../../context/devices"
import { Link } from "react-router-dom";
import PropTypes from 'prop-types';
import Tabs from '@mui/material/Tabs';
import Tab from '@mui/material/Tab';
import Chip from '@mui/material/Chip';
import OutlinedInput from '@mui/material/OutlinedInput';
import IconButton from '@mui/material/IconButton';
import InputAdornment from '@mui/material/InputAdornment';
import Done from '@mui/icons-material/Done';
import GoogleMapReact from 'google-map-react';
import React from 'react';
import { Scrollbars } from 'react-custom-scrollbars';
import DrivesTable from './tabPane';
import { Scrollbars } from 'react-custom-scrollbars';
import { makeStyles } from '@mui/styles';
import GoogleMapReact from 'google-map-react';
import axios from "axios"
import {context as SnackbarContext} from "./../../context/toast"
const useStyles = makeStyles({
controlsButton: {
margin: "0 3px"
}
});
function DeviceControls() {
const classes = useStyles();
const [ state, dispatch ] = useContext(DeviceContext);
const [ notifState, notifdispatch ] = useContext(SnackbarContext)
async function refreshDongleStatus() {
}
async function athenaReboot() {
}
return (
<div style={{ padding: '10px' }}>
<Typography className={classes.controlsButton} style={{display: 'inline'}} variant="h6">c8321a</Typography>
<LoadingButton className={classes.controlsButton} size="small" loadingIndicator="Loading..." variant="contained">
Unpair
</LoadingButton>
<LoadingButton className={classes.controlsButton} size="small" loadingIndicator="Loading..." variant="contained">
Ping
</LoadingButton>
<LoadingButton className={classes.controlsButton} size="small" loadingIndicator="Loading..." variant="contained" onClick={athenaReboot}>
Reboot
</LoadingButton>
<LoadingButton className={classes.controlsButton} size="small" loadingIndicator="Loading..." variant="contained" onClick={()=>{notifdispatch({type: 'NEW_TOAST', message: 'TIDDY', open: true})}}>
Get GPS
</LoadingButton>
<LoadingButton className={classes.controlsButton} size="small" loadingIndicator="Loading..." variant="contained" onClick={refreshDongleStatus}>
Refresh
</LoadingButton>
</div>
)
}
function DeviceLastSeenMap() {
console.log("api key", process.env)
return (
<div style={{ height: "500px", width: 'calc(100%)' }}>
@ -188,8 +110,6 @@ function DeviceLastSeenMap() {
export default function SignIn(props) {
const classes = useStyles();
const [ state, dispatch ] = useContext(DeviceContext)
@ -200,26 +120,18 @@ export default function SignIn(props) {
width: "100%",
}}>
<Scrollbars autoHeightMin="100%" autoHeightMax="100%">
<Grid container style={{padding: 30}}>
<Grid container style={{padding: 30}}>
<Grid item xs={12}>
<DeviceLastSeenMap />
</Grid>
<Grid item xs={12}>
<DrivesTable dongleId={props.device.dongle_id}/>
</Grid>
</Grid>
</Scrollbars>
</div>
);

View File

@ -1,31 +1,10 @@
import React, { useState, useContext, useEffect } from 'react';
import Avatar from '@mui/material/Avatar';
import LoadingButton from '@mui/lab/LoadingButton';
import CssBaseline from '@mui/material/CssBaseline';
import TextField from '@mui/material/TextField';
import FormControlLabel from '@mui/material/FormControlLabel';
import Checkbox from '@mui/material/Checkbox';
import Grid from '@mui/material/Grid';
import Paper from '@mui/material/Paper';
import Box from '@mui/material/Box';
import CircularProgress from '@mui/material/CircularProgress';
import LockOutlinedIcon from '@mui/icons-material/LockOutlined';
import Typography from '@mui/material/Typography';
import Container from '@mui/material/Container';
import { createTheme, ThemeProvider } from '@mui/material/styles';
import { UserContext } from "./../../context/users"
import { Link } from "react-router-dom";
import PropTypes from 'prop-types';
import Tabs from '@mui/material/Tabs';
import Tab from '@mui/material/Tab';
import ButtonBase from '@mui/material/ButtonBase';
import Chip from '@mui/material/Chip';
import OutlinedInput from '@mui/material/OutlinedInput';
import IconButton from '@mui/material/IconButton';
import InputAdornment from '@mui/material/InputAdornment';
import Done from '@mui/icons-material/Done';
import ButtonBase from '@mui/material/ButtonBase'
import Divider from '@mui/material/Divider';
import Grid from '@mui/material/Grid';
import Typography from '@mui/material/Typography';
import React, { useEffect } from 'react';
const stylezz = {
@ -76,7 +55,7 @@ export default function SignIn(props) {
<ButtonBase style={{ padding: '10px' }}>
<Grid container spacing={2}>
<Grid item xs={4}>
<img src="/c3.webp" style={{ width: "100%" }} />
<img src="/c3.webp" style={{ width: "100%" }} alt="device icon"/>
</Grid>
<Grid item xs={8} style={{ textAlign: 'left' }}>
{/* <TextField

View File

@ -1,119 +1,28 @@
import React, { useState, useContext, useEffect } from 'react';
import PropTypes from 'prop-types';
import { alpha } from '@mui/material/styles';
import DeleteIcon from '@mui/icons-material/Delete';
import FavoriteBorderIcon from '@mui/icons-material/FavoriteBorder';
import OpenInNewIcon from '@mui/icons-material/OpenInNew';
import { Skeleton } from '@mui/material';
import Box from '@mui/material/Box';
import IconButton from '@mui/material/IconButton';
import Paper from '@mui/material/Paper';
import Table from '@mui/material/Table';
import TableBody from '@mui/material/TableBody';
import TableCell from '@mui/material/TableCell';
import TableContainer from '@mui/material/TableContainer';
import TableHead from '@mui/material/TableHead';
import TablePagination from '@mui/material/TablePagination';
import TableRow from '@mui/material/TableRow';
import TableSortLabel from '@mui/material/TableSortLabel';
import Toolbar from '@mui/material/Toolbar';
import Typography from '@mui/material/Typography';
import Paper from '@mui/material/Paper';
import Checkbox from '@mui/material/Checkbox';
import IconButton from '@mui/material/IconButton';
import Tooltip from '@mui/material/Tooltip';
import FormControlLabel from '@mui/material/FormControlLabel';
import Switch from '@mui/material/Switch';
import FilterListIcon from '@mui/icons-material/FilterList';
import { visuallyHidden } from '@mui/utils';
import { context as DeviceContext } from "./../../../context/devices"
import * as deviceController from "./../../../controllers/devices"
import { Skeleton, ToolTip } from '@mui/material';
import DeleteIcon from '@mui/icons-material/Delete';
import FavoriteBorderIcon from '@mui/icons-material/FavoriteBorder';
import FavoriteIcon from '@mui/icons-material/Favorite';
import OpenInNewIcon from '@mui/icons-material/OpenInNew';
import React, { useContext, useEffect } from 'react';
import { context as DeviceContext } from "./../../../context/devices";
import { context as SnackbarContext } from "./../../../context/toast";
import * as deviceController from "./../../../controllers/devices";
const rows = [
];
const headCells = [
{
id: 'identifier',
numeric: false,
disablePadding: true,
label: 'Identifier',
},
{
id: 'car',
numeric: false,
disablePadding: false,
label: 'Car',
},
{
id: 'version',
numeric: false,
disablePadding: false,
label: 'Version',
},
{
id: 'filesize',
numeric: false,
disablePadding: false,
label: 'Filesize',
},
{
id: 'duration',
numeric: false,
disablePadding: false,
label: 'Duration',
},
{
id: 'distance_meters',
numeric: false,
disablePadding: false,
label: 'Distance',
},
{
id: 'upload_complete',
numeric: false,
disablePadding: false,
label: 'Uploaded',
},
{
id: 'is_processed',
numeric: false,
disablePadding: false,
label: 'Processed',
},
{
id: 'upload_date',
numeric: false,
disablePadding: false,
label: 'Uploaded at',
},
];
function formatDate(timestampMs) {
return new Date(timestampMs).toISOString().replace(/T/, ' ').replace(/\..+/, '');
}
function formatDuration(durationSeconds) {
durationSeconds = Math.round(durationSeconds);
const secs = durationSeconds % 60;
let mins = Math.floor(durationSeconds / 60);
let hours = Math.floor(mins / 60);
mins = mins % 60;
const days = Math.floor(hours / 24);
hours = hours % 24;
let response = '';
if (days > 0) response += days + 'd ';
if (hours > 0 || days > 0) response += hours + 'h ';
if (hours > 0 || days > 0 || mins > 0) response += mins + 'm ';
response += secs + 's';
return response;
}
@ -130,27 +39,23 @@ function loading() {
export default function EnhancedTable(props) {
console.log("HELLO", props.dongleId)
const [state, dispatch] = useContext(DeviceContext)
const [ notifState, notifdispatch ] = useContext(SnackbarContext)
useEffect(() => {
deviceController.getBootlogs('53331425').then((res) => {
console.log("me result:", res)
setTimeout(() => {
dispatch({ type: "update_dongle_bootlogs", dongle_id: props.dongleId, bootlogs: res.data })
}, 1)
}).catch((err) => {
notifdispatch({type: "NEW_TOAST", msg: 'Failed to load bootlogs'})
})
}, []);
console.log("drives", state.dongles[props.dongleId])
console.log("drives", typeof state.dongles[props.dongleId])
return (
<Box sx={{ width: '100%' }}>
<Paper sx={{ width: '100%', mb: 2 }}>
@ -211,16 +116,7 @@ export default function EnhancedTable(props) {
}) :
[1, 1, 1, 1, 1].map((v) => (
<TableRow
>
<TableCell ><Skeleton animation="wave" /></TableCell>
<TableCell ><Skeleton animation="wave" /></TableCell>
<TableCell ><Skeleton animation="wave" /></TableCell>
<TableCell ><Skeleton animation="wave" /></TableCell>
</TableRow>
))
[1, 1, 1, 1, 1].map(loading)
}

View File

@ -1,25 +1,16 @@
import React, { useState, useContext } from 'react';
import PropTypes from 'prop-types';
import { alpha } from '@mui/material/styles';
import Box from '@mui/material/Box';
import Typography from '@mui/material/Typography';
import Paper from '@mui/material/Paper';
/*import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
import Accordion from '@mui/material/Accordion';
import AccordionSummary from '@mui/material/AccordionSummary';
import AccordionDetails from '@mui/material/AccordionDetails';
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
import AccordionSummary from '@mui/material/AccordionSummary';
import Typography from '@mui/material/Typography';*/
import Box from '@mui/material/Box';
import Paper from '@mui/material/Paper';
import React, { useContext } from 'react';
//import { JsonFormatter } from 'react-json-formatter'
import { context as DeviceContext } from "./../../../context/devices"
const JsonStyle = {
propertyStyle: { color: 'red' },
stringStyle: { color: 'green' },
numberStyle: { color: 'darkorange' }
}
/*
function RichContent(props) {
const content = props.content;
@ -38,18 +29,15 @@ function RichContent(props) {
<Typography>{`Picture - ${key}`} </Typography>
</AccordionSummary>
<AccordionDetails>
<img src={`data:image/gif;base64,${content.data.return.result.jpegBack}`} />
<img src={`data:image/gif;base64,${content.data.return.result.jpegFront}`} />
<img src={`data:image/gif;base64,${content.data.return.result.jpegBack}`} alt="athena road"/>
<img src={`data:image/gif;base64,${content.data.return.result.jpegFront}`} alt="athena DM"/>
</AccordionDetails>
</Accordion>
)
} else {
console.log("props:", props)
console.log("key:",key)
console.log( "ls", localStorage.getItem(`ATH-${key}`))
console.log("content:", content);
return (
<Accordion TransitionProps={{ unmountOnExit: true }} >
<AccordionSummary
@ -60,24 +48,17 @@ function RichContent(props) {
<Typography>{`${content} - ${key}`} </Typography>
</AccordionSummary>
<AccordionDetails>
{/*<JsonFormatter json={JSON.stringify(localStorage.getItem(`ATH-${key}`))} tabWith='4' JsonStyle={JsonStyle} />*/}
{<JsonFormatter json={JSON.stringify(localStorage.getItem(`ATH-${key}`))} tabWith='4' JsonStyle={JsonStyle} />}
</AccordionDetails>
</Accordion>
)
}
}
}
*/
export default function Console() {
const [state, dispatch] = useContext(DeviceContext);
return (
<Box sx={{ width: '100%' }}>
@ -93,7 +74,7 @@ export default function Console() {
*/}
</Paper>
</Box>
);

View File

@ -1,118 +1,27 @@
import React, { useState, useContext, useEffect } from 'react';
import PropTypes from 'prop-types';
import { alpha } from '@mui/material/styles';
import DeleteIcon from '@mui/icons-material/Delete';
import FavoriteBorderIcon from '@mui/icons-material/FavoriteBorder';
import OpenInNewIcon from '@mui/icons-material/OpenInNew';
import { Skeleton } from '@mui/material';
import Box from '@mui/material/Box';
import IconButton from '@mui/material/IconButton';
import Paper from '@mui/material/Paper';
import Table from '@mui/material/Table';
import TableBody from '@mui/material/TableBody';
import TableCell from '@mui/material/TableCell';
import TableContainer from '@mui/material/TableContainer';
import TableHead from '@mui/material/TableHead';
import TablePagination from '@mui/material/TablePagination';
import TableRow from '@mui/material/TableRow';
import TableSortLabel from '@mui/material/TableSortLabel';
import Toolbar from '@mui/material/Toolbar';
import Typography from '@mui/material/Typography';
import Paper from '@mui/material/Paper';
import Checkbox from '@mui/material/Checkbox';
import FormControlLabel from '@mui/material/FormControlLabel';
import Switch from '@mui/material/Switch';
import FilterListIcon from '@mui/icons-material/FilterList';
import { visuallyHidden } from '@mui/utils';
import { context as DeviceContext } from "./../../../context/devices"
import * as deviceController from "./../../../controllers/devices"
import { Skeleton, ToolTip } from '@mui/material';
import Tooltip from '@mui/material/Tooltip';
import IconButton from '@mui/material/IconButton';
import DeleteIcon from '@mui/icons-material/Delete';
import FavoriteBorderIcon from '@mui/icons-material/FavoriteBorder';
import FavoriteIcon from '@mui/icons-material/Favorite';
import OpenInNewIcon from '@mui/icons-material/OpenInNew';
import React, { useContext, useEffect } from 'react';
import { context as DeviceContext } from "./../../../context/devices";
import * as deviceController from "./../../../controllers/devices";
const rows = [
];
const headCells = [
{
id: 'identifier',
numeric: false,
disablePadding: true,
label: 'Identifier',
},
{
id: 'car',
numeric: false,
disablePadding: false,
label: 'Car',
},
{
id: 'version',
numeric: false,
disablePadding: false,
label: 'Version',
},
{
id: 'filesize',
numeric: false,
disablePadding: false,
label: 'Filesize',
},
{
id: 'duration',
numeric: false,
disablePadding: false,
label: 'Duration',
},
{
id: 'distance_meters',
numeric: false,
disablePadding: false,
label: 'Distance',
},
{
id: 'upload_complete',
numeric: false,
disablePadding: false,
label: 'Uploaded',
},
{
id: 'is_processed',
numeric: false,
disablePadding: false,
label: 'Processed',
},
{
id: 'upload_date',
numeric: false,
disablePadding: false,
label: 'Uploaded at',
},
];
function formatDate(timestampMs) {
return new Date(timestampMs).toISOString().replace(/T/, ' ').replace(/\..+/, '');
}
function formatDuration(durationSeconds) {
durationSeconds = Math.round(durationSeconds);
const secs = durationSeconds % 60;
let mins = Math.floor(durationSeconds / 60);
let hours = Math.floor(mins / 60);
mins = mins % 60;
const days = Math.floor(hours / 24);
hours = hours % 24;
let response = '';
if (days > 0) response += days + 'd ';
if (hours > 0 || days > 0) response += hours + 'h ';
if (hours > 0 || days > 0 || mins > 0) response += mins + 'm ';
response += secs + 's';
return response;
}
function buildContent(row) {
return (

View File

@ -1,36 +1,16 @@
import React, { useState, useContext } from 'react';
import Avatar from '@mui/material/Avatar';
import LoadingButton from '@mui/lab/LoadingButton';
import CssBaseline from '@mui/material/CssBaseline';
import TextField from '@mui/material/TextField';
import FormControlLabel from '@mui/material/FormControlLabel';
import Checkbox from '@mui/material/Checkbox';
import Grid from '@mui/material/Grid';
import Paper from '@mui/material/Paper';
import Box from '@mui/material/Box';
import CircularProgress from '@mui/material/CircularProgress';
import LockOutlinedIcon from '@mui/icons-material/LockOutlined';
import Typography from '@mui/material/Typography';
import Container from '@mui/material/Container';
import { createTheme, ThemeProvider } from '@mui/material/styles';
import { Link } from "react-router-dom";
import PropTypes from 'prop-types';
import Tabs from '@mui/material/Tabs';
import Tab from '@mui/material/Tab';
import DrivesLogTable from "./drives";
import CrashLogsTable from "./crash";
import BootLogsTable from "./boot";
import { context as DeviceContext } from "./../../../context/devices"
import Tooltip from '@mui/material/Tooltip';
import IconButton from '@mui/material/IconButton';
import ContentCopyIcon from '@mui/icons-material/ContentCopy';
import {context as SnackbarContext} from "./../../../context/toast"
import Grid from '@mui/material/Grid';
import IconButton from '@mui/material/IconButton';
import Skeleton from "@mui/material/Skeleton";
import Tooltip from '@mui/material/Tooltip';
import Typography from '@mui/material/Typography';
import React, { useContext } from 'react';
import { context as DeviceContext } from "./../../../context/devices";
import { context as SnackbarContext } from "./../../../context/toast";
const theme = createTheme();
function formatDate(timestampMs) {
return new Date(timestampMs).toISOString().replace(/T/, ' ').replace(/\..+/, '');
}
@ -42,20 +22,17 @@ function formatDate(timestampMs) {
export default function SignIn(props) {
const [value, setValue] = React.useState(0);
const [state, dispatch] = useContext(DeviceContext)
const [ notifState, notifdispatch ] = useContext(SnackbarContext)
const [state] = useContext(DeviceContext)
const [notifState, notifdispatch] = useContext(SnackbarContext)
function pubKeyClipboard(newClip) {
navigator.clipboard.writeText(newClip).then(function() {
navigator.clipboard.writeText(newClip).then(function () {
notifdispatch({
type: "NEW_TOAST",
open: true,
msg: "Successfully copied to clipboard!"
})
}, function() {
}, function () {
notifdispatch({
type: "NEW_TOAST",
open: true,
@ -63,15 +40,25 @@ export default function SignIn(props) {
})
});
}
const handleChange = (event, newValue) => {
setValue(newValue);
};
if (!state.dongles[props.dongleId]) { return (<p>no</p>) }
const dongle = state.dongles[props.dongleId];
// <span style={{maxWidth: "100%", overflow: "scroll", whiteSpace:"nowrap" }}> {dongle.public_key.split(/\r?\n|\r/g).map((key) => (<p style={{margin: 0}}>{key}</p>))}</span>
if (!dongle) {
return (
<Grid container>
<Grid item xs={3}>
<Skeleton animation="wave" />
<Skeleton animation="wave" />
<Skeleton animation="wave" />
</Grid>
</Grid>
)
}
return (
<div className="wrapper" style={{ marginTop: '10px' }}>
@ -80,31 +67,23 @@ export default function SignIn(props) {
<Grid container>
<Grid item xs={3}>
<div >
<b>Nickname:</b> {dongle.nick_name ? dongle.nick_name : `My ${dongle.device_type}`}<br></br>
<b>Type:</b> {dongle.device_type}<br></br>
<b>Serial:</b> {dongle.serial}<br></br>
<b>IMEI:</b> {dongle.imei}<br></br>
<b>Registered:</b> {formatDate(dongle.created)}<br></br>
<b>Last Ping:</b> {formatDate(dongle.last_ping)}<br></br>
<b>Public Key:</b> -----BEGIN PUBLIC KEY-----
<Tooltip title="Copy public key">
<IconButton onClick={() => pubKeyClipboard(dongle.public_key)}>
<ContentCopyIcon />
</IconButton>
</Tooltip>
<br></br>
<b>Quota Storage: </b>{dongle.storage_used} MB / 200000 MB
</div>
<b>Serial:</b> {dongle.serial}<br></br>
<b>IMEI:</b> {dongle.imei}<br></br>
<b>Registered:</b> {formatDate(dongle.created)}<br></br>
<b>Last Ping:</b> {formatDate(dongle.last_ping)}<br></br>
<b>Public Key:</b> -----BEGIN PUBLIC KEY-----
<Tooltip title="Copy public key">
<IconButton onClick={() => pubKeyClipboard(dongle.public_key)}>
<ContentCopyIcon />
</IconButton>
</Tooltip>
<br></br>
<b>Quota Storage: </b>{dongle.storage_used} MB / 200000 MB
</Grid>

View File

@ -1,96 +1,23 @@
import React, { useState, useContext, useEffect } from 'react';
import PropTypes from 'prop-types';
import { alpha } from '@mui/material/styles';
import DeleteIcon from '@mui/icons-material/Delete';
import FavoriteBorderIcon from '@mui/icons-material/FavoriteBorder';
import OpenInNewIcon from '@mui/icons-material/OpenInNew';
import { Skeleton } from '@mui/material';
import Box from '@mui/material/Box';
import IconButton from '@mui/material/IconButton';
import Paper from '@mui/material/Paper';
import Table from '@mui/material/Table';
import TableBody from '@mui/material/TableBody';
import TableCell from '@mui/material/TableCell';
import TableContainer from '@mui/material/TableContainer';
import TableHead from '@mui/material/TableHead';
import TablePagination from '@mui/material/TablePagination';
import TableRow from '@mui/material/TableRow';
import TableSortLabel from '@mui/material/TableSortLabel';
import Toolbar from '@mui/material/Toolbar';
import Typography from '@mui/material/Typography';
import Paper from '@mui/material/Paper';
import Checkbox from '@mui/material/Checkbox';
import IconButton from '@mui/material/IconButton';
import Tooltip from '@mui/material/Tooltip';
import FormControlLabel from '@mui/material/FormControlLabel';
import Switch from '@mui/material/Switch';
import FilterListIcon from '@mui/icons-material/FilterList';
import { visuallyHidden } from '@mui/utils';
import { context as DeviceContext } from "./../../../context/devices"
import * as deviceController from "./../../../controllers/devices"
import { Skeleton, ToolTip } from '@mui/material';
import DeleteIcon from '@mui/icons-material/Delete';
import FavoriteBorderIcon from '@mui/icons-material/FavoriteBorder';
import FavoriteIcon from '@mui/icons-material/Favorite';
import OpenInNewIcon from '@mui/icons-material/OpenInNew';
import React, { useContext, useEffect } from 'react';
import { context as DeviceContext } from "./../../../context/devices";
import { context as SnackbarContext } from "./../../../context/toast";
import * as deviceController from "./../../../controllers/devices";
const rows = [
];
const headCells = [
{
id: 'identifier',
numeric: false,
disablePadding: true,
label: 'Identifier',
},
{
id: 'car',
numeric: false,
disablePadding: false,
label: 'Car',
},
{
id: 'version',
numeric: false,
disablePadding: false,
label: 'Version',
},
{
id: 'filesize',
numeric: false,
disablePadding: false,
label: 'Filesize',
},
{
id: 'duration',
numeric: false,
disablePadding: false,
label: 'Duration',
},
{
id: 'distance_meters',
numeric: false,
disablePadding: false,
label: 'Distance',
},
{
id: 'upload_complete',
numeric: false,
disablePadding: false,
label: 'Uploaded',
},
{
id: 'is_processed',
numeric: false,
disablePadding: false,
label: 'Processed',
},
{
id: 'upload_date',
numeric: false,
disablePadding: false,
label: 'Uploaded at',
},
];
function formatDate(timestampMs) {
return new Date(timestampMs).toISOString().replace(/T/, ' ').replace(/\..+/, '');
@ -115,27 +42,20 @@ function formatDuration(durationSeconds) {
export default function EnhancedTable(props) {
console.log("HELLO", props.dongleId)
const [state, dispatch] = useContext(DeviceContext)
const [ notifState, notifdispatch ] = useContext(SnackbarContext)
useEffect(() => {
deviceController.getDrives('53331425').then((res) => {
console.log("me result:", res)
deviceController.getDrives(props.dongleId).then((res) => {
setTimeout(() => {
dispatch({ type: "update_dongle_drive", dongle_id: props.dongleId, drives: res.data })
}, 1)
}).catch((err) => {
notifdispatch({type: "NEW_TOAST", msg: 'Failed to load drives'})
})
}, []);
console.log("drives", state.dongles[props.dongleId])
console.log("drives", typeof state.dongles[props.dongleId])
return (
<Box sx={{ width: '100%' }}>
<Paper sx={{ width: '100%', mb: 2 }}>
@ -147,16 +67,16 @@ export default function EnhancedTable(props) {
>
<TableHead>
<TableRow>
<TableCell >Identifier</TableCell>
<TableCell >Car</TableCell>
<TableCell >Version</TableCell>
<TableCell >File size</TableCell>
<TableCell >Duration</TableCell>
<TableCell >Distance</TableCell>
<TableCell >uploaded</TableCell>
<TableCell >Processed</TableCell>
<TableCell >Date</TableCell>
<TableCell >Actions</TableCell>
<TableCell>Identifier</TableCell>
<TableCell>Car</TableCell>
<TableCell>Version</TableCell>
<TableCell>File size</TableCell>
<TableCell>Duration</TableCell>
<TableCell>Distance</TableCell>
<TableCell>uploaded</TableCell>
<TableCell>Processed</TableCell>
<TableCell>Date</TableCell>
<TableCell>Actions</TableCell>
</TableRow>
</TableHead>
@ -173,7 +93,6 @@ export default function EnhancedTable(props) {
<TableRow
hover
>
<TableCell
scope="row"
>{row.identifier}</TableCell>
@ -187,31 +106,30 @@ export default function EnhancedTable(props) {
<TableCell >{row.is_processed.toString()}</TableCell>
<TableCell >{formatDate(row.drive_date)}</TableCell>
<TableCell>
<Tooltip title="Open in new window">
<IconButton size="small">
<OpenInNewIcon fontSize="inherit"/>
</IconButton>
</Tooltip>
<Tooltip title="Preserve">
<IconButton size="small">
<FavoriteBorderIcon fontSize="inherit"/>
</IconButton>
</Tooltip>
<Tooltip title="Delete">
<IconButton size="small">
<DeleteIcon fontSize="inherit"/>
<Tooltip title="Open in new window">
<IconButton size="small">
<OpenInNewIcon fontSize="inherit" />
</IconButton>
</Tooltip>
</Tooltip>
<Tooltip title="Preserve">
<IconButton size="small">
<FavoriteBorderIcon fontSize="inherit" />
</IconButton>
</Tooltip>
<Tooltip title="Delete">
<IconButton size="small">
<DeleteIcon fontSize="inherit" />
</IconButton>
</Tooltip>
</TableCell>
</TableRow>
)
}) :
}) :
[1, 1, 1, 1, 1].map((v) => (
<TableRow
@ -239,16 +157,9 @@ export default function EnhancedTable(props) {
}
</TableBody>
</Table>
</TableContainer>
</Paper>
</Box>
);

View File

@ -1,31 +1,15 @@
import React, { useState, useContext } from 'react';
import Avatar from '@mui/material/Avatar';
import LoadingButton from '@mui/lab/LoadingButton';
import CssBaseline from '@mui/material/CssBaseline';
import TextField from '@mui/material/TextField';
import FormControlLabel from '@mui/material/FormControlLabel';
import Checkbox from '@mui/material/Checkbox';
import Grid from '@mui/material/Grid';
import Paper from '@mui/material/Paper';
import Box from '@mui/material/Box';
import CircularProgress from '@mui/material/CircularProgress';
import LockOutlinedIcon from '@mui/icons-material/LockOutlined';
import Typography from '@mui/material/Typography';
import Container from '@mui/material/Container';
import { createTheme, ThemeProvider } from '@mui/material/styles';
import { Link } from "react-router-dom";
import PropTypes from 'prop-types';
import Tabs from '@mui/material/Tabs';
import Tab from '@mui/material/Tab';
import DrivesLogTable from "./drives";
import CrashLogsTable from "./crash";
import Tabs from '@mui/material/Tabs';
import React from 'react';
import BootLogsTable from "./boot";
import DeviceInfo from './device'
import Console from './console'
import Console from './console';
import CrashLogsTable from "./crash";
import DeviceInfo from './device';
import DrivesLogTable from "./drives";
const theme = createTheme();
function TabPanel(props) {
const { children, value, index, ...other } = props;
@ -61,7 +45,8 @@ export default function SignIn(props) {
<div className="wrapper">
<Box sx={{ borderBottom: 1, borderColor: 'divider' }}>
<Tabs value={value} onChange={handleChange} aria-label="basic tabs example">
<Tabs value={value} onChange={handleChange} aria-label="basic tabs example" variant="scrollable"
scrollButtons="auto">
<Tab label="Device" />
<Tab label="Drives" />
<Tab label="Crashes" />
@ -84,6 +69,11 @@ export default function SignIn(props) {
<TabPanel value={value} index={4}>
<Console dongleId={props.dongleId} />
</TabPanel>
{
}
</div>
);
}

View File

@ -1,20 +1,7 @@
import React, {useState, useContext} from 'react';
import Avatar from '@mui/material/Avatar';
import LoadingButton from '@mui/lab/LoadingButton';
import CssBaseline from '@mui/material/CssBaseline';
import TextField from '@mui/material/TextField';
import FormControlLabel from '@mui/material/FormControlLabel';
import Checkbox from '@mui/material/Checkbox';
import Grid from '@mui/material/Grid';
import Paper from '@mui/material/Paper';
import Box from '@mui/material/Box';
import CircularProgress from '@mui/material/CircularProgress';
import LockOutlinedIcon from '@mui/icons-material/LockOutlined';
import Typography from '@mui/material/Typography';
import Container from '@mui/material/Container';
import { createTheme, ThemeProvider } from '@mui/material/styles';
import { UserContext } from "./../../context/users"
import React, { useContext, useState } from 'react';
import { Link } from "react-router-dom";
import { UserContext } from "./../../context/users";
const theme = createTheme();

View File

@ -1,25 +1,17 @@
import React, {useState, useContext} from 'react';
import Avatar from '@mui/material/Avatar';
import LoadingButton from '@mui/lab/LoadingButton';
import CssBaseline from '@mui/material/CssBaseline';
import TextField from '@mui/material/TextField';
import FormControlLabel from '@mui/material/FormControlLabel';
import Checkbox from '@mui/material/Checkbox';
import Link from '@mui/material/Link';
import Grid from '@mui/material/Grid';
import Paper from '@mui/material/Paper';
import Box from '@mui/material/Box';
import CircularProgress from '@mui/material/CircularProgress';
import LockOutlinedIcon from '@mui/icons-material/LockOutlined';
import Typography from '@mui/material/Typography';
import Container from '@mui/material/Container';
import { createTheme, ThemeProvider } from '@mui/material/styles';
import { UserContext } from "./../../context/users"
const theme = createTheme();
import Grid from '@mui/material/Grid';
import Link from '@mui/material/Link';
import Paper from '@mui/material/Paper';
import TextField from '@mui/material/TextField';
import Typography from '@mui/material/Typography';
import React, { useContext, useState } from 'react';
import { UserContext } from "./../../context/users";
export default function SignIn() {
const [loading, setLoading] = useState(false)
const [ state, dispatch ] = useContext(UserContext)
const [state, dispatch] = useContext(UserContext)
console.log("component", state)
const handleSubmit = (event) => {
dispatch({ type: "toggle_button" })
@ -33,69 +25,79 @@ export default function SignIn() {
});
setLoading(true)
};
return (
<ThemeProvider theme={theme}>
<Container component="main" maxWidth="xs">
<CssBaseline />
<Paper
sx={{
marginTop: 8,
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
}}
style={{
padding: '15px'
}}
>
<Typography component="h1" variant="h5">
Sign in
</Typography>
<Box component="form" onSubmit={handleSubmit} noValidate sx={{ mt: 1 }}>
<TextField
margin="normal"
required
fullWidth
id="email"
label="Email Address"
name="email"
autoComplete="email"
autoFocus
/>
<TextField
margin="normal"
required
fullWidth
name="password"
label="Password"
type="password"
id="password"
autoComplete="current-password"
/>
<Container component="main" maxWidth="xs" style={{ height: '100vh' }}>
<LoadingButton
type="submit"
fullWidth
variant="contained"
sx={{ mt: 3, mb: 2 }}
loading={loading}
>
Sign In
</LoadingButton>
<Link href="#" variant="body2">
{"New Here or Forgotten password?"}
</Link>
</Box>
</Paper>
</Container>
</ThemeProvider>
<Grid container direction="row" justifyContent="center" alignItems="center" style={{ height: '100vh' }}>
<Grid item xs={12}>
<Paper
sx={{
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
}}
style={{
padding: '15px'
}}
>
<Typography component="h1" variant="h5" align="left">
Sign in
</Typography>
<Box component="form" onSubmit={handleSubmit} noValidate sx={{ mt: 1 }}>
<TextField
margin="normal"
required
fullWidth
id="email"
label="Email Address"
name="email"
autoComplete="email"
autoFocus
/>
<TextField
margin="normal"
required
fullWidth
name="password"
label="Password"
type="password"
id="password"
autoComplete="current-password"
/>
<LoadingButton
type="submit"
fullWidth
variant="contained"
sx={{ mt: 3, mb: 2 }}
loading={loading}
>
Sign In
</LoadingButton>
<Link href="#" variant="body2">
{"New Here or Forgotten password?"}
</Link>
</Box>
</Paper>
</Grid>
</Grid>
</Container>
);
}

View File

@ -1,48 +1,24 @@
import React, { useState, useContext } from 'react';
import Avatar from '@mui/material/Avatar';
import LoadingButton from '@mui/lab/LoadingButton';
import CssBaseline from '@mui/material/CssBaseline';
import TextField from '@mui/material/TextField';
import FormControlLabel from '@mui/material/FormControlLabel';
import Checkbox from '@mui/material/Checkbox';
import Grid from '@mui/material/Grid';
import Paper from '@mui/material/Paper';
import Box from '@mui/material/Box';
import CircularProgress from '@mui/material/CircularProgress';
import LockOutlinedIcon from '@mui/icons-material/LockOutlined';
import Typography from '@mui/material/Typography';
import Container from '@mui/material/Container';
import { createTheme, ThemeProvider } from '@mui/material/styles';
import { UserContext } from "./../../context/users"
import { Link } from "react-router-dom";
import PropTypes from 'prop-types';
import Tabs from '@mui/material/Tabs';
import Tab from '@mui/material/Tab';
import DeviceData from './../device/deviceData';
import DeviceOverview from "./../device/overview"
import { Scrollbars } from 'rc-scrollbars';
import { context as DeviceContext } from "./../../context/devices"
const theme = createTheme();
import React, { useContext } from 'react';
import { context as DeviceContext } from "./../../context/devices";
import DeviceData from './../device/deviceData';
import DeviceOverview from "./../device/overview";
export default function SignIn() {
const [value, setValue] = React.useState(0);
const handleChange = (event, newValue) => {
setValue(newValue);
};
const [deviceState, deviceDispatch] = useContext(DeviceContext);
console.log("USER ADMIN STATE", deviceState)
let ok = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
const [deviceState] = useContext(DeviceContext);
return (
<div className="wrapper">

View File

@ -1,14 +1,10 @@
import React, { useEffect, useState, useContext } from 'react';
import {context as DeviceContext} from "./../../context/toast"
import Snackbar from '@mui/material/Snackbar';
import Slide from '@mui/material/Slide';
import Collapse from '@mui/material/Collapse';
import Button from '@mui/material/Button';
import CloseIcon from '@mui/icons-material/Close';
import React, { useContext } from 'react';
import { context as DeviceContext } from "./../../context/toast";
export default function Toast(props) {

View File

@ -1,5 +1,5 @@
import React, { createContext, useReducer, useEffect, useRef } from "react";
import * as deviceController from "./../../controllers/devices"
import React, { createContext, useEffect, useReducer } from "react";
import * as deviceController from "./../../controllers/devices";
function process(state, action) {
if (action.type !== "ADD_DATA") { return state }
@ -7,7 +7,6 @@ function process(state, action) {
switch (action.data.command) {
case "dongle_status":
console.log("dongle:", action.data.data.dongle_id)
return {
...state,
dongles: {
@ -19,14 +18,7 @@ function process(state, action) {
dongle_id: action.data.data.dongle_id
}
}
}
case "get_drives": {
}
default:
return state;
}
@ -42,14 +34,12 @@ export const Reducer = (state, action) => {
return process(state, action);
case "fetch_all_dongles":
console.log("fetch", action)
return {
...state,
dongles: action.data
}
case "update_dongle_drive":
return {
...state,
dongles: {
@ -85,9 +75,17 @@ export const Reducer = (state, action) => {
}
}
case "user_authentication":
return {
...state,
user: action.user
}
default:
return state;
}
};
@ -116,7 +114,6 @@ const Store = ({ children }) => {
deviceController.getAllDevices().then((devices) => {
console.log("store", devices)
dispatch({ type: "fetch_all_dongles", data: devices })
})

View File

@ -1,6 +1,4 @@
import { tableBodyClasses } from "@mui/material";
import axios from "axios";
import {context as DeviceContext} from "./../context/devices"
@ -27,9 +25,9 @@ export async function getAllDevices() {
if (responseData.success === true) {
responseData.data.map((object)=>{
responseData.data.map((object) => {
dongles = {
return dongles = {
...dongles,
[object.dongle_id]: {
...object,