46 lines
1.3 KiB
TypeScript
46 lines
1.3 KiB
TypeScript
'use client'
|
|
|
|
import { useState, useEffect, useCallback } from 'react'
|
|
|
|
export function useScroll() {
|
|
const [isAtBottom, setIsAtBottom] = useState(false)
|
|
|
|
const handleScroll = useCallback(() => {
|
|
const footer = document.querySelector('footer')
|
|
if (footer) {
|
|
const footerTop = footer.getBoundingClientRect().top
|
|
setIsAtBottom(footerTop < window.innerHeight)
|
|
}
|
|
}, [])
|
|
|
|
useEffect(() => {
|
|
window.addEventListener('scroll', handleScroll)
|
|
handleScroll() // Initial check
|
|
return () => window.removeEventListener('scroll', handleScroll)
|
|
}, [handleScroll])
|
|
|
|
const scrollToNext = () => {
|
|
const sections = Array.from(
|
|
document.querySelectorAll('section[id]')
|
|
) as HTMLElement[]
|
|
const scrollPosition = window.scrollY + window.innerHeight / 2
|
|
|
|
const currentSection = sections.reduce((acc, section) => {
|
|
return section.offsetTop < scrollPosition ? section : acc
|
|
}, sections[0])
|
|
|
|
const currentIndex = sections.findIndex((sec) => sec.id === currentSection.id)
|
|
const nextIndex = currentIndex + 1
|
|
|
|
if (nextIndex < sections.length) {
|
|
sections[nextIndex].scrollIntoView({ behavior: 'smooth' })
|
|
}
|
|
}
|
|
|
|
const scrollToTop = () => {
|
|
window.scrollTo({ top: 0, behavior: 'smooth' })
|
|
}
|
|
|
|
return { isAtBottom, scrollToNext, scrollToTop }
|
|
}
|