DocSpace-buildtools/packages/asc-web-components/submenu/index.js

130 lines
3.9 KiB
JavaScript
Raw Normal View History

2022-02-04 10:21:10 +00:00
import PropTypes from "prop-types";
import React, { useEffect, useRef, useState } from "react";
2022-02-28 13:11:44 +00:00
2022-03-01 11:45:14 +00:00
import Text from "../text";
import { countAutoFocus, countAutoOffset } from "./autoOffset";
2022-02-04 10:21:10 +00:00
import {
StyledSubmenu,
StyledSubmenuBottomLine,
StyledSubmenuContentWrapper,
StyledSubmenuItem,
StyledSubmenuItemLabel,
StyledSubmenuItems,
StyledSubmenuItemText,
} from "./styled-submenu";
2022-04-19 07:32:37 +00:00
import LoaderSubmenu from "./loader";
2022-02-04 10:21:10 +00:00
2022-04-19 07:32:37 +00:00
const Submenu = ({ data, startSelect = 0, onSelect, isLoading, ...rest }) => {
2022-02-04 10:21:10 +00:00
if (!data) return null;
const [currentItem, setCurrentItem] = useState(
data[startSelect] || startSelect || null
);
2022-03-01 11:45:14 +00:00
const submenuItemsRef = useRef();
2022-02-07 09:39:57 +00:00
const selectSubmenuItem = (e) => {
const item = data.find((el) => el.id === e.currentTarget.id);
2022-02-04 10:21:10 +00:00
if (item) setCurrentItem(item);
2022-03-01 11:45:14 +00:00
const offset = countAutoFocus(item.name, data, submenuItemsRef);
2022-02-17 22:59:46 +00:00
submenuItemsRef.current.scrollLeft += offset;
onSelect && onSelect(item);
2022-03-01 11:45:14 +00:00
};
useEffect(() => {
2022-02-17 22:59:46 +00:00
if (!submenuItemsRef.current) return;
let isDown = false;
let startX;
let scrollLeft;
2022-02-28 14:06:56 +00:00
const mouseDown = (e) => {
2022-02-17 22:59:46 +00:00
e.preventDefault();
isDown = true;
2022-02-17 22:59:46 +00:00
startX = e.pageX - submenuItemsRef.current.offsetLeft;
scrollLeft = submenuItemsRef.current.scrollLeft;
2022-02-28 14:06:56 +00:00
};
2022-02-28 14:06:56 +00:00
const mouseMove = (e) => {
if (!isDown) return;
e.preventDefault();
2022-02-17 22:59:46 +00:00
const x = e.pageX - submenuItemsRef.current.offsetLeft;
const walk = x - startX;
2022-02-17 22:59:46 +00:00
submenuItemsRef.current.scrollLeft = scrollLeft - walk;
2022-02-28 14:06:56 +00:00
};
2022-02-28 14:06:56 +00:00
const mouseUp = () => {
2022-02-17 22:59:46 +00:00
const offset = countAutoOffset(data, submenuItemsRef);
submenuItemsRef.current.scrollLeft += offset;
isDown = false;
2022-02-28 14:06:56 +00:00
};
2022-02-28 14:55:18 +00:00
const mouseLeave = () => (isDown = false);
2022-02-28 14:06:56 +00:00
submenuItemsRef.current.addEventListener("mousedown", mouseDown);
submenuItemsRef.current.addEventListener("mousemove", mouseMove);
submenuItemsRef.current.addEventListener("mouseup", mouseUp);
submenuItemsRef.current.addEventListener("mouseleave", mouseLeave);
return () => {
2022-02-28 14:58:59 +00:00
submenuItemsRef.current?.removeEventListener("mousedown", mouseDown);
submenuItemsRef.current?.removeEventListener("mousemove", mouseMove);
submenuItemsRef.current?.removeEventListener("mouseup", mouseUp);
submenuItemsRef.current?.removeEventListener("mouseleave", mouseLeave);
2022-02-28 14:06:56 +00:00
};
2022-02-17 22:59:46 +00:00
}, [submenuItemsRef]);
2022-02-04 10:21:10 +00:00
return (
2022-02-07 09:39:57 +00:00
<StyledSubmenu {...rest}>
2022-04-19 07:32:37 +00:00
{isLoading ? (
<LoaderSubmenu />
) : (
<>
<div className="sticky">
<StyledSubmenuItems ref={submenuItemsRef} role="list">
{data.map((d) => {
const isActive = d.id === currentItem.id;
return (
<StyledSubmenuItem
key={d.id}
id={d.id}
onClick={selectSubmenuItem}
>
<StyledSubmenuItemText>
<Text
color={isActive ? "#316DAA" : "#657077"}
fontSize="13px"
fontWeight="600"
truncate={false}
>
{d.name}
</Text>
</StyledSubmenuItemText>
<StyledSubmenuItemLabel
color={isActive ? "#316DAA" : "none"}
/>
</StyledSubmenuItem>
);
})}
</StyledSubmenuItems>
<StyledSubmenuBottomLine />
</div>
<div className="sticky-indent"></div>
2022-04-19 07:32:37 +00:00
</>
)}
2022-02-04 10:21:10 +00:00
<StyledSubmenuContentWrapper>
{currentItem.content}
</StyledSubmenuContentWrapper>
</StyledSubmenu>
);
};
Submenu.propTypes = {
data: PropTypes.arrayOf(PropTypes.object.isRequired).isRequired,
startSelect: PropTypes.oneOfType([PropTypes.object, PropTypes.number]),
onSelect: PropTypes.func,
2022-04-19 07:32:37 +00:00
isLoading: PropTypes.bool,
2022-02-04 10:21:10 +00:00
};
export default Submenu;