import { useEffect, useRef, useState } from 'react' import Typography from '@material-ui/core/Typography' import DialogTitle from '@material-ui/core/DialogTitle' import DialogContent from '@material-ui/core/DialogContent' import { getPeerString, humanizeSize } from 'utils/Utils' import { cacheHost } from 'utils/Hosts' export default function DialogCacheInfo({ hash }) { const [cache, setCache] = useState({}) const [pMap, setPMap] = useState([]) const timerID = useRef(null) const componentIsMounted = useRef(true) useEffect( () => () => { componentIsMounted.current = false }, [], ) useEffect(() => { if (hash) { timerID.current = setInterval(() => { getCache(hash, value => { // this is needed to avoid memory leak if (componentIsMounted.current) setCache(value) }) }, 100) } else clearInterval(timerID.current) return () => { clearInterval(timerID.current) } }, [hash]) useEffect(() => { if (!cache?.PiecesCount || !cache?.Pieces) return const { Pieces, PiecesCount, Readers } = cache const map = [] for (let i = 0; i < PiecesCount; i++) { const cls = ['piece'] let prc = 0 const currentPiece = Pieces[i] if (currentPiece) { if (currentPiece.Completed && currentPiece.Size === currentPiece.Length) cls.push('piece-complete') else cls.push('piece-loading') prc = (currentPiece.Size / currentPiece.Length).toFixed(2) } Readers.forEach(r => { if (i === r.Reader) return cls.push('piece-reader') if (i >= r.Start && i <= r.End) cls.push('reader-range') }) map.push({ prc, className: cls.join(' '), id: i }) } setPMap(map) }, [cache]) return (