split out scroll hooks

This commit is contained in:
Samuel Newman
2024-09-26 00:18:15 +01:00
parent 2e5f95c8dd
commit ff9be546e7
3 changed files with 61 additions and 43 deletions
+22
View File
@@ -0,0 +1,22 @@
import {useEffect, useState} from 'react'
// stayed true for at least `delay` ms before returning to false
export function useStickyToggle(value: boolean, delay: number) {
const [prevValue, setPrevValue] = useState(value)
const [isSticking, setIsSticking] = useState(false)
useEffect(() => {
if (isSticking) {
const timeout = setTimeout(() => setIsSticking(false), delay)
return () => clearTimeout(timeout)
}
}, [isSticking, delay])
if (value !== prevValue) {
setIsSticking(prevValue) // Going true -> false should stick.
setPrevValue(value)
return prevValue ? true : value
}
return isSticking ? true : value
}