1+ import produce from 'immer'
12import { useState } from 'react'
2- import { flip , replace , remove } from '../lib/array'
3+ import { flip , replace , remove , insert } from '../lib/array'
34import { EditorPropsWithLabel } from '../types/editor'
45import { SchemaInput } from './inputs/SchemaInput'
56import { DataTypeSchema } from './schemas/types'
@@ -27,12 +28,27 @@ export default function FieldArray<T>(props: FieldArrayProps<T>) {
2728 onChange ( flip ( value , i1 , i2 ) )
2829 }
2930
31+ const handleDragDrop = ( i1 : number , i2 : number ) => {
32+ const item = value [ i1 ]
33+ const removed = remove ( value , i1 )
34+ if ( i2 > i1 ) i2 --
35+ const final = insert ( removed , i2 , item )
36+ onChange ( final )
37+ }
38+
3039 return (
3140 < div sx = { { display : 'grid' , gap : 2 } } >
3241 { value . map ( ( item , i ) => {
3342 return (
3443 < div >
35- { isDragging && < DropZone /> }
44+ { isDragging && (
45+ < DropZone
46+ onDrop = { ( ) => {
47+ handleDragDrop ( dragIndex , i )
48+ setDragIndex ( - 1 )
49+ } }
50+ />
51+ ) }
3652 < div
3753 key = { i }
3854 sx = { {
@@ -76,6 +92,14 @@ export default function FieldArray<T>(props: FieldArrayProps<T>) {
7692 </ div >
7793 )
7894 } ) }
95+ { isDragging && (
96+ < DropZone
97+ onDrop = { ( ) => {
98+ handleDragDrop ( dragIndex , value . length )
99+ setDragIndex ( - 1 )
100+ } }
101+ />
102+ ) }
79103 < button
80104 onClick = { ( ) => {
81105 onChange ( value . concat ( [ itemSchema . defaultValue ] ) )
@@ -100,9 +124,11 @@ export default function FieldArray<T>(props: FieldArrayProps<T>) {
100124 )
101125}
102126
103- interface DropZoneProps { }
127+ interface DropZoneProps {
128+ onDrop ( ) : void
129+ }
104130
105- function DropZone ( ) {
131+ function DropZone ( { onDrop } : DropZoneProps ) {
106132 const [ hovered , setHovered ] = useState ( false )
107133 return (
108134 < div sx = { { position : 'relative' , height : '0px' } } >
@@ -124,8 +150,12 @@ function DropZone() {
124150 backgroundColor : hovered ? 'primary' : 'transparent' ,
125151 } ,
126152 } }
127- onDragOver = { ( ) => setHovered ( true ) }
153+ onDragEnter = { ( ) => setHovered ( true ) }
128154 onDragLeave = { ( ) => setHovered ( false ) }
155+ onDragOver = { ( e ) => {
156+ e . preventDefault ( )
157+ } }
158+ onDrop = { onDrop }
129159 > </ div >
130160 </ div >
131161 )
0 commit comments