"use client"; import React from 'react'; import { ChevronRight, ChevronDown, FileIcon, FolderIcon, Plus, FolderPlus } from 'lucide-react'; import { useEditorStore, FileNode } from '@/store/editor-store'; import { cn, getFileIcon, getPlatformIcon } from '@/lib/utils'; export function FileTree() { const { files, openFile, moveFile } = useEditorStore(); const [expandedFolders, setExpandedFolders] = React.useState>( new Set(['roblox', 'web', 'mobile', 'desktop', 'shared']) ); const toggleFolder = (folderId: string) => { setExpandedFolders(prev => { const next = new Set(prev); if (next.has(folderId)) { next.delete(folderId); } else { next.add(folderId); } return next; }); }; const renderNode = (node: FileNode, depth: number = 0) => { const isExpanded = expandedFolders.has(node.id); const isFolder = node.type === 'folder'; return (
e.dataTransfer.setData('fileId', node.id)} onDrop={e => { e.preventDefault(); const fileId = e.dataTransfer.getData('fileId'); if (fileId && fileId !== node.id && isFolder) { moveFile(fileId, node.id); } }} onDragOver={e => isFolder && e.preventDefault()}>
isFolder ? toggleFolder(node.id) : openFile(node)} > {isFolder && ( {isExpanded ? : } )} {!isFolder && } {isFolder ? (isExpanded ? '📂' : '📁') : getFileIcon(node.name)} {node.name} {node.platform && ( {getPlatformIcon(node.platform)} )}
{isFolder && isExpanded && node.children && (
{node.children.map(child => renderNode(child, depth + 1))}
)}
); }; return (
Explorer
PROJECT
{files.map((node: any) => renderNode(node))}
); }