import React, { useState, forwardRef, useRef, useEffect } from 'react'; import classnames from 'classnames'; import filter from 'lodash/filter'; import cloneDeep from 'lodash/cloneDeep'; import { useDrop } from 'react-dnd'; import { IconChevronRight, IconDots } from '@tabler/icons'; import Dropdown from 'components/Dropdown'; import { collectionClicked } from 'providers/ReduxStore/slices/collections'; import { moveItemToRootOfCollection } from 'providers/ReduxStore/slices/collections/actions'; import { useDispatch } from 'react-redux'; import NewRequest from 'components/Sidebar/NewRequest'; import NewFolder from 'components/Sidebar/NewFolder'; import CollectionItem from './CollectionItem'; import RemoveCollection from './RemoveCollection'; import RunCollectionItem from './CollectionItem/RunCollectionItem'; import { doesCollectionHaveItemsMatchingSearchText } from 'utils/collections/search'; import { isItemAFolder, isItemARequest, transformCollectionToSaveToIdb } from 'utils/collections'; import exportCollection from 'utils/collections/export'; import RenameCollection from './RenameCollection'; import StyledWrapper from './StyledWrapper'; const Collection = ({ collection, searchText }) => { const [showNewFolderModal, setShowNewFolderModal] = useState(false); const [showNewRequestModal, setShowNewRequestModal] = useState(false); const [showRenameCollectionModal, setShowRenameCollectionModal] = useState(false); const [showRemoveCollectionModal, setShowRemoveCollectionModal] = useState(false); const [showRunCollectionModal, setShowRunCollectionModal] = useState(false); const [collectionIsCollapsed, setCollectionIsCollapsed] = useState(collection.collapsed); const dispatch = useDispatch(); const menuDropdownTippyRef = useRef(); const onMenuDropdownCreate = (ref) => (menuDropdownTippyRef.current = ref); const MenuIcon = forwardRef((props, ref) => { return (
); }); useEffect(() => { if (searchText && searchText.length) { setCollectionIsCollapsed(false); } else { setCollectionIsCollapsed(collection.collapsed); } }, [searchText, collection]); const iconClassName = classnames({ 'rotate-90': !collectionIsCollapsed }); const handleClick = (event) => { dispatch(collectionClicked(collection.uid)); }; const handleExportClick = () => { const collectionCopy = cloneDeep(collection); exportCollection(transformCollectionToSaveToIdb(collectionCopy)); }; const [{ isOver }, drop] = useDrop({ accept: `COLLECTION_ITEM_${collection.uid}`, drop: (draggedItem) => { dispatch(moveItemToRootOfCollection(collection.uid, draggedItem.uid)); }, canDrop: (draggedItem) => { // todo need to make sure that draggedItem belongs to the collection return true; }, collect: (monitor) => ({ isOver: monitor.isOver() }) }); if (searchText && searchText.length) { if (!doesCollectionHaveItemsMatchingSearchText(collection, searchText)) { return null; } } // we need to sort request items by seq property const sortRequestItems = (items = []) => { return items.sort((a, b) => a.seq - b.seq); }; // we need to sort folder items by name alphabetically const sortFolderItems = (items = []) => { return items.sort((a, b) => a.name.localeCompare(b.name)); }; const requestItems = sortRequestItems(filter(collection.items, (i) => isItemARequest(i))); const folderItems = sortFolderItems(filter(collection.items, (i) => isItemAFolder(i))); return ( {showNewRequestModal && setShowNewRequestModal(false)} />} {showNewFolderModal && setShowNewFolderModal(false)} />} {showRenameCollectionModal && ( setShowRenameCollectionModal(false)} /> )} {showRemoveCollectionModal && ( setShowRemoveCollectionModal(false)} /> )} {showRunCollectionModal && ( setShowRunCollectionModal(false)} /> )}
} placement="bottom-start">
{ menuDropdownTippyRef.current.hide(); setShowNewRequestModal(true); }} > New Request
{ menuDropdownTippyRef.current.hide(); setShowNewFolderModal(true); }} > New Folder
{ menuDropdownTippyRef.current.hide(); setShowRunCollectionModal(true); }} > Run
{ menuDropdownTippyRef.current.hide(); setShowRenameCollectionModal(true); }} > Rename
{ menuDropdownTippyRef.current.hide(); handleExportClick(true); }} > Export
{ menuDropdownTippyRef.current.hide(); setShowRemoveCollectionModal(true); }} > Remove
{!collectionIsCollapsed ? (
{folderItems && folderItems.length ? folderItems.map((i) => { return ; }) : null} {requestItems && requestItems.length ? requestItems.map((i) => { return ; }) : null}
) : null}
); }; export default Collection;