feat: Introduce FoldersManager and useFolderData to manage and display folder contents, including documents and subfolders.

This commit is contained in:
2025-12-06 22:06:53 +01:00
parent 9b79115170
commit c88c3c13d6
8 changed files with 363 additions and 51 deletions
@@ -15,7 +15,7 @@ import SelectionSummary from './SelectionSummary';
import { useAppState } from '../../../lib/store/appState';
import { useWorkspaceSelectionContext } from '../../../app/WorkspaceSelectionContext';
import type { DocumentId } from '../../../types/identifiers';
import type { FolderTreeNode } from '../../../lib/api/apiTypes';
import type { FolderTreeNode, FolderTreeResponseItem } from '../../../lib/api/apiTypes';
type NullableDocumentId = DocumentId | null;
@@ -251,31 +251,14 @@ const SelectionFloatingActions: React.FC<SelectionFloatingActionsProps> = ({
try {
const data = await getFolderTree();
// Convert flat list to tree
const nodeMap = new Map<string, FolderTreeNode>();
data.forEach((item) => {
nodeMap.set(item.id, {
const traverse = (items: FolderTreeResponseItem[]): FolderTreeNode[] => {
return items.map(item => ({
...item,
children: [],
} as FolderTreeNode);
});
const roots: FolderTreeNode[] = [];
data.forEach((item) => {
const node = nodeMap.get(item.id);
if (!node) return;
if (item.children && item.children.length > 0) {
node.children = item.children
.map((id) => nodeMap.get(id))
.filter((n): n is FolderTreeNode => Boolean(n));
}
if (!item.parent_id) {
roots.push(node);
}
});
children: item.children ? traverse(item.children) : [],
}));
};
const roots = traverse(data);
setRemoteFolderTree(roots);
return roots;
} catch (error) {