Skip to content

Commit

Permalink
Use resize observer hook in Tabs component
Browse files Browse the repository at this point in the history
  • Loading branch information
hbjORbj committed Aug 16, 2021
1 parent 38dafe7 commit 3f49153
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 25 deletions.
42 changes: 31 additions & 11 deletions packages/material-ui-unstyled/src/utils/useResizeObserver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,38 @@ interface Rect {
height: number;
}

export default function useResizeObserver(): [Rect | null, (elem: Element) => () => void] {
const [rect, setRect] = React.useState<Rect | null>(null);
const ref = React.useCallback((elem: Element) => {
if (!elem) return () => {};
const observer = new ResizeObserver((entries: ResizeObserverEntry[]) => {
const target = entries[0];
setRect(target.contentRect);
export default function useResizeObserver(
resizeItemRef: React.RefObject<Element | null>,
resizeHandler?: () => void,
observeChildren?: boolean,
): Rect[] | null {
const [items, setItems] = React.useState<Rect[] | null>(null);
const resizeObserverRef = React.useRef<ResizeObserver | null>(null);
const resizeHandlerRef = React.useRef<() => void>();
resizeHandlerRef.current = resizeHandler;

React.useEffect(() => {
resizeObserverRef.current = new ResizeObserver((entries: ResizeObserverEntry[]) => {
setItems(entries.map((entry) => entry.contentRect));
if (resizeHandlerRef.current) {
resizeHandlerRef.current();
}
});
observer.observe(elem);
if (resizeItemRef.current) {
if (observeChildren) {
Array.from(resizeItemRef.current.children).forEach((child) => {
resizeObserverRef.current?.observe(child);
});
} else {
resizeObserverRef.current?.observe(resizeItemRef.current);
}
}

return () => {
observer.unobserve(elem);
if (resizeObserverRef.current) {
resizeObserverRef.current.disconnect();
}
};
}, []);
return [rect, ref];
}, [resizeItemRef, observeChildren]);
return items;
}
24 changes: 10 additions & 14 deletions packages/material-ui/src/Tabs/Tabs.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@ import { isFragment } from 'react-is';
import PropTypes from 'prop-types';
import clsx from 'clsx';
import { refType } from '@material-ui/utils';
import { unstable_composeClasses as composeClasses } from '@material-ui/unstyled';
import {
unstable_composeClasses as composeClasses,
unstable_useResizeObserver as useResizeObserver,
} from '@material-ui/unstyled';
import styled from '../styles/styled';
import useThemeProps from '../styles/useThemeProps';
import useTheme from '../styles/useTheme';
import debounce from '../utils/debounce';
import ownerWindow from '../utils/ownerWindow';
import { getNormalizedScrollLeft, detectScrollType } from '../utils/scrollLeft';
import animate from '../internal/animate';
import ScrollbarSize from './ScrollbarSize';
Expand Down Expand Up @@ -554,19 +556,12 @@ const Tabs = React.forwardRef(function Tabs(inProps, ref) {
}
});

React.useEffect(() => {
const handleResize = debounce(() => {
updateIndicatorState();
updateScrollButtonState();
});
const handleResize = debounce(() => {
updateIndicatorState();
updateScrollButtonState();
});

const win = ownerWindow(tabsRef.current);
win.addEventListener('resize', handleResize);
return () => {
handleResize.clear();
win.removeEventListener('resize', handleResize);
};
}, [updateIndicatorState, updateScrollButtonState]);
useResizeObserver(tabListRef, handleResize, true);

const handleTabsScroll = React.useMemo(
() =>
Expand Down Expand Up @@ -619,6 +614,7 @@ const Tabs = React.forwardRef(function Tabs(inProps, ref) {

let childIndex = 0;
const children = React.Children.map(childrenProp, (child) => {

if (!React.isValidElement(child)) {
return null;
}
Expand Down

0 comments on commit 3f49153

Please sign in to comment.