import React, { useEffect, useRef, useState } from 'react'; import { useDispatch } from 'react-redux'; import makeStyles from '@mui/styles/makeStyles'; import { VariableSizeList } from 'react-window'; import AutoSizer from 'react-virtualized-auto-sizer'; import { devicesActions } from '../store'; import { useEffectAsync } from '../reactHelper'; import DeviceRow from './DeviceRow'; import { useAttributePreference } from '../common/util/preferences'; const useStyles = makeStyles((theme) => ({ list: { maxHeight: '100%', }, listInner: { position: 'relative', margin: theme.spacing(1.5, 0), }, })); const DeviceList = ({ devices }) => { const classes = useStyles(); const dispatch = useDispatch(); const listInnerEl = useRef(null); if (listInnerEl.current) { listInnerEl.current.className = classes.listInner; } const [, setTime] = useState(Date.now()); const positionItems = useAttributePreference('positionItems', 'speed,address,totalDistance,course'); useEffect(() => { const interval = setInterval(() => setTime(Date.now()), 60000); return () => { clearInterval(interval); }; }, []); useEffectAsync(async () => { const response = await fetch('/api/devices'); if (response.ok) { dispatch(devicesActions.refresh(await response.json())); } else { throw Error(await response.text()); } }, []); // RATIONALE: calculate row height to fit position attributes const getItemSize = (index) => { const item = devices[index]; return 72 + (item.positionId && (positionItems.split(',').length * 20) || 0); }; return ( {({ height, width }) => ( {DeviceRow} )} ); }; export default DeviceList;