Skip to content

Commit 9661134

Browse files
committed
chore: extract handlers
1 parent ccc6e3a commit 9661134

1 file changed

Lines changed: 49 additions & 40 deletions

File tree

src/SortableList.tsx

Lines changed: 49 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState, useEffect, useCallback } from 'react'
1+
import React, { useState, useEffect, useCallback, SyntheticEvent } from 'react'
22

33
enum Position {
44
before = 0,
@@ -118,45 +118,54 @@ export function SortableList<T>(props: SortableListProps<T>) {
118118

119119
return (
120120
<div className={className} style={style}>
121-
{items.map((item, index) =>
122-
<div
123-
draggable
124-
key={index}
125-
onDragStart={() => setSourceIndex(index)}
126-
onDragEnter={() => setHoveredItem(index)}
127-
onDragOver={(e) => {
128-
e.preventDefault()
129-
130-
if (sourceIndex === null) {
131-
return
132-
}
133-
134-
const position = calculateInsertPosition(e, direction)
135-
const targetIndex = calculationTargetIndex(position, sourceIndex, index)
136-
137-
setTargetIndex(targetIndex)
138-
}}
139-
onDragEnd={(e) => {
140-
e.preventDefault()
141-
142-
if (sourceIndex !== null && targetIndex !== null) {
143-
sortHandler(sourceIndex, targetIndex)
144-
}
145-
146-
setTargetIndex(null)
147-
setSourceIndex(null)
148-
setHoveredItem(null)
149-
}}
150-
>
151-
{props.children({
152-
item,
153-
isDragItemInsertBefore: shouldInsertBefore(sourceIndex, targetIndex, index),
154-
isDragItemInsertAfter: shouldInsertAfter(sourceIndex, targetIndex, index),
155-
isDragged: sourceIndex === index,
156-
isHovered: hoveredItem === index
157-
}, index)}
158-
</div>
159-
)}
121+
{items.map((item, index) => {
122+
123+
const handleStart = () => setSourceIndex(index)
124+
const handleEnter = () => setHoveredItem(index)
125+
const handleOver = (e: React.DragEvent<HTMLDivElement>) => {
126+
e.preventDefault()
127+
128+
if (sourceIndex === null) {
129+
return
130+
}
131+
132+
const position = calculateInsertPosition(e, direction)
133+
const targetIndex = calculationTargetIndex(position, sourceIndex, index)
134+
135+
setTargetIndex(targetIndex)
136+
}
137+
138+
const handleEnd = (e: SyntheticEvent) => {
139+
e.preventDefault()
140+
141+
if (sourceIndex !== null && targetIndex !== null) {
142+
sortHandler(sourceIndex, targetIndex)
143+
}
144+
145+
setTargetIndex(null)
146+
setSourceIndex(null)
147+
setHoveredItem(null)
148+
}
149+
150+
return (
151+
<div
152+
draggable
153+
key={index}
154+
onDragStart={handleStart}
155+
onDragEnter={handleEnter}
156+
onDragOver={handleOver}
157+
onDragEnd={handleEnd}
158+
>
159+
{props.children({
160+
item,
161+
isDragItemInsertBefore: shouldInsertBefore(sourceIndex, targetIndex, index),
162+
isDragItemInsertAfter: shouldInsertAfter(sourceIndex, targetIndex, index),
163+
isDragged: sourceIndex === index,
164+
isHovered: hoveredItem === index
165+
}, index)}
166+
</div>
167+
);
168+
})}
160169
</div>
161170
)
162171
}

0 commit comments

Comments
 (0)