Spaces:
Paused
Paused
| import { | |
| IconCaretDown, | |
| IconCaretRight, | |
| IconCheck, | |
| IconPencil, | |
| IconTrash, | |
| IconX, | |
| } from '@tabler/icons-react'; | |
| import { | |
| KeyboardEvent, | |
| ReactElement, | |
| useContext, | |
| useEffect, | |
| useState, | |
| } from 'react'; | |
| import { FolderInterface } from '@/types/folder'; | |
| import HomeContext from '@/pages/api/home/home.context'; | |
| import SidebarActionButton from '@/components/Buttons/SidebarActionButton'; | |
| interface Props { | |
| currentFolder: FolderInterface; | |
| searchTerm: string; | |
| handleDrop: (e: any, folder: FolderInterface) => void; | |
| folderComponent: (ReactElement | undefined)[]; | |
| } | |
| const Folder = ({ | |
| currentFolder, | |
| searchTerm, | |
| handleDrop, | |
| folderComponent, | |
| }: Props) => { | |
| const { handleDeleteFolder, handleUpdateFolder } = useContext(HomeContext); | |
| const [isDeleting, setIsDeleting] = useState(false); | |
| const [isRenaming, setIsRenaming] = useState(false); | |
| const [renameValue, setRenameValue] = useState(''); | |
| const [isOpen, setIsOpen] = useState(false); | |
| const handleEnterDown = (e: KeyboardEvent<HTMLDivElement>) => { | |
| if (e.key === 'Enter') { | |
| e.preventDefault(); | |
| handleRename(); | |
| } | |
| }; | |
| const handleRename = () => { | |
| handleUpdateFolder(currentFolder.id, renameValue); | |
| setRenameValue(''); | |
| setIsRenaming(false); | |
| }; | |
| const dropHandler = (e: any) => { | |
| if (e.dataTransfer) { | |
| setIsOpen(true); | |
| handleDrop(e, currentFolder); | |
| e.target.style.background = 'none'; | |
| } | |
| }; | |
| const allowDrop = (e: any) => { | |
| e.preventDefault(); | |
| }; | |
| const highlightDrop = (e: any) => { | |
| e.target.style.background = '#343541'; | |
| }; | |
| const removeHighlight = (e: any) => { | |
| e.target.style.background = 'none'; | |
| }; | |
| useEffect(() => { | |
| if (isRenaming) { | |
| setIsDeleting(false); | |
| } else if (isDeleting) { | |
| setIsRenaming(false); | |
| } | |
| }, [isRenaming, isDeleting]); | |
| useEffect(() => { | |
| if (searchTerm) { | |
| setIsOpen(true); | |
| } else { | |
| setIsOpen(false); | |
| } | |
| }, [searchTerm]); | |
| return ( | |
| <> | |
| <div className="relative flex items-center"> | |
| {isRenaming ? ( | |
| <div className="flex w-full items-center gap-3 bg-[#343541]/90 p-3"> | |
| {isOpen ? ( | |
| <IconCaretDown size={18} /> | |
| ) : ( | |
| <IconCaretRight size={18} /> | |
| )} | |
| <input | |
| className="mr-12 flex-1 overflow-hidden overflow-ellipsis border-neutral-400 bg-transparent text-left text-[12.5px] leading-3 text-white outline-none focus:border-neutral-100" | |
| type="text" | |
| value={renameValue} | |
| onChange={(e) => setRenameValue(e.target.value)} | |
| onKeyDown={handleEnterDown} | |
| autoFocus | |
| /> | |
| </div> | |
| ) : ( | |
| <button | |
| className={`flex w-full cursor-pointer items-center gap-3 rounded-lg p-3 text-sm transition-colors duration-200 hover:bg-[#343541]/90`} | |
| onClick={() => setIsOpen(!isOpen)} | |
| onDrop={(e) => dropHandler(e)} | |
| onDragOver={allowDrop} | |
| onDragEnter={highlightDrop} | |
| onDragLeave={removeHighlight} | |
| > | |
| {isOpen ? ( | |
| <IconCaretDown size={18} /> | |
| ) : ( | |
| <IconCaretRight size={18} /> | |
| )} | |
| <div className="relative max-h-5 flex-1 overflow-hidden text-ellipsis whitespace-nowrap break-all text-left text-[12.5px] leading-3"> | |
| {currentFolder.name} | |
| </div> | |
| </button> | |
| )} | |
| {(isDeleting || isRenaming) && ( | |
| <div className="absolute right-1 z-10 flex text-gray-300"> | |
| <SidebarActionButton | |
| handleClick={(e) => { | |
| e.stopPropagation(); | |
| if (isDeleting) { | |
| handleDeleteFolder(currentFolder.id); | |
| } else if (isRenaming) { | |
| handleRename(); | |
| } | |
| setIsDeleting(false); | |
| setIsRenaming(false); | |
| }} | |
| > | |
| <IconCheck size={18} /> | |
| </SidebarActionButton> | |
| <SidebarActionButton | |
| handleClick={(e) => { | |
| e.stopPropagation(); | |
| setIsDeleting(false); | |
| setIsRenaming(false); | |
| }} | |
| > | |
| <IconX size={18} /> | |
| </SidebarActionButton> | |
| </div> | |
| )} | |
| {!isDeleting && !isRenaming && ( | |
| <div className="absolute right-1 z-10 flex text-gray-300"> | |
| <SidebarActionButton | |
| handleClick={(e) => { | |
| e.stopPropagation(); | |
| setIsRenaming(true); | |
| setRenameValue(currentFolder.name); | |
| }} | |
| > | |
| <IconPencil size={18} /> | |
| </SidebarActionButton> | |
| <SidebarActionButton | |
| handleClick={(e) => { | |
| e.stopPropagation(); | |
| setIsDeleting(true); | |
| }} | |
| > | |
| <IconTrash size={18} /> | |
| </SidebarActionButton> | |
| </div> | |
| )} | |
| </div> | |
| {isOpen ? folderComponent : null} | |
| </> | |
| ); | |
| }; | |
| export default Folder; | |