mirror of
https://github.com/status-im/status-web.git
synced 2025-01-27 12:54:59 +00:00
c338bf7aae
* initial * add to app * add to app * context tag * rebase and fix changes * update context-tag, update dialog * update mocks * fix dialog show * clean up stories * fix ids * unify component definition * pr fixes * fix blur view * fix blur view * fix composer position * context tag * add icon avatar + pin announcement * fix spacing * fixes * blue background for pin --------- Co-authored-by: Pavel Prichodko <14926950+prichodko@users.noreply.github.com>
69 lines
1.6 KiB
TypeScript
69 lines
1.6 KiB
TypeScript
import { useEffect, useState } from 'react'
|
|
|
|
import { useThrottle } from './use-throttle'
|
|
|
|
interface UseBlurReturn {
|
|
shouldBlurBottom: boolean
|
|
shouldBlurTop: boolean
|
|
}
|
|
|
|
type UseBlurProps = {
|
|
ref: React.RefObject<HTMLDivElement>
|
|
marginBlurBottom?: number
|
|
heightTop?: number
|
|
throttle?: number
|
|
}
|
|
|
|
const useBlur = (props: UseBlurProps): UseBlurReturn => {
|
|
const {
|
|
marginBlurBottom = 32,
|
|
heightTop = 96,
|
|
throttle = 100,
|
|
ref,
|
|
} = props || {}
|
|
|
|
const [shouldBlurTop, setShouldBlurTop] = useState(false)
|
|
const [shouldBlurBottom, setShouldBlurBottom] = useState(false)
|
|
|
|
const handleScroll = useThrottle(() => {
|
|
const scrollPosition = ref.current!.scrollTop
|
|
const elementHeight = ref.current!.clientHeight
|
|
const scrollHeight = ref.current?.scrollHeight || 0
|
|
|
|
if (scrollPosition >= heightTop) {
|
|
setShouldBlurTop(true)
|
|
}
|
|
|
|
if (scrollPosition < heightTop) {
|
|
setShouldBlurTop(false)
|
|
}
|
|
|
|
if (scrollPosition < scrollHeight - (elementHeight + marginBlurBottom)) {
|
|
setShouldBlurBottom(true)
|
|
}
|
|
|
|
if (scrollPosition >= scrollHeight - (elementHeight + marginBlurBottom)) {
|
|
setShouldBlurBottom(false)
|
|
}
|
|
}, throttle)
|
|
|
|
useEffect(() => {
|
|
const element = props.ref
|
|
if (!element.current) {
|
|
throw new Error('useBlur ref not set correctly')
|
|
}
|
|
|
|
element.current!.addEventListener('scroll', handleScroll, { passive: true })
|
|
|
|
handleScroll()
|
|
|
|
return () => {
|
|
element.current!.removeEventListener('scroll', handleScroll)
|
|
}
|
|
}, [handleScroll, props.ref])
|
|
|
|
return { shouldBlurBottom, shouldBlurTop }
|
|
}
|
|
|
|
export { useBlur }
|