Files
AFFiNE-Mirror/libs/components/editor-plugins/src/comment/use-add-comment.ts
T
2022-07-22 15:49:21 +08:00

79 lines
2.3 KiB
TypeScript

import { useState, useCallback } from 'react';
import { useParams } from 'react-router-dom';
import { services } from '@toeverything/datasource/db-service';
import { WithEditorSelectionType } from '../menu/inline-menu/types';
export const useAddComment = ({
editor,
selectionInfo,
setShow,
}: WithEditorSelectionType) => {
const { workspace_id: workspaceId, page_id: pageId } = useParams();
const [currentComment, setCurrentComment] = useState('');
const createComment = useCallback(async (): Promise<{
commentsId: string;
}> => {
const selectedBlockId = selectionInfo?.anchorNode?.id;
if (!currentComment || !currentComment.trim()) {
throw new Error(
'Comment content must not be empty before creating in db. '
);
}
if (!selectedBlockId) {
throw new Error(
'Commented block id must not be empty before creating in db. '
);
}
const created = await services.api.commentService.createComment({
workspace: workspaceId,
pageId: pageId,
attachedToBlocksIds: [selectionInfo.anchorNode.id],
quote: {
value: [
{
text: editor.blockHelper.getBlockTextBetweenSelection(
selectedBlockId
),
},
],
},
content: {
value: [{ text: currentComment }],
},
});
return created;
}, [
currentComment,
editor.blockHelper,
pageId,
selectionInfo?.anchorNode?.id,
workspaceId,
]);
const handleSubmitCurrentComment = useCallback(async () => {
const textBlockId = selectionInfo.anchorNode.id;
if (!textBlockId) return;
const created = await createComment();
const commentId = created?.commentsId;
if (commentId) {
editor.blockHelper.addComment(textBlockId, commentId);
setShow(false);
}
}, [
createComment,
editor.blockHelper,
selectionInfo.anchorNode.id,
setShow,
]);
return {
currentComment,
setCurrentComment,
createComment,
handleSubmitCurrentComment,
};
};