refactor: Consolidate tag drag/drop handlers into a single tagInteractions prop and streamline prop inheritance in DesktopWorkspace.

This commit is contained in:
2025-11-25 12:50:03 +01:00
parent 5191d50d42
commit 226d99b6bf
+75 -172
View File
@@ -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<HTMLDivElement>;
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<HTMLDivElement>) => void;
handleCanvasDragLeave: (event: React.DragEvent<HTMLDivElement>) => void;
handleCanvasDrop: (event: React.DragEvent<HTMLDivElement>) => void;
}
import type { DocumentsViewProps } from '../documents/panel/DocumentsPanel';
interface DesktopWorkspaceViewProps extends Omit<DocumentsViewProps, 'entries' | 'activeTagFilters'> {
engine: WorkspaceEngine;
items: DeskDocument[];
containerRef: React.RefObject<HTMLDivElement>;
ensureDocumentSize: (doc: DeskDocument | null) => DocumentSizeInfo | null;
layoutSnapshot: Map<string, LayoutEntry>;
layoutRef: React.MutableRefObject<Map<string, LayoutEntry>>;
@@ -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<string>;
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<string, DeskDocument>;
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<DesktopWorkspaceProps> = ({
const DesktopWorkspace: React.FC<DocumentsViewProps> = ({
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<DesktopWorkspaceProps> = ({
requestCanvasFocus,
});
const {
handleTagDragEnterDoc,
handleTagDragOverDoc,
handleTagDragLeaveDoc,
handleTagDropOnDoc,
handleCanvasDragOver,
handleCanvasDragLeave,
handleCanvasDrop,
handleDocTagPointerDown,
handleDocTagDragStart,
handleDocTagDrag,
handleDocTagDragEnd,
} = tagInteractions;
useEffect(() => {
const current = docSizeMapRef.current;
const next = new Map<string, DocumentSizeInfo>(current);
@@ -789,110 +767,45 @@ const DesktopWorkspace: React.FC<DesktopWorkspaceProps> = ({
[],
);
const viewProps = useMemo<DesktopWorkspaceViewProps>(
() => ({
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 <DesktopWorkspaceView {...viewProps} />;
};
@@ -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}
/>