@@ -533,97 +533,116 @@ function execOperation(type, action, url, $target, name) {
533533 CASE += $target . collapsed ? 1 : 0 ;
534534
535535 startLoading ( ) ;
536- const fs = fsOperation ( clipBoard . url ) ;
537- let newUrl ;
538- if ( clipBoard . action === "cut" ) newUrl = await fs . moveTo ( url ) ;
539- else newUrl = await fs . copyTo ( url ) ;
540- const { name : newName } = await fsOperation ( newUrl ) . stat ( ) ;
541- stopLoading ( ) ;
542- /**
543- * CASES:
544- * CASE 111: src is file and parent is collapsed where target is also collapsed
545- * CASE 110: src is file and parent is collapsed where target is unclasped
546- * CASE 101: src is file and parent is unclasped where target is collapsed
547- * CASE 100: src is file and parent is unclasped where target is also unclasped
548- * CASE 011: src is directory and parent is collapsed where target is also collapsed
549- * CASE 001: src is directory and parent is unclasped where target is also collapsed
550- * CASE 010: src is directory and parent is collapsed where target is also unclasped
551- * CASE 000: src is directory and parent is unclasped where target is also unclasped
552- */
553-
554- if ( clipBoard . action === "cut" ) {
555- //move
556-
557- if ( IS_FILE ) {
558- const file = editorManager . getFile ( clipBoard . url , "uri" ) ;
559- if ( file ) file . uri = newUrl ;
560- } else if ( IS_DIR ) {
561- helpers . updateUriOfAllActiveFiles ( clipBoard . url , newUrl ) ;
536+ try {
537+ const fs = fsOperation ( clipBoard . url ) ;
538+ const itemName = Url . basename ( clipBoard . url ) ;
539+ const possibleConflictUrl = Url . join ( url , itemName ) ;
540+ const doesExist = await fsOperation ( possibleConflictUrl ) . exists ( ) ;
541+ if ( doesExist ) {
542+ alert (
543+ strings . error ,
544+ strings [ "already exists" ]
545+ ? strings [ "already exists" ] . replace ( "{name}" , itemName )
546+ : `"${ itemName } " already exists in this location.` ,
547+ ) ;
548+ return ;
562549 }
550+ let newUrl ;
551+ if ( clipBoard . action === "cut" ) newUrl = await fs . moveTo ( url ) ;
552+ else newUrl = await fs . copyTo ( url ) ;
553+ const { name : newName } = await fsOperation ( newUrl ) . stat ( ) ;
554+ stopLoading ( ) ;
555+ /**
556+ * CASES:
557+ * CASE 111: src is file and parent is collapsed where target is also collapsed
558+ * CASE 110: src is file and parent is collapsed where target is unclasped
559+ * CASE 101: src is file and parent is unclasped where target is collapsed
560+ * CASE 100: src is file and parent is unclasped where target is also unclasped
561+ * CASE 011: src is directory and parent is collapsed where target is also collapsed
562+ * CASE 001: src is directory and parent is unclasped where target is also collapsed
563+ * CASE 010: src is directory and parent is collapsed where target is also unclasped
564+ * CASE 000: src is directory and parent is unclasped where target is also unclasped
565+ */
566+
567+ if ( clipBoard . action === "cut" ) {
568+ //move
569+
570+ if ( IS_FILE ) {
571+ const file = editorManager . getFile ( clipBoard . url , "uri" ) ;
572+ if ( file ) file . uri = newUrl ;
573+ } else if ( IS_DIR ) {
574+ helpers . updateUriOfAllActiveFiles ( clipBoard . url , newUrl ) ;
575+ }
563576
564- switch ( CASE ) {
565- case "111" :
566- case "011" :
567- break ;
577+ switch ( CASE ) {
578+ case "111" :
579+ case "011" :
580+ break ;
568581
569- case "110" :
570- appendTile ( $target , createFileTile ( newName , newUrl ) ) ;
571- break ;
582+ case "110" :
583+ appendTile ( $target , createFileTile ( newName , newUrl ) ) ;
584+ break ;
572585
573- case "101" :
574- $src . remove ( ) ;
575- break ;
586+ case "101" :
587+ $src . remove ( ) ;
588+ break ;
576589
577- case "100" :
578- appendTile ( $target , createFileTile ( newName , newUrl ) ) ;
579- $src . remove ( ) ;
580- break ;
590+ case "100" :
591+ appendTile ( $target , createFileTile ( newName , newUrl ) ) ;
592+ $src . remove ( ) ;
593+ break ;
581594
582- case "001" :
583- $src . parentElement . remove ( ) ;
584- break ;
595+ case "001" :
596+ $src . parentElement . remove ( ) ;
597+ break ;
585598
586- case "010" :
587- appendList ( $target , createFolderTile ( newName , newUrl ) ) ;
588- break ;
599+ case "010" :
600+ appendList ( $target , createFolderTile ( newName , newUrl ) ) ;
601+ break ;
589602
590- case "000" :
591- appendList ( $target , createFolderTile ( newName , newUrl ) ) ;
592- $src . parentElement . remove ( ) ;
593- break ;
603+ case "000" :
604+ appendList ( $target , createFolderTile ( newName , newUrl ) ) ;
605+ $src . parentElement . remove ( ) ;
606+ break ;
594607
595- default :
596- break ;
597- }
598- FileList . remove ( clipBoard . url ) ;
599- } else {
600- //copy
601-
602- switch ( CASE ) {
603- case "111" :
604- case "101" :
605- case "011" :
606- case "001" :
607- break ;
608-
609- case "110" :
610- case "100" :
611- appendTile ( $target , createFileTile ( newName , newUrl ) ) ;
612- break ;
613-
614- case "010" :
615- case "000" :
616- appendList ( $target , createFolderTile ( newName , newUrl ) ) ;
617- break ;
618-
619- default :
620- break ;
608+ default :
609+ break ;
610+ }
611+ FileList . remove ( clipBoard . url ) ;
612+ } else {
613+ //copy
614+
615+ switch ( CASE ) {
616+ case "111" :
617+ case "101" :
618+ case "011" :
619+ case "001" :
620+ break ;
621+
622+ case "110" :
623+ case "100" :
624+ appendTile ( $target , createFileTile ( newName , newUrl ) ) ;
625+ break ;
626+
627+ case "010" :
628+ case "000" :
629+ appendList ( $target , createFolderTile ( newName , newUrl ) ) ;
630+ break ;
631+
632+ default :
633+ break ;
634+ }
621635 }
622- }
623636
624- FileList . append ( url , newUrl ) ;
625- toast ( strings . success ) ;
626- clearClipboard ( ) ;
637+ FileList . append ( url , newUrl ) ;
638+ toast ( strings . success ) ;
639+ clearClipboard ( ) ;
640+ } catch ( error ) {
641+ console . error ( error ) ;
642+ helpers . error ( error ) ;
643+ } finally {
644+ stopLoading ( ) ;
645+ }
627646 }
628647
629648 async function insertFile ( ) {
0 commit comments