monday-ui-react-core
Version:
Official monday.com UI resources for application development in React.js
45 lines (39 loc) • 1.54 kB
JSX
import React, { useRef, forwardRef, useState, useCallback } from "react";
import PropTypes from "prop-types";
import cx from "classnames";
import useMergeRefs from "../../../hooks/useMergeRefs";
import "./TabsContext.scss";
const TabsContext = forwardRef(({ className, id, activeTabId, children }, ref) => {
const componentRef = useRef(null);
const mergedRef = useMergeRefs({ refs: [ref, componentRef] });
const [previousActiveTab, setPreviousActiveTab] = useState(activeTabId);
const [activeTab, setActiveTab] = useState(activeTabId);
const onTabClick = useCallback((tabId) => {
setPreviousActiveTab(activeTab);
setActiveTab(tabId);
}, [setPreviousActiveTab, activeTab, setActiveTab]);
return (
<div ref={mergedRef} className={cx("tabs-context--wrapper", className)} id={id}>
{React.Children.map(children, child => {
if (child.type.isTabList) {
return React.cloneElement(child, { onTabChange: onTabClick });
} else if (child.type.isTabPanels) {
const animationDirection = previousActiveTab < activeTab ? "ltr" : "rtl";
return React.cloneElement(child, { activeTabId: activeTab, animationDirection });
}
return child;
})}
</div>
);
});
TabsContext.propTypes = {
className: PropTypes.string,
id: PropTypes.string,
activeTabId: PropTypes.number
};
TabsContext.defaultProps = {
className: "",
id: "",
activeTabId: 0
};
export default TabsContext;