From b8a23c7ec4a2ba8223d8956d389680bb5ce76024 Mon Sep 17 00:00:00 2001 From: Nils Schneider Date: Fri, 5 Dec 2025 00:32:45 +0100 Subject: [PATCH] cleanup --- frontend/src/app/useDocumentsShell.ts | 2 +- .../documents/data/useDocumentsWorkspace.ts | 15 ++-- .../features/folders/useFolderTree.ts | 82 +++++++++---------- frontend/src/types/identifiers.ts | 1 + 4 files changed, 49 insertions(+), 51 deletions(-) diff --git a/frontend/src/app/useDocumentsShell.ts b/frontend/src/app/useDocumentsShell.ts index 6c9ffe1..ee0577b 100644 --- a/frontend/src/app/useDocumentsShell.ts +++ b/frontend/src/app/useDocumentsShell.ts @@ -29,7 +29,7 @@ const useDocumentsShell = (): DocumentsShellView => { openDetailPanel: shell.openDetailPanel as WorkspaceSurfaceConfig['openDetailPanel'], closeDetailPanel: shell.closeDetailPanel as WorkspaceSurfaceConfig['closeDetailPanel'], previewWorkspaceDocument: shell.previewWorkspaceDocument, - previewDocumentId: (shell.previewDocumentId as Identifier | null | undefined) ?? null, + previewDocumentId: (shell.previewDocumentId as Identifier) ?? null, closeDocumentPreview: shell.closeDocumentPreview as WorkspaceSurfaceConfig['closeDocumentPreview'], ensurePreviewData: shell.ensurePreviewData as WorkspaceSurfaceConfig['ensurePreviewData'], ensureAssetUrl: shell.ensureAssetUrl as WorkspaceSurfaceConfig['ensureAssetUrl'], diff --git a/frontend/src/documents/data/useDocumentsWorkspace.ts b/frontend/src/documents/data/useDocumentsWorkspace.ts index db7d3a3..4b8b407 100644 --- a/frontend/src/documents/data/useDocumentsWorkspace.ts +++ b/frontend/src/documents/data/useDocumentsWorkspace.ts @@ -51,7 +51,7 @@ import useDetailWorkspace from '../../viewer/logic/useDetailWorkspace'; import useWorkspaceTaxonomies from './useWorkspaceTaxonomies'; import useWorkspaceBreadcrumbs from '../logic/useWorkspaceBreadcrumbs'; import useWorkspaceSelectionSync from '../features/selection/useWorkspaceSelectionSync'; -import type { DocumentId, FolderId as FolderIdentifier, Identifier } from '../../types/identifiers'; +import type { DocumentId, FolderNodeId, Identifier } from '../../types/identifiers'; const EntryType = Object.freeze({ document: 'document', @@ -60,14 +60,13 @@ const EntryType = Object.freeze({ const noop = () => { }; -type FolderId = FolderIdentifier | 'root'; import type { Document } from '../../types/documents'; interface FolderContentsEntry { - folder?: { id?: FolderId; name?: string | null } | null; + folder?: { id?: FolderNodeId; name?: string | null } | null; documents?: Document[]; - subfolders?: Array<{ id?: FolderId; name?: string | null;[key: string]: unknown }>; + subfolders?: Array<{ id?: FolderNodeId; name?: string | null;[key: string]: unknown }>; __includesDocuments?: boolean; __sortField?: string | null; __sortDirection?: string | null; @@ -210,7 +209,7 @@ const useDocumentsWorkspace = ({ ); const [draggedDocumentIds, setDraggedDocumentIds] = useState([]); - const [draggedFolderId, setDraggedFolderId] = useState(null); + const [draggedFolderId, setDraggedFolderId] = useState(null); const [activePreviewId, setActivePreviewId] = useState(routeDocumentId || null); const shellRef = useRef(null); const assetManagerRef = useRef(null); @@ -293,7 +292,7 @@ const useDocumentsWorkspace = ({ ], ); - const [folderContents, setFolderContents] = useState>( + const [folderContents, setFolderContents] = useState>( () => new Map(), ); const folderContentsRef = useRef(folderContents); @@ -687,12 +686,12 @@ const useDocumentsWorkspace = ({ return filtered.length === prev.length ? prev : filtered; }); - setFolderContents((prev: Map) => { + setFolderContents((prev: Map) => { if (!prev.size) { return prev; } let changed = false; - const next = new Map(); + const next = new Map(); prev.forEach((contents, key) => { const docs = Array.isArray(contents?.documents) ? contents.documents : null; if (!docs || docs.length === 0) { diff --git a/frontend/src/documents/features/folders/useFolderTree.ts b/frontend/src/documents/features/folders/useFolderTree.ts index 179a90b..6ee38c5 100644 --- a/frontend/src/documents/features/folders/useFolderTree.ts +++ b/frontend/src/documents/features/folders/useFolderTree.ts @@ -9,17 +9,15 @@ import { createDocumentEntryKey, createFolderEntryKey, } from '../../../app/entryKey'; -import type { FolderId as FolderIdentifier, Identifier } from '../../../types/identifiers'; +import type { FolderId, FolderNodeId, Identifier } from '../../../types/identifiers'; import type { Document } from '../../../types/documents'; -type FolderId = FolderIdentifier | 'root'; - interface FolderSummary { - id?: FolderId; + id?: FolderNodeId; name?: string; - parent_id?: FolderId | null; - parentId?: FolderId | null; - children?: FolderId[]; + parent_id?: FolderNodeId | null; + parentId?: FolderNodeId | null; + children?: FolderNodeId[]; subfolders?: FolderSummary[]; has_children?: boolean; hasChildren?: boolean; @@ -37,8 +35,8 @@ interface FolderContentsEntry { } interface FolderTreeNode extends FolderSummary { - id: FolderId; - children: FolderId[]; + id: FolderNodeId; + children: FolderNodeId[]; expanded?: boolean; loaded?: boolean; hasChildren?: boolean; @@ -54,18 +52,18 @@ interface SelectionHelpers { } interface UseFolderTreeOptions { - initialSelectedFolder?: FolderId; + initialSelectedFolder?: FolderNodeId; tenantIdRef: MutableRefObject; documentsSortFieldRef: MutableRefObject; documentsSortDirectionRef: MutableRefObject; selectionHelpers: SelectionHelpers; setDocuments: Dispatch>; - setFolderContents: Dispatch>>; - folderContentsRef: MutableRefObject>; + setFolderContents: Dispatch>>; + folderContentsRef: MutableRefObject>; } interface FolderOption { - id: FolderId; + id: FolderNodeId; label: string; } @@ -79,7 +77,7 @@ const useFolderTree = ({ setFolderContents, folderContentsRef, }: UseFolderTreeOptions) => { - const [folderNodes, setFolderNodes] = useState>(() => { + const [folderNodes, setFolderNodes] = useState>(() => { const rootNode = createRootNode() as FolderTreeNode; return new Map([[rootNode.id, rootNode]]); }); @@ -90,12 +88,12 @@ const useFolderTree = ({ const data = await getFolderTree(); setFolderNodes((prev) => { const next = new Map(prev); - const rootChildren: FolderId[] = []; + const rootChildren: FolderNodeId[] = []; data.forEach((item) => { - const id = item.id as FolderId; - const parentId = (item.parent_id || 'root') as FolderId; - const children = (item.children || []).map((c) => c as FolderId); + const id = item.id as FolderNodeId; + const parentId = (item.parent_id || 'root') as FolderNodeId; + const children = (item.children || []).map((c) => c as FolderNodeId); next.set(id, { id, @@ -130,7 +128,7 @@ const useFolderTree = ({ fetchTree(); }, []); - const [selectedFolder, setSelectedFolder] = useState(initialSelectedFolder || 'root'); + const [selectedFolder, setSelectedFolder] = useState(initialSelectedFolder || 'root'); const [currentFolder, setCurrentFolder] = useState(null); const [currentSubfolders, setCurrentSubfolders] = useState([]); @@ -149,7 +147,7 @@ const useFolderTree = ({ }, [focusedDocumentId]); const applySelectedFolder = useCallback( - (folderId: FolderId, contents?: FolderContentsEntry | null) => { + (folderId: FolderNodeId, contents?: FolderContentsEntry | null) => { const subfolders = Array.isArray(contents?.subfolders) ? contents.subfolders : []; const docs = Array.isArray(contents?.documents) ? contents.documents : []; const folderInfo = contents?.folder ?? null; @@ -159,7 +157,7 @@ const useFolderTree = ({ setCurrentFolder(folderInfo); const availableDocKeys = docs - .map((doc) => createDocumentEntryKey(doc?.id as Identifier)) + .map((doc) => createDocumentEntryKey((doc as Document)?.id as Identifier)) .filter(Boolean); const availableDocKeySet = new Set(availableDocKeys); const availableFolderKeys = new Set( @@ -212,13 +210,13 @@ const useFolderTree = ({ ], ); - const expandFolderAncestors = useCallback((targetId: FolderId | null) => { + const expandFolderAncestors = useCallback((targetId: FolderNodeId | null) => { if (!targetId || targetId === 'root') { return; } - setFolderNodes((prev: Map) => { - const next = new Map(prev); + setFolderNodes((prev: Map) => { + const next = new Map(prev); const node = next.get(targetId); let currentId = node?.parentId ?? 'root'; let guard = 0; @@ -238,7 +236,7 @@ const useFolderTree = ({ const ensureFolderData = useCallback( async ( - folderId: FolderId, + folderId: FolderNodeId, { includeDocuments = true, prefetchDepth = 0, @@ -289,8 +287,8 @@ const useFolderTree = ({ const data = await listFolderContents(path, params); const childFolders = Array.isArray(data.subfolders) ? data.subfolders : []; const childIds = childFolders - .map((child) => (child?.id ?? null) as FolderId | null) - .filter((id): id is FolderId => Boolean(id)); + .map((child) => (child?.id ?? null) as FolderNodeId | null) + .filter((id): id is FolderNodeId => Boolean(id)); const enriched = { ...data, @@ -303,8 +301,8 @@ const useFolderTree = ({ return enriched; } - setFolderNodes((prev: Map) => { - const next = new Map(prev); + setFolderNodes((prev: Map) => { + const next = new Map(prev); const existingNode = next.get(folderId) || { id: folderId, name: folderId === 'root' ? DEFAULT_FOLDER_NAME : data.folder?.name || 'Folder', @@ -326,7 +324,7 @@ const useFolderTree = ({ }); childFolders.forEach((child) => { - const childId = (child?.id ?? null) as FolderId | null; + const childId = (child?.id ?? null) as FolderNodeId | null; if (!childId) { return; } @@ -346,7 +344,7 @@ const useFolderTree = ({ next.set(childId, { id: childId, name: child.name, - parentId: (child.parent_id ?? 'root') as FolderId, + parentId: (child.parent_id ?? 'root') as FolderNodeId, children: previousChildren, expanded: childNode?.expanded ?? false, loaded: childNode?.loaded ?? false, @@ -369,11 +367,11 @@ const useFolderTree = ({ ); } - setFolderContents((prev: Map) => { + setFolderContents((prev: Map) => { if (tenantIdRef.current !== requestTenantId) { return prev; } - const next = new Map(prev); + const next = new Map(prev); if (includeDocuments) { next.set(folderId, enriched); } else { @@ -408,7 +406,7 @@ const useFolderTree = ({ ); const ensureFolderAncestorsLoaded = useCallback( - async (targetId: FolderId | null) => { + async (targetId: FolderNodeId | null) => { if (!targetId || targetId === 'root') { return; } @@ -429,7 +427,7 @@ const useFolderTree = ({ ); const isInvalidFolderDrop = useCallback( - (sourceId: FolderId | null, targetId: FolderId | null) => { + (sourceId: FolderNodeId | null, targetId: FolderNodeId | null) => { if (!sourceId) return false; if (!targetId || targetId === 'root') { return false; @@ -456,8 +454,8 @@ const useFolderTree = ({ const resetFolderTreeState = useCallback(() => { const rootNode = createRootNode() as FolderTreeNode; - setFolderNodes(new Map([[rootNode.id, rootNode]])); - setFolderContents(new Map()); + setFolderNodes(new Map([[rootNode.id, rootNode]])); + setFolderContents(new Map()); setSelectedFolder('root'); setCurrentFolder(null); setCurrentSubfolders([]); @@ -469,10 +467,10 @@ const useFolderTree = ({ }, [selectedFolder, currentFolder]); const folderOptions: FolderOption[] = useMemo(() => { - const cache = new Map(); - const computePath = (id: FolderId | null): string => { - if (cache.has(id as FolderId)) { - return cache.get(id as FolderId) as string; + const cache = new Map(); + const computePath = (id: FolderNodeId | null): string => { + if (cache.has(id as FolderNodeId)) { + return cache.get(id as FolderNodeId) as string; } if (!id || id === 'root') { cache.set('root', DEFAULT_FOLDER_NAME); @@ -506,7 +504,7 @@ const useFolderTree = ({ }, [folderNodes]); const folderLabelMap = useMemo(() => { - const map = new Map(); + const map = new Map(); folderOptions.forEach((option) => { map.set(option.id, option.label); }); diff --git a/frontend/src/types/identifiers.ts b/frontend/src/types/identifiers.ts index 635b603..6755fbb 100644 --- a/frontend/src/types/identifiers.ts +++ b/frontend/src/types/identifiers.ts @@ -3,6 +3,7 @@ export type Identifier = string; export type DocumentId = Identifier; export type FolderId = Identifier; +export type FolderNodeId = FolderId | 'root'; export type CapabilitySetId = Identifier; export type CapabilityValue = Identifier; export type TenantId = Identifier;