'use client'; import { useEffect, useState } from 'react'; import clsx from 'clsx'; import { MiniButton } from '@/components/control'; import { IconFolder, IconFolderClosed, IconFolderEmpty, IconFolderOpened } from '@/components/icons'; import { type Styling } from '@/components/props'; import { cn } from '@/components/utils'; import { useFolders } from '../backend/use-folders'; import { labelFolderNode } from '../labels'; import { type FolderNode } from '../models/folder-tree'; interface SelectLocationProps extends Styling { value: string; onClick: (event: React.MouseEvent, target: FolderNode) => void; prefix: string; dense?: boolean; } export function SelectLocation({ value, dense, prefix, onClick, className, style }: SelectLocationProps) { const { folders } = useFolders(); const activeNode = folders.at(value); const items = folders.getTree(); const [folded, setFolded] = useState(items); useEffect(() => { setFolded(items.filter(item => item !== activeNode && !activeNode?.hasPredecessor(item))); }, [items, activeNode]); function onFoldItem(target: FolderNode, showChildren: boolean) { setFolded(prev => items.filter(item => { if (item === target) { return !showChildren; } if (!showChildren && item.hasPredecessor(target)) { return true; } else { return prev.includes(item); } }) ); } function handleClickFold(event: React.MouseEvent, target: FolderNode, showChildren: boolean) { event.preventDefault(); event.stopPropagation(); onFoldItem(target, showChildren); } return (
{items.map((item, index) => !item.parent || !folded.includes(item.parent) ? (
5 ? 5 : item.rank) * 0.5 + 0.5}rem` }} onClick={event => onClick(event, item)} > {item.children.size > 0 ? ( ) : ( ) ) : ( ) } aria-label='Отображение вложенных папок' onClick={event => handleClickFold(event, item, folded.includes(item))} /> ) : (
{item.filesInside ? ( ) : ( )}
)}
{labelFolderNode(item)}
) : null )}
); }