apiClient

This commit is contained in:
2025-11-22 15:30:08 +01:00
parent 530218a4b8
commit d3c76bc303
11 changed files with 319 additions and 169 deletions
@@ -1,6 +1,12 @@
import { useCallback, useMemo } from 'react';
import type { DragEvent } from 'react';
import { DEFAULT_FOLDER_NAME, hasFiles } from '../../app/appLayoutUtils';
import {
createFolder,
deleteFolder,
moveFolder as moveFolderRequest,
renameFolder as renameFolderRequest,
} from '../../lib/apiClient';
type FolderId = string | number;
type FolderKey = FolderId | 'root';
@@ -22,12 +28,6 @@ interface FolderContentsState {
[key: string]: unknown;
}
interface ApiClient {
patch: (url: string, data?: unknown) => Promise<any>;
post: (url: string, data?: unknown) => Promise<{ data: any }>;
delete: (url: string) => Promise<any>;
}
interface EnsureFolderOptions {
force?: boolean;
includeDocuments?: boolean;
@@ -53,7 +53,6 @@ interface FolderClickHandlers {
}
interface UseFolderTreeActionsOptions {
api: ApiClient;
token?: string | null;
folderNodes: Map<FolderKey, FolderNode>;
setFolderNodes: (updater: (prev: Map<FolderKey, FolderNode>) => Map<FolderKey, FolderNode>) => void;
@@ -84,7 +83,6 @@ interface UseFolderTreeActionsOptions {
}
const useFolderTreeActions = ({
api,
token,
folderNodes,
setFolderNodes,
@@ -129,7 +127,7 @@ const useFolderTreeActions = ({
const parent_id = targetKey === 'root' ? null : targetKey;
try {
await api.patch(`/folders/${folderId}`, { parent_id });
await moveFolderRequest(folderId, parent_id);
setFolderNodes((prev) => {
const next = new Map(prev);
@@ -202,7 +200,6 @@ const useFolderTreeActions = ({
}
},
[
api,
ensureFolderData,
folderNodes,
notifyApiError,
@@ -295,7 +292,7 @@ const useFolderTreeActions = ({
setLoading(true);
try {
await api.patch(`/folders/${folderId}`, { name: trimmed });
await renameFolderRequest(folderId, trimmed);
setFolderNodes((prev) => {
const next = new Map(prev);
@@ -331,7 +328,6 @@ const useFolderTreeActions = ({
}
},
[
api,
notifyApiError,
setCurrentFolder,
setFolderContents,
@@ -359,33 +355,37 @@ const useFolderTreeActions = ({
setCreatingFolder(true);
let succeeded = false;
try {
const { data } = await api.post('/folders', payload);
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.');
}
setStatusMessage('Folder created.', 'success');
setFolderNodes((prev) => {
const next = new Map(prev);
const parentId = payload.parent_id || 'root';
const parentId = folderData.parent_id ?? payload.parent_id ?? 'root';
const parentNode = next.get(parentId);
if (parentNode) {
next.set(parentId, {
...parentNode,
children: parentNode.children.concat([data.folder.id]),
children: parentNode.children.concat([folderData.id]),
loaded: true,
hasChildren: true,
});
}
next.set(data.folder.id, {
id: data.folder.id,
name: data.folder.name,
next.set(folderData.id, {
id: folderData.id,
name: folderData.name ?? payload.name,
parentId: parentId,
children: [],
children: folderData.children || [],
expanded: false,
loaded: false,
hasChildren: false,
hasChildren: Array.isArray(folderData.children) ? folderData.children.length > 0 : false,
});
return next;
});
await ensureFolderData(selectedFolder, { force: true, prefetchDepth: 1 });
await selectFolder(data.folder.id, { immediate: true });
await selectFolder(folderData.id, { immediate: true });
succeeded = true;
return true;
} catch (error) {
@@ -400,7 +400,6 @@ const useFolderTreeActions = ({
}
},
[
api,
ensureFolderData,
notifyApiError,
selectFolder,
@@ -445,7 +444,7 @@ const useFolderTreeActions = ({
return false;
}
await api.delete(`/folders/${folderId}`);
await deleteFolder(folderId);
setFolderNodes((prev) => {
const next = new Map(prev);
@@ -503,7 +502,6 @@ const useFolderTreeActions = ({
}
},
[
api,
token,
applySelectedFolder,
ensureFolderData,