|
1 | | -import React, { useState, useEffect, useCallback } from 'react' |
| 1 | +import React, { useState, useEffect, useCallback, SyntheticEvent } from 'react' |
2 | 2 |
|
3 | 3 | enum Position { |
4 | 4 | before = 0, |
@@ -118,45 +118,54 @@ export function SortableList<T>(props: SortableListProps<T>) { |
118 | 118 |
|
119 | 119 | return ( |
120 | 120 | <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 | + })} |
160 | 169 | </div> |
161 | 170 | ) |
162 | 171 | } |
0 commit comments