import { memo, useEffect, useRef } from "react"; import { useTranslation } from "react-i18next"; import useToggle from "../../hooks/useToggle"; import Icon from "../Icon"; import "../../less/common/selector.less"; interface SelectorItem { text: string; value: string; } interface Props { className?: string; value: string; dataSource: SelectorItem[]; handleValueChanged?: (value: string) => void; } const nullItem = { text: "common.select", value: "", }; const Selector: React.FC = (props: Props) => { const { className, dataSource, handleValueChanged, value } = props; const { t } = useTranslation(); const [showSelector, toggleSelectorStatus] = useToggle(false); const selectorElRef = useRef(null); let currentItem = { text: t(nullItem.text), value: nullItem.value }; for (const d of dataSource) { if (d.value === value) { currentItem = d; break; } } useEffect(() => { if (showSelector) { const handleClickOutside = (event: MouseEvent) => { if (!selectorElRef.current?.contains(event.target as Node)) { toggleSelectorStatus(false); } }; window.addEventListener("click", handleClickOutside, { capture: true, once: true, }); } }, [showSelector]); const handleItemClick = (item: SelectorItem) => { if (handleValueChanged) { handleValueChanged(item.value); } toggleSelectorStatus(false); }; const handleCurrentValueClick = (event: React.MouseEvent) => { event.stopPropagation(); toggleSelectorStatus(); }; return (
{currentItem.text}
{dataSource.length > 0 ? ( dataSource.map((d) => { return (
{ handleItemClick(d); }} > {d.text}
); }) ) : (

{t("common.null")}

)}
); }; export default memo(Selector);