import React from "react"; import PropTypes from "prop-types"; import Header from "./sub-components/Header"; import Body from "./sub-components/Body"; import Footer from "./sub-components/Footer"; import { StyledSelector } from "./StyledSelector"; const Selector = ({ id, className, style, headerLabel, onBackClick, searchPlaceholder, searchValue, onSearch, onClearSearch, items, onSelect, isMultiSelect, selectedItems, acceptButtonLabel, onAccept, withSelectAll, selectAllLabel, selectAllIcon, onSelectAll, withAccessRights, accessRights, selectedAccessRight, onAccessRightsChange, withCancelButton, cancelButtonLabel, onCancel, emptyScreenImage, emptyScreenHeader, emptyScreenDescription, searchEmptyScreenImage, searchEmptyScreenHeader, searchEmptyScreenDescription, hasNextPage, isNextPageLoading, loadNextPage, totalItems, isLoading, searchLoader, rowLoader, }) => { const [footerVisible, setFooterVisible] = React.useState(false); const [isSearch, setIsSearch] = React.useState(false); const [renderedItems, setRenderedItems] = React.useState([]); const [newSelectedItems, setNewSelectedItems] = React.useState([]); const [selectedAccess, setSelectedAccess] = React.useState({}); const onBackClickAction = React.useCallback(() => { onBackClick && onBackClick(); }, [onBackClick]); const onSearchAction = React.useCallback( (value) => { onSearch && onSearch(value); setIsSearch(true); }, [onSearch] ); const onClearSearchAction = React.useCallback(() => { onClearSearch && onClearSearch(); setIsSearch(false); }, [onClearSearch]); const onSelectAction = (item) => { onSelect && onSelect({ id: item.id, email: item.email, avatar: item.avatar, icon: item.icon, label: item.label, }); if (isMultiSelect) { setRenderedItems((value) => { const idx = value.findIndex((x) => item.id === x.id); const newValue = value.map((item) => ({ ...item })); if (idx === -1) return newValue; newValue[idx].isSelected = !value[idx].isSelected; return newValue; }); if (item.isSelected) { setNewSelectedItems((value) => { const newValue = value .filter((x) => x.id !== item.id) .map((x) => ({ ...x })); compareSelectedItems(newValue); return newValue; }); } else { setNewSelectedItems((value) => { value.push({ id: item.id, email: item.email, avatar: item.avatar, icon: item.icon, label: item.label, }); compareSelectedItems(value); return value; }); } } else { setRenderedItems((value) => { const idx = value.findIndex((x) => item.id === x.id); const newValue = value.map((item) => ({ ...item, isSelected: false })); if (idx === -1) return newValue; newValue[idx].isSelected = !item.isSelected; return newValue; }); const newItem = { id: item.id, email: item.email, avatar: item.avatar, icon: item.icon, label: item.label, }; if (item.isSelected) { setNewSelectedItems([]); compareSelectedItems([]); } else { setNewSelectedItems([newItem]); compareSelectedItems([newItem]); } } }; const onSelectAllAction = React.useCallback(() => { onSelectAll && onSelectAll(); if (newSelectedItems.length === 0) { const cloneItems = items.map((x) => ({ ...x })); const cloneRenderedItems = items.map((x) => ({ ...x, isSelected: true })); setRenderedItems(cloneRenderedItems); setNewSelectedItems(cloneItems); compareSelectedItems(cloneItems); } else { const cloneRenderedItems = items.map((x) => ({ ...x, isSelected: false, })); setRenderedItems(cloneRenderedItems); setNewSelectedItems([]); compareSelectedItems([]); } }, [items, newSelectedItems]); const onAcceptAction = React.useCallback(() => { onAccept && onAccept(newSelectedItems, selectedAccess); }, [newSelectedItems, selectedAccess]); const onCancelAction = React.useCallback(() => { onCancel && onCancel(); }, [onCancel]); const onChangeAccessRightsAction = React.useCallback( (access) => { setSelectedAccess({ ...access }); onAccessRightsChange && onAccessRightsChange(access); }, [onAccessRightsChange] ); const compareSelectedItems = React.useCallback( (newList) => { let isEqual = true; if (selectedItems.length !== newList.length) { return setFooterVisible(true); } if (newList.length === 0 && selectedItems.length === 0) { return setFooterVisible(false); } newList.forEach((item) => { isEqual = selectedItems.some((x) => x.id === item.id); }); return setFooterVisible(!isEqual); }, [selectedItems] ); const loadMoreItems = React.useCallback( (startIndex) => { !isNextPageLoading && loadNextPage && loadNextPage(startIndex - 1); }, [isNextPageLoading, loadNextPage] ); React.useEffect(() => { setSelectedAccess({ ...selectedAccessRight }); }, [selectedAccessRight]); React.useEffect(() => { if (items && selectedItems) { if (selectedItems.length === 0 || !isMultiSelect) { const cloneItems = items.map((x) => ({ ...x, isSelected: false })); return setRenderedItems(cloneItems); } const newItems = items.map((item) => { const { id } = item; const isSelected = selectedItems.some( (selectedItem) => selectedItem.id === id ); return { ...item, isSelected }; }); const cloneSelectedItems = selectedItems.map((item) => ({ ...item })); setRenderedItems(newItems); setNewSelectedItems(cloneSelectedItems); compareSelectedItems(cloneSelectedItems); } }, [items, selectedItems, isMultiSelect, compareSelectedItems]); return (
{footerVisible && (