Skip to content

Commit 40d9832

Browse files
authored
feat: improve paste operation by proper error handling (#1162)
1 parent 6289207 commit 40d9832

File tree

1 file changed

+99
-80
lines changed

1 file changed

+99
-80
lines changed

src/lib/openFolder.js

Lines changed: 99 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)