import { useLocal, type LocalFile } from "@/context/local" import { Tooltip } from "@opencode-ai/ui" import { Collapsible, FileIcon } from "@/ui" import { For, Match, Switch, Show, type ComponentProps, type ParentProps } from "solid-js" import { Dynamic } from "solid-js/web" export default function FileTree(props: { path: string class?: string nodeClass?: string level?: number onFileClick?: (file: LocalFile) => void }) { const local = useLocal() const level = props.level ?? 0 const Node = (p: ParentProps & ComponentProps<"div"> & { node: LocalFile; as?: "div" | "button" }) => ( { const evt = e as globalThis.DragEvent evt.dataTransfer!.effectAllowed = "copy" evt.dataTransfer!.setData("text/plain", `file:${p.node.path}`) // Create custom drag image without margins const dragImage = document.createElement("div") dragImage.className = "flex items-center gap-x-2 px-2 py-1 bg-background-element rounded-md border border-border-1" dragImage.style.position = "absolute" dragImage.style.top = "-1000px" // Copy only the icon and text content without padding const icon = e.currentTarget.querySelector("svg") const text = e.currentTarget.querySelector("span") if (icon && text) { dragImage.innerHTML = icon.outerHTML + text.outerHTML } document.body.appendChild(dragImage) evt.dataTransfer!.setDragImage(dragImage, 0, 12) setTimeout(() => document.body.removeChild(dragImage), 0) }} {...p} > {p.children} {p.node.name} ) return (
{(node) => ( (open ? local.file.expand(node.path) : local.file.collapse(node.path))} > props.onFileClick?.(node)}>
)}
) }