import { Avatar, MenuItem, Select, SelectChangeEvent, Typography, useMediaQuery, useTheme, } from "@mui/material"; import Box from "@mui/material/Box"; import * as React from "react"; import { FC, useCallback, useEffect, useMemo, useRef, useState } from "react"; import "./CustomSelect.css"; import arrow_down from "../../assets/icons/arrow_down.svg"; import { getUsers, PaginationRequest, User } from "@api/integration"; type CustomSelectProps = { selectedItem: string | null; setSelectedItem: (value: string | null) => void; type?: string; }; export const CustomSelect: FC = ({ selectedItem, setSelectedItem, type, }) => { const theme = useTheme(); const isMobile = useMediaQuery(theme.breakpoints.down(600)); const [opened, setOpened] = useState(false); const [currentValue, setCurrentValue] = useState(selectedItem); const [users, setUsers] = useState([]); const [isLoading, setIsLoading] = useState(false); const [page, setPage] = useState(1); const [hasMoreItems, setHasMoreItems] = useState(true); const SIZE = 25; const ref = useRef(null); const selectWidth = ref.current ? ref.current.offsetWidth : undefined; const [savedValue, setSavedValue] = useState(null); const [userName, setUserName] = useState(""); const onSelectItem = useCallback( (event: SelectChangeEvent) => { const newValue = event.target.value.toString(); const selectedUser = users.find((user) => user.amoUserID == Number(newValue)); setUserName(selectedUser.name) if (selectedUser) { //для сохранения ID выбранного пользователя в стейт или конфиг... setSavedValue(selectedUser.id); } setCurrentValue(newValue); setSelectedItem(newValue); }, [setSelectedItem, setCurrentValue, setSavedValue, users], ); const toggleOpened = useCallback(() => { setOpened((isOpened) => !isOpened); }, []); const handleScroll = (e: React.UIEvent) => { const scrollHeight = e.currentTarget.scrollHeight; const scrollTop = e.currentTarget.scrollTop; const clientHeight = e.currentTarget.clientHeight; const scrolledToBottom = scrollTop / (scrollHeight - clientHeight) > 0.9; if (scrolledToBottom && !isLoading && hasMoreItems) { setPage((prevPage) => prevPage + 1); } }; useEffect(() => { if (type === "typeUsers" && hasMoreItems) { setIsLoading(true); const pagination: PaginationRequest = { page: page, size: SIZE, }; getUsers(pagination).then(([response]) => { if (response && response.items !== null) { setUsers((prevItems) => [...prevItems, ...response.items]); if (response.items.length < SIZE) { setHasMoreItems(false); } } setIsLoading(false); }); } }, [page, type, hasMoreItems]); const menuItems = useMemo(() => { if (type === "typeUsers" && users && users.length !== 0) { return users.map((user) => ( {user.name} {user.email} {user.role} )); } return ( нет данных ); }, [users, type]); return ( ref.current?.click()} > {userName || "Выберите ответственного за сделку"} check ); };