@@ -3,13 +3,23 @@ import Card, { DropIndicator } from "./card";
3
3
4
4
const KanbanBoard = ( { initialData } : any ) => {
5
5
const [ data , setData ] = useState ( initialData ) ;
6
+ const [ draggedCard , setDraggedCard ] = useState ( null ) ;
7
+
8
+ const getTouchPosition = ( e : TouchEvent ) : number => {
9
+ return e . touches [ 0 ] . clientY ;
10
+ } ;
11
+
12
+ const isDragEvent = ( e : DragEvent | TouchEvent ) : e is DragEvent => {
13
+ return ( e as DragEvent ) . dataTransfer !== undefined ;
14
+ } ;
6
15
7
16
const dragStart = ( e : any , card : any ) => {
8
17
const { position } = card ;
9
- e ?. dataTransfer ?. setData ( "cardID" , position ) ;
18
+ if ( isDragEvent ( e ) ) e ?. dataTransfer ?. setData ( "cardID" , position ) ;
19
+ setDraggedCard ( position ) ;
10
20
} ;
11
21
12
- const highlightIndicator = ( e : DragEvent , column : string ) => {
22
+ const highlightIndicator = ( e : DragEvent | TouchEvent , column : string ) => {
13
23
const indicator = getIndicator ( column ) ;
14
24
clearHighlight ( indicator , column ) ;
15
25
const el = getNearestElement ( e , indicator ) ;
@@ -29,11 +39,14 @@ const KanbanBoard = ({ initialData }: any) => {
29
39
30
40
const getNearestElement = ( e : any , indicator : any ) => {
31
41
const DISTANCE = 50 ;
42
+ const clientY = ( e as TouchEvent ) . touches
43
+ ? ( e as TouchEvent ) ?. touches [ 0 ] ?. clientY
44
+ : ( e as DragEvent ) ?. clientY ;
32
45
33
46
const el = indicator ?. reduce (
34
47
( prev : any , curr : any ) => {
35
48
const box = curr ?. getBoundingClientRect ( ) ;
36
- const offset = e . clientY - ( box . top + DISTANCE ) ;
49
+ const offset = clientY - ( box . top + DISTANCE ) ;
37
50
38
51
if ( offset < 0 && offset > prev . offset ) {
39
52
return { offset, el : curr } ;
@@ -50,7 +63,7 @@ const KanbanBoard = ({ initialData }: any) => {
50
63
return el ;
51
64
} ;
52
65
53
- const dragOver = ( e : DragEvent , column : string ) => {
66
+ const dragOver = ( e : DragEvent | TouchEvent , column : string ) => {
54
67
e . preventDefault ( ) ;
55
68
highlightIndicator ( e , column ) ;
56
69
} ;
@@ -59,10 +72,11 @@ const KanbanBoard = ({ initialData }: any) => {
59
72
clearHighlight ( "" , column ) ;
60
73
} ;
61
74
62
- const handleDrop = ( e : DragEvent , column : string ) => {
75
+ const handleDrop = ( e : DragEvent | TouchEvent , column : string ) => {
63
76
clearHighlight ( "" , column ) ;
64
77
65
- const cardID = e ?. dataTransfer ?. getData ( "cardID" ) ;
78
+ const cardID =
79
+ draggedCard || ( isDragEvent ( e ) ? e . dataTransfer . getData ( "cardID" ) : null ) ;
66
80
const indicator = getIndicator ( column ) ;
67
81
const { el } = getNearestElement ( e , indicator ) ;
68
82
const prev = el ?. dataset ?. before || - 1 ;
@@ -90,6 +104,7 @@ const KanbanBoard = ({ initialData }: any) => {
90
104
copy . splice ( insertAtIndex , 0 , cardToTransfer ) ;
91
105
92
106
setData ( copy ) ;
107
+ setDraggedCard ( null ) ;
93
108
}
94
109
} ;
95
110
@@ -103,8 +118,10 @@ const KanbanBoard = ({ initialData }: any) => {
103
118
onDragOver = { ( e ) => dragOver ( e , c ) }
104
119
onDragLeave = { ( ) => dragLeave ( c ) }
105
120
onDrop = { ( e ) => handleDrop ( e , c ) }
121
+ onTouchMove = { ( e ) => dragOver ( e as any , c ) }
122
+ onTouchEnd = { ( e ) => handleDrop ( e as any , c ) }
106
123
>
107
- < h2 className = "text-lg font-bold mb-4" > { c } </ h2 >
124
+ < h2 className = "text-lg font-bold mb-4" > { c . replace ( / - / g , " " ) . toUpperCase ( ) } </ h2 >
108
125
{ data
109
126
. filter ( ( d : any ) => d . column == c )
110
127
. map ( ( task : any ) => (
@@ -113,7 +130,7 @@ const KanbanBoard = ({ initialData }: any) => {
113
130
position = { task . position }
114
131
title = { task . title }
115
132
column = { task . column }
116
- handleDragStart = { ( e : any ) => dragStart ( e , task ) }
133
+ handleDragStart = { ( e : DragEvent ) => dragStart ( e , task ) }
117
134
/>
118
135
) ) }
119
136
< DropIndicator column = { c } before = { - 1 } />
0 commit comments