import { useEffect, useState, useMemo } from 'react' import { Timed } from 'Player' import useLatestRef from 'App/hooks/useLatestRef' import useCancelableTimeout from 'App/hooks/useCancelableTimeout' const TIMEOUT_DURATION = 5000; export function getLastItemTime(...lists: Timed[][]) { return Math.max(...lists.map(l => l.length ? l[l.length-1].time : 0)) } function useAutoupdate( savedValue: T, actualValue: T, resetValue: T, updadteValue: (value: T) => void, ) { const [ autoupdate, setAutoupdate ] = useState(savedValue === resetValue) const [ timeoutStartAutoupdate, stopAutoupdate ] = useCancelableTimeout( () => setAutoupdate(true), () => setAutoupdate(false), TIMEOUT_DURATION, ) useEffect(() => { if (autoupdate && actualValue !== savedValue) { updadteValue(actualValue) } }, [ autoupdate, actualValue ]) const autoScrollRef = useLatestRef(autoupdate) useEffect(() => { if (!autoupdate) { timeoutStartAutoupdate() } return () => { if (autoScrollRef.current) { updadteValue(resetValue) } } }, []) return [ timeoutStartAutoupdate, stopAutoupdate ] } // That might be simplified by removing index from devTools[INDEX_KEY] store... export default function useAutoscroll( filteredList: Timed[], time: number, savedIndex: number, updadteIndex: (index: number) => void, ) { const filteredIndexNow = useMemo(() => { // Should use findLastIndex here for (let i=0; i < filteredList.length; i++) { if (filteredList[i].time > time) { return i-1 } } return filteredList.length }, [ time, filteredList ]) return useAutoupdate(savedIndex, filteredIndexNow, 0, updadteIndex) }