From a4ebc074d1432ef2e02231898305f3ce931f41b5 Mon Sep 17 00:00:00 2001 From: cristiano cardelli Date: Fri, 30 Aug 2024 13:59:50 +0200 Subject: [PATCH] change scroll/collapsed card behavior --- .../components/grant-card/client-wrapper.tsx | 61 +++++++++++-------- 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/src/grants/components/grant-card/client-wrapper.tsx b/src/grants/components/grant-card/client-wrapper.tsx index 1ecf54dd..e162ec01 100644 --- a/src/grants/components/grant-card/client-wrapper.tsx +++ b/src/grants/components/grant-card/client-wrapper.tsx @@ -1,10 +1,9 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ 'use client'; -import { useCallback, useEffect, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { cn } from '@/shared/utils/cn'; -import { useDebounceFn } from '@/shared/hooks/use-debounce-fn'; interface Props { backButton: React.ReactNode; @@ -13,41 +12,49 @@ interface Props { } export const ClientWrapper = ({ backButton, collapsed, full }: Props) => { - const [prevScrollPos, setPrevScrollPos] = useState(0); - const [isCollapsed, setIsCollapsed] = useState(false); + const sentinelRef = useRef(null); - const handleScroll = useCallback(() => { - const currentScrollPos = window.scrollY; - - if (currentScrollPos >= 50) { - setIsCollapsed(true); - } else if (currentScrollPos < prevScrollPos) { - setIsCollapsed(false); + useEffect(() => { + const observer = new IntersectionObserver( + ([entry]) => { + setIsCollapsed(!entry.isIntersecting); + }, + { + rootMargin: '50px 0px 0px 0px', // Adjust as needed + threshold: 0, + }, + ); + + if (sentinelRef.current) { + observer.observe(sentinelRef.current); } - setPrevScrollPos(currentScrollPos); - }, [prevScrollPos]); - const debouncedHandleScroll = useDebounceFn(handleScroll, 50); - - useEffect(() => { - window.addEventListener('scroll', debouncedHandleScroll); return () => { - window.removeEventListener('scroll', debouncedHandleScroll); + if (sentinelRef.current) { + observer.unobserve(sentinelRef.current); + } }; - }, [debouncedHandleScroll]); + }, []); const content = isCollapsed ? collapsed : full; return ( -
-
{backButton}
-
- {content} +
+
+
+ {/* Sentinel element for IntersectionObserver */} + +
+ {backButton} +
+
+ {content} +
);