feat: Refactor sidebar props to simplify data flow
This commit is contained in:
@@ -1,20 +1,7 @@
|
||||
import { useMemo } from 'react';
|
||||
import type { DragEvent } from 'react';
|
||||
import { TAG_FILTER_UNTAGGED } from '../app/workspaceUtils';
|
||||
import type { Identifier } from '../types/identifiers';
|
||||
|
||||
interface FolderTreeNode {
|
||||
id: Identifier;
|
||||
name?: string;
|
||||
hasChildren?: boolean;
|
||||
loaded?: boolean;
|
||||
expanded?: boolean;
|
||||
children: Identifier[];
|
||||
[key: string]: unknown;
|
||||
}
|
||||
|
||||
type FolderNodeMap = Map<Identifier, FolderTreeNode>;
|
||||
|
||||
type FolderToggleHandler = (folderId: Identifier) => void | Promise<void>;
|
||||
type FolderDropHandler = (
|
||||
event: DragEvent<HTMLElement>,
|
||||
@@ -29,45 +16,8 @@ interface FolderClickHandlers {
|
||||
onDragLeave: (event: DragEvent<HTMLElement>) => void;
|
||||
}
|
||||
|
||||
interface TagOption {
|
||||
id?: Identifier;
|
||||
label?: string;
|
||||
color?: string | null;
|
||||
[key: string]: unknown;
|
||||
}
|
||||
|
||||
interface CorrespondentOption {
|
||||
id?: Identifier;
|
||||
name?: string;
|
||||
[key: string]: unknown;
|
||||
}
|
||||
|
||||
interface TenantOption {
|
||||
id?: Identifier;
|
||||
name?: string;
|
||||
[key: string]: unknown;
|
||||
}
|
||||
|
||||
interface UploadQueueItem {
|
||||
id: string;
|
||||
name?: string;
|
||||
size?: number | null;
|
||||
folderId?: Identifier | 'root';
|
||||
status?: string;
|
||||
error?: unknown;
|
||||
code?: number | null;
|
||||
document?: unknown;
|
||||
conflictDocumentId?: Identifier | null;
|
||||
[key: string]: unknown;
|
||||
}
|
||||
|
||||
type UploadFilesHandler = (
|
||||
files: FileList | File[] | Iterable<File>,
|
||||
targetFolderId: Identifier | 'root',
|
||||
) => void | Promise<void>;
|
||||
|
||||
interface UseSidebarPropsArgs {
|
||||
folderNodes: FolderNodeMap;
|
||||
folderClickHandlers: FolderClickHandlers;
|
||||
handleFolderDelete: (folderId: Identifier) => void | Promise<void>;
|
||||
handleFolderRename: (folderId: Identifier, name: string) => void | Promise<void>;
|
||||
@@ -77,28 +27,9 @@ interface UseSidebarPropsArgs {
|
||||
draggedFolderId: Identifier | null;
|
||||
handlePromptCreateFolder?: (parentId?: Identifier | null) => void;
|
||||
creatingFolder: boolean;
|
||||
tags: TagOption[];
|
||||
handleTagCreate: (payload: { label?: string }) => void | Promise<void>;
|
||||
correspondents: CorrespondentOption[];
|
||||
handleCorrespondentCreate: (payload: { name?: string }) =>
|
||||
| Promise<CorrespondentOption | null | void>
|
||||
| CorrespondentOption
|
||||
| null
|
||||
| void;
|
||||
appStatus: string;
|
||||
previewActive: boolean;
|
||||
handleLogout: () => void | Promise<void>;
|
||||
tenantName: string | null;
|
||||
tenantOptions: TenantOption[];
|
||||
currentTenantId: Identifier | null;
|
||||
handleTenantSelect: (tenant: TenantOption | null, options?: { refreshOnly?: boolean }) => void | Promise<void>;
|
||||
openSettings?: () => void;
|
||||
handleFileSelection?: UploadFilesHandler;
|
||||
uploadQueue?: UploadQueueItem[];
|
||||
}
|
||||
|
||||
interface SidebarHookResult {
|
||||
folderNodes: FolderNodeMap;
|
||||
onToggle: FolderClickHandlers['onToggle'];
|
||||
onSelect: FolderClickHandlers['onSelect'];
|
||||
onDrop: FolderClickHandlers['onDrop'];
|
||||
@@ -112,24 +43,9 @@ interface SidebarHookResult {
|
||||
draggedFolderId: Identifier | null;
|
||||
onCreateFolder: UseSidebarPropsArgs['handlePromptCreateFolder'];
|
||||
creatingFolder: boolean;
|
||||
tags: TagOption[];
|
||||
untaggedFilterId: typeof TAG_FILTER_UNTAGGED;
|
||||
onCreateTag: (label: string) => void;
|
||||
correspondents: CorrespondentOption[];
|
||||
onCreateCorrespondent: (name: string) => void;
|
||||
previewActive: boolean;
|
||||
onLogout: UseSidebarPropsArgs['handleLogout'];
|
||||
tenantName: string | null;
|
||||
tenants: TenantOption[];
|
||||
activeTenantId: Identifier | null;
|
||||
onSelectTenant: UseSidebarPropsArgs['handleTenantSelect'];
|
||||
onOpenSettings: UseSidebarPropsArgs['openSettings'];
|
||||
onUploadFiles: (files: FileList | File[] | Iterable<File>, targetFolderId?: Identifier | 'root') => void;
|
||||
uploadQueue?: UploadQueueItem[];
|
||||
}
|
||||
|
||||
const useSidebarProps = ({
|
||||
folderNodes,
|
||||
folderClickHandlers,
|
||||
handleFolderDelete,
|
||||
handleFolderRename,
|
||||
@@ -139,24 +55,9 @@ const useSidebarProps = ({
|
||||
draggedFolderId,
|
||||
handlePromptCreateFolder,
|
||||
creatingFolder,
|
||||
tags,
|
||||
handleTagCreate,
|
||||
correspondents,
|
||||
handleCorrespondentCreate,
|
||||
appStatus,
|
||||
previewActive,
|
||||
handleLogout,
|
||||
tenantName,
|
||||
tenantOptions,
|
||||
currentTenantId,
|
||||
handleTenantSelect,
|
||||
openSettings,
|
||||
handleFileSelection,
|
||||
uploadQueue,
|
||||
}: UseSidebarPropsArgs): SidebarHookResult =>
|
||||
useMemo(
|
||||
() => ({
|
||||
folderNodes,
|
||||
onToggle: folderClickHandlers.onToggle,
|
||||
onSelect: folderClickHandlers.onSelect,
|
||||
onDrop: folderClickHandlers.onDrop,
|
||||
@@ -170,60 +71,17 @@ const useSidebarProps = ({
|
||||
draggedFolderId,
|
||||
onCreateFolder: (parentId) => handlePromptCreateFolder?.(parentId),
|
||||
creatingFolder,
|
||||
tags,
|
||||
untaggedFilterId: TAG_FILTER_UNTAGGED,
|
||||
onCreateTag: (label) => handleTagCreate({ label }),
|
||||
correspondents,
|
||||
onCreateCorrespondent: (name) => handleCorrespondentCreate({ name }),
|
||||
appStatus,
|
||||
previewActive,
|
||||
onLogout: handleLogout,
|
||||
tenantName,
|
||||
tenants: tenantOptions,
|
||||
activeTenantId: currentTenantId,
|
||||
onSelectTenant: handleTenantSelect,
|
||||
onOpenSettings: openSettings,
|
||||
onUploadFiles: (files, targetFolderId) => {
|
||||
if (!handleFileSelection) {
|
||||
return;
|
||||
}
|
||||
if (!files) {
|
||||
return;
|
||||
}
|
||||
const normalizedFiles = Array.isArray(files) ? files : Array.from(files);
|
||||
if (normalizedFiles.length === 0) {
|
||||
return;
|
||||
}
|
||||
const folderId = targetFolderId ?? selectedFolder ?? 'root';
|
||||
handleFileSelection(normalizedFiles, folderId);
|
||||
},
|
||||
uploadQueue,
|
||||
}),
|
||||
[
|
||||
handleFileSelection,
|
||||
uploadQueue,
|
||||
appStatus,
|
||||
correspondents,
|
||||
creatingFolder,
|
||||
currentTenantId,
|
||||
folderClickHandlers,
|
||||
folderNodes,
|
||||
handleCorrespondentCreate,
|
||||
handleFolderDragEnd,
|
||||
handleFolderDragStart,
|
||||
handleFolderDelete,
|
||||
handleFolderRename,
|
||||
handleLogout,
|
||||
handlePromptCreateFolder,
|
||||
handleTagCreate,
|
||||
handleTenantSelect,
|
||||
openSettings,
|
||||
previewActive,
|
||||
draggedFolderId,
|
||||
selectedFolder,
|
||||
tags,
|
||||
tenantName,
|
||||
tenantOptions,
|
||||
],
|
||||
);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user