feat(core): add confirm modal for delete tag action (#6268)

This commit is contained in:
JimmFly
2024-03-23 12:03:14 +00:00
parent 3c6983ee49
commit 532d655ffb
7 changed files with 125 additions and 21 deletions

View File

@@ -1,3 +1,4 @@
export { Tag } from './entities/tag';
export { tagColorMap } from './entities/utils';
export { TagService } from './service/tag';
export { DeleteTagConfirmModal } from './view/delete-tag-modal';

View File

@@ -0,0 +1,65 @@
import { ConfirmModal, toast } from '@affine/component';
import { Trans } from '@affine/i18n';
import { useAFFiNEI18N } from '@affine/i18n/hooks';
import { useLiveData, useService } from '@toeverything/infra';
import { useCallback, useMemo } from 'react';
import { TagService } from '../service/tag';
export const DeleteTagConfirmModal = ({
open,
onOpenChange,
selectedTagIds,
}: {
open: boolean;
onOpenChange: (open: boolean) => void;
selectedTagIds: string[];
}) => {
const t = useAFFiNEI18N();
const tagService = useService(TagService);
const tags = useLiveData(tagService.tags);
const selectedTags = useMemo(() => {
return tags.filter(tag => selectedTagIds.includes(tag.id));
}, [selectedTagIds, tags]);
const tagName = useLiveData(selectedTags[0]?.value || '');
const handleDelete = useCallback(() => {
selectedTagIds.forEach(tagId => {
tagService.deleteTag(tagId);
});
toast(
selectedTagIds.length > 1
? t['com.affine.delete-tags.count']({ count: selectedTagIds.length })
: t['com.affine.tags.delete-tags.toast']()
);
onOpenChange(false);
}, [onOpenChange, selectedTagIds, t, tagService]);
return (
<ConfirmModal
open={open}
onOpenChange={onOpenChange}
title={t['com.affine.delete-tags.confirm.title']()}
description={
selectedTags.length === 1 ? (
<Trans
i18nKey={'com.affine.delete-tags.confirm.description'}
values={{ tag: tagName }}
components={{ 1: <strong /> }}
/>
) : (
t['com.affine.delete-tags.confirm.multi-tag-description']({
count: selectedTags.length.toString(),
})
)
}
confirmButtonOptions={{
type: 'warning',
children: t['Delete'](),
}}
onConfirm={handleDelete}
/>
);
};