1- import { useCallback , useState } from "react" ;
1+ import { useCallback , useEffect , useState } from "react" ;
22import type { CommandCenterCellData } from "../hooks/useCommandCenterData" ;
33import {
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+
1540function 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
72102export 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