import { For, Show, type Accessor, type Component, type JSX } from "solid-js" import type { FileNode } from "@opencode-ai/sdk/v2/client" import { RefreshCw } from "lucide-solid" import { MonacoFileViewer } from "../../../../file-viewer/monaco-file-viewer" import SplitFilePanel from "../components/SplitFilePanel" interface FilesTabProps { t: (key: string, vars?: Record) => string browserPath: Accessor browserEntries: Accessor browserLoading: Accessor browserError: Accessor browserSelectedPath: Accessor browserSelectedContent: Accessor browserSelectedLoading: Accessor browserSelectedError: Accessor parentPath: Accessor scopeKey: Accessor onLoadEntries: (path: string) => void onOpenFile: (path: string) => void onRefresh: () => void listOpen: Accessor onToggleList: () => void splitWidth: Accessor onResizeMouseDown: (event: MouseEvent) => void onResizeTouchStart: (event: TouchEvent) => void isPhoneLayout: Accessor } const FilesTab: Component = (props) => { const renderContent = (): JSX.Element => { const entriesValue = props.browserEntries() const entries = entriesValue || [] const sorted = [...entries].sort((a, b) => { const aDir = a.type === "directory" ? 0 : 1 const bDir = b.type === "directory" ? 0 : 1 if (aDir !== bDir) return aDir - bDir return String(a.name || "").localeCompare(String(b.name || "")) }) const parent = props.parentPath() const headerDisplayedPath = () => props.browserSelectedPath() || props.browserPath() const emptyViewerMessage = () => { if (props.browserLoading() && entriesValue === null) return "Loading files..." return "Select a file to preview" } const renderViewer = () => (
{emptyViewerMessage()}
} > {(payload) => ( )} } > {(err) => (
{err()}
)} } >
Loading…
) const renderList = () => ( <> {(p) => (
props.onLoadEntries(p())}>
..
)}
Loading files...
{(item) => (
{ if (item.type === "directory") { props.onLoadEntries(item.path) return } props.onOpenFile(item.path) }} title={item.path} >
{item.name}
{item.type}
)}
) return (
{headerDisplayedPath()} Loading… {(err) => {err()}}
} list={{ panel: renderList, overlay: renderList }} viewer={renderViewer()} listOpen={props.listOpen()} onToggleList={props.onToggleList} splitWidth={props.splitWidth()} onResizeMouseDown={props.onResizeMouseDown} onResizeTouchStart={props.onResizeTouchStart} isPhoneLayout={props.isPhoneLayout()} overlayAriaLabel="Files" /> ) } return <>{renderContent()} } export default FilesTab