|
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; |
|
|