import * as React from 'react'; import { useState, useMemo, useEffect } from 'react'; import { FolderIcon, ChevronRightIcon } from '@heroicons/react/24/solid'; import * as l10n from '@vscode/l10n'; import { LocalizationKey } from '../../../localization'; import { parseWinPath } from '../../../helpers/parseWinPath'; import { Page } from '../../models'; export interface IMoveFileDialogProps { page: Page; availableFolders: string[]; dismiss: () => void; trigger: (destinationFolder: string) => void; } interface FolderNode { name: string; path: string; children: FolderNode[]; level: number; } export const MoveFileDialog: React.FunctionComponent = ({ page, availableFolders, dismiss, trigger }: React.PropsWithChildren) => { const [selectedFolder, setSelectedFolder] = useState(''); const [expandedFolders, setExpandedFolders] = useState>(new Set()); // Build folder tree structure const folderTree = useMemo(() => { const root: FolderNode[] = []; const folderMap = new Map(); for (const folderPath of availableFolders) { const normalized = parseWinPath(folderPath).replace(/^\/+|\/+$/g, ''); const parts = normalized.split('/').filter(Boolean); let currentPath = ''; let currentLevel: FolderNode[] = root; for (let i = 0; i < parts.length; i++) { const part = parts[i]; const fullPath = currentPath ? `${currentPath}/${part}` : part; if (!folderMap.has(fullPath)) { const newNode: FolderNode = { name: part, path: fullPath, children: [], level: i }; folderMap.set(fullPath, newNode); currentLevel.push(newNode); } const node = folderMap.get(fullPath); if (node) { currentLevel = node.children; } currentPath = fullPath; } } return root; }, [availableFolders]); const toggleFolder = (folderPath: string) => { const newExpanded = new Set(expandedFolders); if (newExpanded.has(folderPath)) { newExpanded.delete(folderPath); } else { newExpanded.add(folderPath); } setExpandedFolders(newExpanded); }; const renderFolderNode = (node: FolderNode): React.ReactNode => { const isExpanded = expandedFolders.has(node.path); const isSelected = selectedFolder === node.path; const hasChildren = node.children.length > 0; const paddingLeft = node.level * 20; return (
setSelectedFolder(node.path)} > {hasChildren && ( )} {!hasChildren && } {node.name}
{hasChildren && isExpanded && (
{node.children.map((child) => renderFolderNode(child))}
)}
); }; const handleMove = () => { if (selectedFolder) { trigger(selectedFolder); } }; // Auto-expand folders by default (first level) useEffect(() => { const firstLevelFolders = folderTree.map(node => node.path); setExpandedFolders(new Set(firstLevelFolders)); }, [folderTree]); return (

Move File

Move {page.title} to a different folder

{folderTree.length > 0 ? ( folderTree.map((node) => renderFolderNode(node)) ) : (

No folders available

)}
); };