Skip to content

Commit bb367c1

Browse files
committed
Fix drag-and-drop onto occupied command center cells
1 parent e01ab14 commit bb367c1

1 file changed

Lines changed: 49 additions & 13 deletions

File tree

apps/code/src/renderer/features/command-center/components/CommandCenterGrid.tsx

Lines changed: 49 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useCallback, useState } from "react";
1+
import { useCallback, useEffect, useState } from "react";
22
import type { CommandCenterCellData } from "../hooks/useCommandCenterData";
33
import {
44
getGridDimensions,
@@ -12,12 +12,39 @@ interface CommandCenterGridProps {
1212
cells: CommandCenterCellData[];
1313
}
1414

15+
function useTaskDragActive() {
16+
const [active, setActive] = useState(false);
17+
18+
useEffect(() => {
19+
const onDragStart = (e: DragEvent) => {
20+
if (e.dataTransfer?.types.includes("text/x-task-id")) {
21+
setActive(true);
22+
}
23+
};
24+
const onDragEnd = () => setActive(false);
25+
const onDrop = () => setActive(false);
26+
27+
document.addEventListener("dragstart", onDragStart);
28+
document.addEventListener("dragend", onDragEnd);
29+
document.addEventListener("drop", onDrop);
30+
return () => {
31+
document.removeEventListener("dragstart", onDragStart);
32+
document.removeEventListener("dragend", onDragEnd);
33+
document.removeEventListener("drop", onDrop);
34+
};
35+
}, []);
36+
37+
return active;
38+
}
39+
1540
function GridCell({
1641
cell,
1742
zoom,
43+
isDragActive,
1844
}: {
1945
cell: CommandCenterCellData;
2046
zoom: number;
47+
isDragActive: boolean;
2148
}) {
2249
const [isDragOver, setIsDragOver] = useState(false);
2350

@@ -46,17 +73,7 @@ function GridCell({
4673
);
4774

4875
return (
49-
// biome-ignore lint/a11y/noStaticElementInteractions: drop target for drag-and-drop task assignment
50-
<div
51-
className="overflow-hidden bg-gray-1"
52-
style={{
53-
outline: isDragOver ? "2px solid var(--accent-9)" : undefined,
54-
outlineOffset: "-2px",
55-
}}
56-
onDragOver={handleDragOver}
57-
onDragLeave={handleDragLeave}
58-
onDrop={handleDrop}
59-
>
76+
<div className="relative overflow-hidden bg-gray-1">
6077
<div
6178
className="h-full w-full origin-top-left"
6279
style={{
@@ -65,13 +82,27 @@ function GridCell({
6582
>
6683
<CommandCenterPanel cell={cell} />
6784
</div>
85+
{isDragActive && (
86+
// biome-ignore lint/a11y/noStaticElementInteractions: transparent overlay to capture drag events over session content
87+
<div
88+
className="absolute inset-0"
89+
style={{
90+
outline: isDragOver ? "2px solid var(--accent-9)" : undefined,
91+
outlineOffset: "-2px",
92+
}}
93+
onDragOver={handleDragOver}
94+
onDragLeave={handleDragLeave}
95+
onDrop={handleDrop}
96+
/>
97+
)}
6898
</div>
6999
);
70100
}
71101

72102
export function CommandCenterGrid({ layout, cells }: CommandCenterGridProps) {
73103
const { cols, rows } = getGridDimensions(layout);
74104
const zoom = useCommandCenterStore((s) => s.zoom);
105+
const isDragActive = useTaskDragActive();
75106

76107
return (
77108
<div
@@ -84,7 +115,12 @@ export function CommandCenterGrid({ layout, cells }: CommandCenterGridProps) {
84115
}}
85116
>
86117
{cells.map((cell) => (
87-
<GridCell key={cell.cellIndex} cell={cell} zoom={zoom} />
118+
<GridCell
119+
key={cell.cellIndex}
120+
cell={cell}
121+
zoom={zoom}
122+
isDragActive={isDragActive}
123+
/>
88124
))}
89125
</div>
90126
);

0 commit comments

Comments
 (0)