Skip to content

Commit 2e56fbd

Browse files
ZeeshanTambolioliviertassinari
andauthoredJul 25, 2023
[Tabs] Refactor IntersectionObserver logic (#38133)
Co-authored-by: Olivier Tassinari <olivier.tassinari@gmail.com>
1 parent 1140095 commit 2e56fbd

File tree

1 file changed

+22
-34
lines changed
  • packages/mui-material/src/Tabs

1 file changed

+22
-34
lines changed
 

‎packages/mui-material/src/Tabs/Tabs.js

+22-34
Original file line numberDiff line numberDiff line change
@@ -604,53 +604,41 @@ const Tabs = React.forwardRef(function Tabs(inProps, ref) {
604604
* Using IntersectionObserver on first and last Tabs.
605605
*/
606606
React.useEffect(() => {
607-
let firstObserver;
608-
let lastObserver;
609607
const tabListChildren = Array.from(tabListRef.current.children);
610608
const length = tabListChildren.length;
611-
const firstTab = tabListChildren[0];
612-
const lastTab = tabListChildren[length - 1];
613-
const threshold = 0.99;
614-
const observerOptions = {
615-
root: tabsRef.current,
616-
threshold,
617-
};
618-
619-
const handleScrollButtonStart = (entries) => {
620-
let display = false;
621-
entries.forEach(({ isIntersecting }) => {
622-
display = !isIntersecting;
623-
});
624-
setDisplayStartScroll(display);
625-
};
626-
627-
const handleScrollButtonEnd = (entries) => {
628-
let display = false;
629-
entries.forEach(({ isIntersecting }) => {
630-
display = !isIntersecting;
631-
});
632-
setDisplayEndScroll(display);
633-
};
634609

635610
if (
636611
typeof IntersectionObserver !== 'undefined' &&
637612
length > 0 &&
638613
scrollable &&
639614
scrollButtons !== false
640615
) {
641-
firstObserver = new IntersectionObserver(handleScrollButtonStart, observerOptions);
616+
const firstTab = tabListChildren[0];
617+
const lastTab = tabListChildren[length - 1];
618+
const observerOptions = {
619+
root: tabsRef.current,
620+
threshold: 0.99,
621+
};
622+
623+
const handleScrollButtonStart = (entries) => {
624+
setDisplayStartScroll(!entries[0].isIntersecting);
625+
};
626+
const firstObserver = new IntersectionObserver(handleScrollButtonStart, observerOptions);
642627
firstObserver.observe(firstTab);
643628

644-
if (length > 1) {
645-
lastObserver = new IntersectionObserver(handleScrollButtonEnd, observerOptions);
646-
lastObserver.observe(lastTab);
647-
}
629+
const handleScrollButtonEnd = (entries) => {
630+
setDisplayEndScroll(!entries[0].isIntersecting);
631+
};
632+
const lastObserver = new IntersectionObserver(handleScrollButtonEnd, observerOptions);
633+
lastObserver.observe(lastTab);
634+
635+
return () => {
636+
firstObserver.disconnect();
637+
lastObserver.disconnect();
638+
};
648639
}
649640

650-
return () => {
651-
firstObserver?.disconnect();
652-
lastObserver?.disconnect();
653-
};
641+
return undefined;
654642
}, [scrollable, scrollButtons, updateScrollObserver, childrenProp?.length]);
655643

656644
React.useEffect(() => {

0 commit comments

Comments
 (0)
Please sign in to comment.