From 7a0525dd97a5bf975555986dbba6d2cf0a18e211 Mon Sep 17 00:00:00 2001 From: kKaskak <117831817+kKaskak@users.noreply.github.com> Date: Thu, 16 Nov 2023 17:43:49 +0200 Subject: [PATCH] refactor: scroll top button --- .../MetaDetails/StreamsList/StreamsList.js | 45 +++++++++--- .../MetaDetails/StreamsList/styles.less | 71 ++++++++++++------- 2 files changed, 81 insertions(+), 35 deletions(-) diff --git a/src/routes/MetaDetails/StreamsList/StreamsList.js b/src/routes/MetaDetails/StreamsList/StreamsList.js index c748feae7..e6297e8cc 100644 --- a/src/routes/MetaDetails/StreamsList/StreamsList.js +++ b/src/routes/MetaDetails/StreamsList/StreamsList.js @@ -16,6 +16,9 @@ const StreamsList = ({ className, video, ...props }) => { const { t } = useTranslation(); const { core } = useServices(); const [selectedAddon, setSelectedAddon] = React.useState(ALL_ADDONS_KEY); + const streamsContainerRef = React.useRef(null); + const [isScrollable, setIsScrollable] = React.useState(false); + const [showBackToTop, setShowBackToTop] = React.useState(false); const onAddonSelected = React.useCallback((event) => { setSelectedAddon(event.value); }, []); @@ -76,10 +79,33 @@ const StreamsList = ({ className, video, ...props }) => { onSelect: onAddonSelected }; }, [streamsByAddon, selectedAddon]); - const streamsContainerRef = React.useRef(null); + const handleScroll = () => { + if (streamsContainerRef.current) { + const { scrollTop, scrollHeight, clientHeight } = streamsContainerRef.current; + const isScrollable = scrollHeight - clientHeight > 0; + setShowBackToTop(scrollTop > 50); + setIsScrollable(isScrollable); + } + }; + React.useEffect(() => { + const container = streamsContainerRef.current; + handleScroll(); + if (container) { + container.addEventListener('scroll', handleScroll); + } + return () => { + if (container) { + container.removeEventListener('scroll', handleScroll); + } + }; + }, [streamsByAddon, selectedAddon]); + const scrollToTop = () => { - if (streamsContainerRef?.current) { - streamsContainerRef.current.scrollTo(0, 0); + if (streamsContainerRef.current) { + streamsContainerRef.current.scroll({ + top: 0, + behavior: 'smooth' + }); } }; return ( @@ -128,6 +154,10 @@ const StreamsList = ({ className, video, ...props }) => { null } +