@@ -12,7 +12,7 @@ import { type ModelArtifact } from '@models/artifact'
1212import { getEmptyImage } from 'react-dnd-html5-backend'
1313import { useFileExplorer } from './context'
1414import FileExplorer from './FileExplorer'
15-
15+ import { useLongPress } from '@uidotdev/usehooks'
1616const Directory = function Directory ( {
1717 directory,
1818 className,
@@ -27,6 +27,17 @@ const Directory = function Directory({
2727 const [ newName , setNewName ] = useState < string > ( )
2828 const [ isOpen , setIsOpen ] = useState < boolean > ( directory . isOpened )
2929 const [ isOpenContextMenu , setIsOpenContextMenu ] = useState ( false )
30+ const [ isDraggable , setIsDraggable ] = useState ( false )
31+
32+ const attrs = useLongPress ( ( ) => setIsDraggable ( true ) , {
33+ threshold : 500 ,
34+ onFinish ( ) {
35+ setIsDraggable ( false )
36+ } ,
37+ onCancel ( ) {
38+ setIsDraggable ( false )
39+ } ,
40+ } )
3041
3142 const {
3243 activeRange,
@@ -60,13 +71,15 @@ const Directory = function Directory({
6071 return (
6172 monitor . isOver ( { shallow : true } ) &&
6273 isArrayNotEmpty ( artifacts ) &&
63- artifacts . every ( item => {
74+ artifacts . reduce ( ( acc , item ) => {
75+ if ( isFalse ( acc ) ) return false
76+
6477 if ( item . parent === directory || item === directory ) return false
6578 if ( item instanceof ModelDirectory && item . hasDirectory ( directory ) )
6679 return false
6780
6881 return true
69- } )
82+ } , true )
7083 )
7184 } ,
7285 collect ( monitor ) {
@@ -82,16 +95,19 @@ const Directory = function Directory({
8295 ( ) => ( {
8396 type : 'artifact' ,
8497 item : directory ,
98+ end ( ) {
99+ setIsDraggable ( false )
100+ } ,
85101 canDrag ( ) {
86- return isStringEmptyOrNil ( newName )
102+ return isStringEmptyOrNil ( newName ) && isDraggable
87103 } ,
88104 collect ( monitor ) {
89105 return {
90106 isDragging : monitor . isDragging ( ) ,
91107 }
92108 } ,
93109 } ) ,
94- [ directory , newName ] ,
110+ [ directory , newName , isDraggable ] ,
95111 )
96112
97113 const [ isAllDirectories , shouldClose , shouldOpen , shouldToggle ] =
@@ -183,11 +199,15 @@ const Directory = function Directory({
183199 className = { clsx ( isOver && isFalse ( isDragging ) && 'bg-brand-5' ) }
184200 >
185201 { directory . withParent && (
186- < div ref = { directory . withParent ? drag : undefined } >
202+ < div
203+ { ...attrs }
204+ ref = { directory . withParent ? drag : undefined }
205+ >
187206 < FileExplorer . Container
188207 artifact = { directory }
189208 className = { clsx (
190209 isFalse ( isStringEmptyOrNil ( newName ) ) && 'bg-primary-800' ,
210+ isDraggable && 'bg-primary-10 !cursor-grabbing' ,
191211 isOpenContextMenu && 'bg-primary-10' ,
192212 className ,
193213 ) }
0 commit comments