feat: add frontend folder creation functionality.

This commit is contained in:
2025-12-12 01:51:33 +01:00
parent d281364aef
commit b10404f0f3
5 changed files with 191 additions and 83 deletions
@@ -3,12 +3,6 @@ import { useNavigate } from 'react-router-dom';
import type { DragEvent } from 'react';
import { useStatusToast } from '../../../lib/context/StatusToastContext';
import { hasFiles } from '../../../app/workspaceUtils';
import {
createFolder,
deleteFolder,
moveFolder as moveFolderRequest,
renameFolder as renameFolderRequest,
} from '../../../lib/api/apiClient';
import type { FolderId } from '../../../types/identifiers';
import type { MessageOptions } from '../../../types/documents';
@@ -40,7 +34,7 @@ import type {
import type FoldersManager from '../../FoldersManager';
interface UseFolderTreeActionsOptions {
folderState: Pick<FolderState, 'folderNodes' | 'selectedFolder' | 'setSelectedFolder' | 'setCreatingFolder'> & { foldersManager?: FoldersManager };
folderState: Pick<FolderState, 'folderNodes' | 'selectedFolder' | 'setSelectedFolder' | 'setCreatingFolder'> & { foldersManager: FoldersManager };
dragState: DragState;
actions: {
handleFileDrop: (dataTransfer: DataTransfer, folderId: FolderKey) => Promise<void> | void;
@@ -97,14 +91,8 @@ const useFolderTreeActions = ({
return;
}
const parent_id = targetKey === 'root' ? null : targetKey;
try {
await moveFolderRequest(folderId, parent_id);
if (foldersManager) {
foldersManager.refreshTree();
}
await foldersManager.move(folderId, targetKey);
if (selectedFolder === folderId) {
setSelectedFolder(folderId);
@@ -160,11 +148,7 @@ const useFolderTreeActions = ({
return false;
}
try {
await renameFolderRequest(folderId, trimmed);
if (foldersManager) {
foldersManager.ingest([{ id: folderId, name: trimmed }]);
}
await foldersManager.rename(folderId, trimmed);
showToast('Folder renamed.', 'success');
return true;
@@ -192,26 +176,12 @@ const useFolderTreeActions = ({
? (parentId === 'root' ? null : parentId)
: (selectedFolder === 'root' ? null : selectedFolder);
const payload = {
name: name.trim(),
parent_id: targetParentId,
};
setCreatingFolder(true);
let succeeded = false;
try {
const data = await createFolder(payload);
const folderData = (data as { folder?: { id?: FolderKey; name?: string; parent_id?: FolderKey | null; children?: FolderKey[] } }).folder;
if (!folderData?.id) {
throw new Error('Folder creation failed.');
}
showToast('Folder created.', 'success');
const folderData = await foldersManager.create(name.trim(), targetParentId);
if (foldersManager) {
// Ingest the new folder data immediately so it's available
foldersManager.ingest([folderData]);
// Force tree refresh to update structure
foldersManager.refreshTree();
}
showToast('Folder created.', 'success');
await selectFolder(folderData.id, { immediate: true });
succeeded = true;
@@ -247,12 +217,7 @@ const useFolderTreeActions = ({
}
try {
await deleteFolder(folderId);
if (foldersManager) {
foldersManager.remove([folderId]);
foldersManager.refreshTree();
}
await foldersManager.delete(folderId);
if (selectedFolder === folderId) {
// Fallback selection logic