Spaces:
Runtime error
Runtime error
import { useCallback, useEffect, useRef, useState } from 'react'; | |
export const useScrollAnchor = (scrollBottom: number) => { | |
const messagesRef = useRef<HTMLDivElement>(null); | |
const scrollRef = useRef<HTMLDivElement>(null); | |
const visibilityRef = useRef<HTMLDivElement>(null); | |
// const [isAtBottom, setIsAtBottom] = useState(true); | |
const [isVisible, setIsVisible] = useState(false); | |
const scrollToBottom = useCallback(() => { | |
if (visibilityRef.current) { | |
visibilityRef.current.scrollIntoView({ | |
block: 'end', | |
behavior: 'smooth', | |
}); | |
} | |
}, []); | |
// useEffect(() => { | |
// if (messagesRef.current) { | |
// if (isAtBottom && !isVisible) { | |
// messagesRef.current.scrollIntoView({ | |
// block: 'end', | |
// }); | |
// } | |
// } | |
// }, [isAtBottom, isVisible]); | |
/** | |
* Seem to be broken, no time to fix | |
*/ | |
// useEffect(() => { | |
// const { current } = scrollRef; | |
// if (current) { | |
// const handleScroll = (event: Event) => { | |
// const target = event.target as HTMLDivElement; | |
// const offset = 100; | |
// console.log( | |
// '[Ming] ~ handleScroll ~ target.scrollTop + target.clientHeight:', | |
// target.scrollTop + target.clientHeight - target.scrollHeight, | |
// ); | |
// const isAtBottom = | |
// target.scrollTop + target.clientHeight >= | |
// target.scrollHeight - offset; | |
// setIsAtBottom(isAtBottom); | |
// }; | |
// current.addEventListener('scroll', handleScroll, { | |
// passive: true, | |
// }); | |
// console.log('[Ming] ~ useEffect ~ current:', current); | |
// return () => { | |
// current.removeEventListener('scroll', handleScroll); | |
// }; | |
// } | |
// }, []); | |
useEffect(() => { | |
if (visibilityRef.current) { | |
let observer = new IntersectionObserver( | |
entries => { | |
entries.forEach(entry => { | |
if (entry.isIntersecting) { | |
setIsVisible(true); | |
} else { | |
setIsVisible(false); | |
} | |
}); | |
}, | |
{ | |
rootMargin: `0px 0px -${scrollBottom}px 0px`, | |
}, | |
); | |
observer.observe(visibilityRef.current); | |
return () => { | |
observer.disconnect(); | |
}; | |
} | |
}); | |
return { | |
messagesRef, | |
scrollRef, | |
visibilityRef, | |
scrollToBottom, | |
isVisible, | |
}; | |
}; | |