import React, { useState, useEffect, useRef } from 'react';
import {
Grid, FormControlLabel, Switch, IconButton, TextField, makeStyles, Paper, Slider, Toolbar, Tooltip, Typography,
} from '@material-ui/core';
import ArrowBackIcon from '@material-ui/icons/ArrowBack';
import SettingsIcon from '@material-ui/icons/Settings';
import PlayArrowIcon from '@material-ui/icons/PlayArrow';
import PauseIcon from '@material-ui/icons/Pause';
import FastForwardIcon from '@material-ui/icons/FastForward';
import FastRewindIcon from '@material-ui/icons/FastRewind';
import { useHistory } from 'react-router-dom';
import { useSelector } from 'react-redux';
import Map from '../map/Map';
import ReplayPathMap from '../map/ReplayPathMap';
import PositionsMap from '../map/PositionsMap';
import { formatPosition } from '../common/formatter';
import ReportFilter from './ReportFilter';
import { useTranslation } from '../LocalizationProvider';
const useStyles = makeStyles((theme) => ({
root: {
height: '100vh',
},
title: {
...theme.typography.title,
},
sidebar: {
position: 'absolute',
left: 0,
top: 0,
margin: theme.spacing(1.5),
width: theme.dimensions.drawerWidthDesktop,
[theme.breakpoints.down('md')]: {
width: '100%',
margin: 0,
},
},
formControlLabel: {
height: '100%',
width: '100%',
paddingRight: theme.spacing(1),
justifyContent: 'space-between',
alignItems: 'center',
},
reportFilterContainer: {
flex: 1,
padding: theme.spacing(2),
[theme.breakpoints.down('md')]: {
margin: theme.spacing(1),
},
},
sliderContainer: {
padding: theme.spacing(2),
},
}));
const TimeLabel = ({ children, open, value }) => (
{children}
);
const ReplayPage = () => {
const t = useTranslation();
const classes = useStyles();
const history = useHistory();
const timerRef = useRef();
const [positions, setPositions] = useState([]);
const [index, setIndex] = useState(0);
const [selectedDeviceId, setSelectedDeviceId] = useState();
const [playbackSpeed, setPlaybackSpeed] = useState('');
const [expanded, setExpanded] = useState(true);
const [isPlaying, setIsPlaying] = useState(false);
const deviceName = useSelector((state) => {
if (selectedDeviceId) {
const device = state.devices.items[selectedDeviceId];
if (device) {
return device.name;
}
}
return null;
});
useEffect(() => {
if (isPlaying && positions.length > 0) {
timerRef.current = setInterval(() => {
setIndex((index) => index + 1);
}, 500);
} else {
clearInterval(timerRef.current);
}
return () => clearInterval(timerRef.current);
}, [isPlaying, positions]);
const handleSubmit = async (deviceId, from, to, _, headers) => {
setSelectedDeviceId(deviceId);
const query = new URLSearchParams({ deviceId, from, to });
const response = await fetch(`/api/positions?${query.toString()}`, { headers });
if (response.ok) {
setIndex(0);
setPositions(await response.json());
setExpanded(false);
}
};
return (
history.push('/')}>
{t('reportReplay')}
{!expanded && (
setExpanded(true)}>
)}
{!expanded ? (
{deviceName}
({ value: index }))}
value={index}
onChange={(_, index) => setIndex(index)}
valueLabelDisplay="auto"
valueLabelFormat={(i) => (i < positions.length ? formatPosition(positions[i], 'fixTime') : '')}
ValueLabelComponent={TimeLabel}
/>
{`${index}/${positions.length}`}
setIndex((index) => index - 1)} disabled={isPlaying}>
setIsPlaying(!isPlaying)}>
{isPlaying ? : }
setIndex((index) => index + 1)} disabled={isPlaying}>
{formatPosition(positions[index], 'fixTime')}
) : (
setPlaybackSpeed(e.target.value)}
variant="filled"
/>
setIsPlaying(e.target.checked)}
name="autoPlay"
color="primary"
edge="start"
/>
)}
label={t('reportAutoPlay')}
labelPlacement="start"
/>
)}
);
};
export default ReplayPage;