Skip to content

Commit dcd64b2

Browse files
committed
feat: confirm before deleting a referenced resource
1 parent ea85184 commit dcd64b2

File tree

4 files changed

+27
-2
lines changed

4 files changed

+27
-2
lines changed

web/src/components/MemoEditor/ResourceListView.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,29 @@ import { DndContext, closestCenter, MouseSensor, TouchSensor, useSensor, useSens
22
import { arrayMove, SortableContext, verticalListSortingStrategy } from "@dnd-kit/sortable";
33
import { XIcon } from "lucide-react";
44
import { Resource } from "@/types/proto/api/v1/resource_service";
5+
import { useTranslate } from "@/utils/i18n";
56
import ResourceIcon from "../ResourceIcon";
67
import SortableItem from "./SortableItem";
78

89
interface Props {
910
resourceList: Resource[];
1011
setResourceList: (resourceList: Resource[]) => void;
12+
checkIfSafeToDeleteResource?: (resource: Resource) => boolean;
1113
}
1214

1315
const ResourceListView = (props: Props) => {
14-
const { resourceList, setResourceList } = props;
16+
const { resourceList, setResourceList, checkIfSafeToDeleteResource } = props;
1517
const sensors = useSensors(useSensor(MouseSensor), useSensor(TouchSensor));
18+
const t = useTranslate();
1619

1720
const handleDeleteResource = async (name: string) => {
21+
if (
22+
typeof checkIfSafeToDeleteResource === "function" &&
23+
!checkIfSafeToDeleteResource(resourceList.find((resource) => resource.name === name)!)
24+
) {
25+
const confirmationText = t("resource.delete-confirm-referenced");
26+
if (!window.confirm(confirmationText)) return;
27+
}
1828
setResourceList(resourceList.filter((resource) => resource.name !== name));
1929
};
2030

web/src/components/MemoEditor/index.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { Resource } from "@/types/proto/api/v1/resource_service";
2020
import { UserSetting } from "@/types/proto/api/v1/user_service";
2121
import { useTranslate } from "@/utils/i18n";
2222
import { convertVisibilityFromString, convertVisibilityToString } from "@/utils/memo";
23+
import { getResourceUrl } from "@/utils/resource";
2324
import VisibilityIcon from "../VisibilityIcon";
2425
import AddMemoRelationPopover from "./ActionButton/AddMemoRelationPopover";
2526
import LocationSelector from "./ActionButton/LocationSelector";
@@ -187,6 +188,14 @@ const MemoEditor = observer((props: Props) => {
187188
}));
188189
};
189190

191+
const checkIfSafeToDeleteResource = (resource: Resource): boolean => {
192+
const content = editorRef.current?.getContent();
193+
const marker = `(${getResourceUrl(resource)})`;
194+
if (content && content.includes(marker)) return false; // referenced!
195+
196+
return true;
197+
};
198+
190199
const handleSetRelationList = (relationList: MemoRelation[]) => {
191200
setState((prevState) => ({
192201
...prevState,
@@ -513,7 +522,11 @@ const MemoEditor = observer((props: Props) => {
513522
/>
514523
)}
515524
<Editor ref={editorRef} {...editorConfig} />
516-
<ResourceListView resourceList={state.resourceList} setResourceList={handleSetResourceList} />
525+
<ResourceListView
526+
resourceList={state.resourceList}
527+
setResourceList={handleSetResourceList}
528+
checkIfSafeToDeleteResource={checkIfSafeToDeleteResource}
529+
/>
517530
<RelationListView relationList={referenceRelations} setRelationList={handleSetRelationList} />
518531
<div className="relative w-full flex flex-row justify-between items-center pt-2" onFocus={(e) => e.stopPropagation()}>
519532
<div className="flex flex-row justify-start items-center opacity-80 dark:opacity-60 space-x-2">

web/src/locales/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@
213213
"title": "Create Resource",
214214
"upload-method": "Upload method"
215215
},
216+
"delete-confirm-referenced": "Resource is referenced in memo content, delete anyway?",
216217
"delete-resource": "Delete Resource",
217218
"delete-selected-resources": "Delete Selected Resources",
218219
"fetching-data": "Fetching data…",

web/src/locales/zh-Hans.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@
205205
"title": "创建资源",
206206
"upload-method": "上传方式"
207207
},
208+
"delete-confirm-referenced": "资源在正文已中被引用,确定要删除吗?",
208209
"delete-resource": "删除资源",
209210
"delete-selected-resources": "删除选中资源",
210211
"fetching-data": "正在获取数据…",

0 commit comments

Comments
 (0)