diff --git a/frontend/src/desktop/DesktopWorkspace.tsx b/frontend/src/desktop/DesktopWorkspace.tsx index 6ee5831..a02d34a 100644 --- a/frontend/src/desktop/DesktopWorkspace.tsx +++ b/frontend/src/desktop/DesktopWorkspace.tsx @@ -118,20 +118,26 @@ type WorkspaceSnapshotState = { initialLoadDone: boolean; }; -import type { DocumentsViewProps } from '../documents/panel/DocumentsPanel'; - -interface DesktopWorkspaceProps extends DocumentsViewProps { - // Override entries if needed, or rely on DocumentsViewProps - // entries: DocumentsListEntry[]; -} - -interface DesktopWorkspaceViewProps { - engine: WorkspaceEngine; - items: DeskDocument[]; - containerRef: React.RefObject; +export interface DeskTagInteractions { + handleTagDragEnterDoc: (...args: unknown[]) => void; + handleTagDragOverDoc: (...args: unknown[]) => void; + handleTagDragLeaveDoc: (...args: unknown[]) => void; + handleTagDropOnDoc: (...args: unknown[]) => void; + handleDocTagPointerDown: (...args: unknown[]) => void; + handleDocTagDragStart: (...args: unknown[]) => void; + handleDocTagDrag: (...args: unknown[]) => void; + handleDocTagDragEnd: (...args: unknown[]) => void; handleCanvasDragOver: (event: React.DragEvent) => void; handleCanvasDragLeave: (event: React.DragEvent) => void; handleCanvasDrop: (event: React.DragEvent) => void; +} + +import type { DocumentsViewProps } from '../documents/panel/DocumentsPanel'; + +interface DesktopWorkspaceViewProps extends Omit { + engine: WorkspaceEngine; + items: DeskDocument[]; + containerRef: React.RefObject; ensureDocumentSize: (doc: DeskDocument | null) => DocumentSizeInfo | null; layoutSnapshot: Map; layoutRef: React.MutableRefObject>; @@ -142,26 +148,14 @@ interface DesktopWorkspaceViewProps { tagDropTargetId: string | null; pendingTagDocId: string | null; pendingRemovalTag: unknown; - ensureAssetUrl?: DesktopWorkspaceProps['ensureAssetUrl']; - getDocumentAsset?: DesktopWorkspaceProps['getDocumentAsset']; handleNavigatorSnapshot: (docId: Identifier | null, snapshot: NavigatorSnapshot | null) => void; activeTagSet: Set; - handleTagDragEnterDoc: (...args: unknown[]) => void; - handleTagDragOverDoc: (...args: unknown[]) => void; - handleTagDragLeaveDoc: (...args: unknown[]) => void; - handleTagDropOnDoc: (...args: unknown[]) => void; - handleDocTagPointerDown: (...args: unknown[]) => void; - handleDocTagDragStart: (...args: unknown[]) => void; - handleDocTagDrag: (...args: unknown[]) => void; - handleDocTagDragEnd: (...args: unknown[]) => void; + tagInteractions: DeskTagInteractions; overlayDisplay: OverlayDisplay | null; closeOverlay: () => void; overlayOriginRect: DOMRect | null; overlayOriginTransform: OverlayOriginTransform | null; overlayDocument: DeskDocument | null; - onDocumentClick?: DesktopWorkspaceProps['onDocumentClick']; - onDocumentStackSelect?: (docIds: Identifier[], event?: PointerEvent | MouseEvent | null) => void; - onPromoteSelection?: (docId: Identifier | null) => void; documentLookup: Map; selectedDocumentIds: Identifier[]; onClearSelection: () => void; @@ -176,24 +170,22 @@ interface DesktopWorkspaceViewProps { openOverlayForDoc: (docId: Identifier | null, originInfo?: OverlayOriginHint | null) => void; recalcVisibleDocIds: () => void; dragSettings: DragSettings; - onDocumentActivate?: DesktopWorkspaceProps['onDocumentActivate']; markLayoutDirty: () => void; } const defaultGetDocumentAsset: GetAsset = () => null; -const DesktopWorkspace: React.FC = ({ +const DesktopWorkspace: React.FC = ({ entries = [], - onDocumentActivate = null, - onDocumentClick = null, - onDocumentTagDrop = null, - ensureAssetUrl = null, - getDocumentAsset = defaultGetDocumentAsset, activeTagFilters = [], + onDocumentTagDrop = null, tenantId = null, viewId = 'default', documentLinks, ensureDownloadUrl, + ensureAssetUrl = null, + getDocumentAsset = defaultGetDocumentAsset, + ...passThroughProps }) => { const { selectedDocumentIds, @@ -526,20 +518,6 @@ const DesktopWorkspace: React.FC = ({ requestCanvasFocus, }); - const { - handleTagDragEnterDoc, - handleTagDragOverDoc, - handleTagDragLeaveDoc, - handleTagDropOnDoc, - handleCanvasDragOver, - handleCanvasDragLeave, - handleCanvasDrop, - handleDocTagPointerDown, - handleDocTagDragStart, - handleDocTagDrag, - handleDocTagDragEnd, - } = tagInteractions; - useEffect(() => { const current = docSizeMapRef.current; const next = new Map(current); @@ -789,110 +767,45 @@ const DesktopWorkspace: React.FC = ({ [], ); - const viewProps = useMemo( - () => ({ - engine, - items, - containerRef, - handleCanvasDragOver, - handleCanvasDragLeave, - handleCanvasDrop, - ensureDocumentSize, - layoutSnapshot, - layoutRef, - dragTransformsRef, - itemRefs, - visibleDocIds, - draggingId, - tagDropTargetId, - pendingTagDocId, - pendingRemovalTag, - ensureAssetUrl, - getDocumentAsset, - handleNavigatorSnapshot, - activeTagSet, - handleTagDragEnterDoc, - handleTagDragOverDoc, - handleTagDragLeaveDoc, - handleTagDropOnDoc, - handleDocTagPointerDown, - handleDocTagDragStart, - handleDocTagDrag, - handleDocTagDragEnd, - overlayDisplay, - closeOverlay, - overlayOriginRect, - overlayOriginTransform, - overlayDocument, - onDocumentClick, - handleStackSelect, - handlePromoteSelection, - onDocumentStackSelect: handleStackSelect, - onPromoteSelection: handlePromoteSelection, - selectedDocumentIds, - onClearSelection: clearSelection, - documentLookup, - resolveBaseMetrics, - bringToFront, - setDraggingId, - canvasSize, - openOverlayForDoc, - recalcVisibleDocIds, - dragSettings, - onDocumentActivate, - markLayoutDirty, - }), - [ - activeTagSet, - bringToFront, - canvasSize, - closeOverlay, - containerRef, - draggingId, - dragSettings, - engine, - ensureAssetUrl, - ensureDocumentSize, - getDocumentAsset, - dragTransformsRef, - handleCanvasDragLeave, - handleCanvasDragOver, - handleCanvasDrop, - handleDocTagDrag, - handleDocTagDragEnd, - handleDocTagDragStart, - handleDocTagPointerDown, - handleNavigatorSnapshot, - handleTagDragEnterDoc, - handleTagDragLeaveDoc, - handleTagDragOverDoc, - handleTagDropOnDoc, - itemRefs, - items, - layoutRef, - layoutSnapshot, - onDocumentClick, - handleStackSelect, - handlePromoteSelection, - openOverlayForDoc, - overlayDisplay, - overlayOriginRect, - overlayOriginTransform, - overlayDocument, - documentLookup, - pendingRemovalTag, - pendingTagDocId, - recalcVisibleDocIds, - resolveBaseMetrics, - setDraggingId, - selectedDocumentIds, - clearSelection, - onDocumentActivate, - markLayoutDirty, - tagDropTargetId, - visibleDocIds, - ], - ); + const viewProps: DesktopWorkspaceViewProps = { + ...passThroughProps, + engine, + items, + containerRef, + ensureDocumentSize, + layoutSnapshot, + layoutRef, + dragTransformsRef, + itemRefs, + visibleDocIds, + draggingId, + tagDropTargetId, + pendingTagDocId, + pendingRemovalTag, + ensureAssetUrl, + getDocumentAsset, + handleNavigatorSnapshot, + activeTagSet, + tagInteractions, + overlayDisplay, + closeOverlay, + overlayOriginRect, + overlayOriginTransform, + overlayDocument, + onDocumentStackSelect: handleStackSelect, + onPromoteSelection: handlePromoteSelection, + selectedDocumentIds, + onClearSelection: clearSelection, + documentLookup, + resolveBaseMetrics, + bringToFront, + setDraggingId, + canvasSize, + openOverlayForDoc, + recalcVisibleDocIds, + dragSettings, + markLayoutDirty, + }; return ; }; @@ -900,12 +813,10 @@ function DesktopWorkspaceView({ engine, items, containerRef, - handleCanvasDragOver, - handleCanvasDragLeave, - handleCanvasDrop, ensureDocumentSize, layoutSnapshot, layoutRef, + dragTransformsRef, itemRefs, visibleDocIds, draggingId, @@ -916,14 +827,7 @@ function DesktopWorkspaceView({ getDocumentAsset, handleNavigatorSnapshot, activeTagSet, - handleTagDragEnterDoc, - handleTagDragOverDoc, - handleTagDragLeaveDoc, - handleTagDropOnDoc, - handleDocTagPointerDown, - handleDocTagDragStart, - handleDocTagDrag, - handleDocTagDragEnd, + tagInteractions, overlayDisplay, closeOverlay, overlayOriginRect, @@ -944,7 +848,6 @@ function DesktopWorkspaceView({ dragSettings, onDocumentActivate, markLayoutDirty, - dragTransformsRef, }: DesktopWorkspaceViewProps) { const handleDeskDocumentActivate = useCallback( (docId: Identifier) => { @@ -1036,9 +939,9 @@ function DesktopWorkspaceView({ ref={containerRef} tabIndex={0} onKeyDown={handleShellKeyDown} - onDragOver={handleCanvasDragOver} - onDragLeave={handleCanvasDragLeave} - onDrop={handleCanvasDrop} + onDragOver={tagInteractions.handleCanvasDragOver} + onDragLeave={tagInteractions.handleCanvasDragLeave} + onDrop={tagInteractions.handleCanvasDrop} onPointerDown={(event) => { if (event.target === event.currentTarget) { onClearSelection(); @@ -1129,14 +1032,14 @@ function DesktopWorkspaceView({ handleNavigatorSnapshot={handleNavigatorSnapshot} cardPointerHandlers={cardPointerHandlers} onDocumentActivate={onDocumentActivate} - onTagDragEnter={handleTagDragEnterDoc} - onTagDragOver={handleTagDragOverDoc} - onTagDragLeave={handleTagDragLeaveDoc} - onTagDrop={handleTagDropOnDoc} - onDocTagPointerDown={handleDocTagPointerDown} - onDocTagDragStart={handleDocTagDragStart} - onDocTagDrag={handleDocTagDrag} - onDocTagDragEnd={handleDocTagDragEnd} + onTagDragEnter={tagInteractions.handleTagDragEnterDoc} + onTagDragOver={tagInteractions.handleTagDragOverDoc} + onTagDragLeave={tagInteractions.handleTagDragLeaveDoc} + onTagDrop={tagInteractions.handleTagDropOnDoc} + onDocTagPointerDown={tagInteractions.handleDocTagPointerDown} + onDocTagDragStart={tagInteractions.handleDocTagDragStart} + onDocTagDrag={tagInteractions.handleDocTagDrag} + onDocTagDragEnd={tagInteractions.handleDocTagDragEnd} pendingRemovalTag={pendingRemovalTag} registerNode={registerNode} />