import { FolderFill, FolderSymlinkFill, FileEarmark, FiletypeExe, FileEarmarkBinary, } from "react-bootstrap-icons"; import { ScrollArea } from "@/components/ui/scroll-area"; import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuTrigger, ContextMenuSeparator, ContextMenuLabel, } from "@/components/ui/context-menu"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip"; export enum FolderElementType { Folder = 0, File, } export interface FolderElement { name: string; type: FolderElementType; } type ClickHandler = (element: FolderElement) => void; type CreateFolderHandler = () => void; type RemoveElementHandler = (element: FolderElement) => void; type RenameElementHandler = (element: FolderElement) => void; type AddFilesHandler = () => void; export interface FolderProps { elements: FolderElement[]; clickHandler: ClickHandler; createFolderHandler: CreateFolderHandler; removeElementHandler: RemoveElementHandler; renameElementHandler: RenameElementHandler; addFilesHandler: AddFilesHandler; } function elementComparator(e1: FolderElement, e2: FolderElement) { if (e1.type != e2.type) { return e1.type - e2.type; } return e1.name.localeCompare(e2.name); } function getIcon(element: FolderElement, className: string = "") { switch (element.type) { case FolderElementType.File: if (element.name.endsWith(".dll")) { return ; } if (element.name.endsWith(".exe")) { return ; } return ; case FolderElementType.Folder: return element.name == ".." ? ( ) : ( ); default: return <>; } } function renderIcon(element: FolderElement) { let className = "w-6 h-6 flex-1"; return getIcon(element, className); } function renderElement(element: FolderElement, clickHandler: ClickHandler) { return (
clickHandler(element)} className="folder-element select-none flex flex-col gap-2 items-center text-center text-xs p-2 m-2 w-25 h-18 rounded-lg border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50" > {renderIcon(element)} {element.name}
); } function renderElementWithContext(element: FolderElement, props: FolderProps) { if (element.name == "..") { return renderElement(element, props.clickHandler); } return ( {renderElement(element, props.clickHandler)}

{element.name}

{element.name} props.renameElementHandler(element)}> Rename props.removeElementHandler(element)}> Delete
); } function renderElementWrapper(element: FolderElement, props: FolderProps) { return (
{renderElementWithContext(element, props)}
); } export function Folder(props: FolderProps) { return (
{props.elements .sort(elementComparator) .map((e) => renderElementWrapper(e, props))}
Create new Folder Add Files
); }