fix comment editor issue (#20362)

This commit is contained in:
Shrushti Polekar 2025-03-21 22:52:40 +05:30 committed by GitHub
parent fc30e69442
commit d60fd97e17
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 75 additions and 15 deletions

View File

@ -14,7 +14,7 @@ import { Card, Col, Input, Space, Tooltip, Typography } from 'antd';
import classNames from 'classnames'; import classNames from 'classnames';
import { compare } from 'fast-json-patch'; import { compare } from 'fast-json-patch';
import { isUndefined } from 'lodash'; import { isUndefined } from 'lodash';
import React, { useMemo, useState } from 'react'; import React, { useEffect, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import { ASSET_CARD_STYLES } from '../../../constants/Feeds.constants'; import { ASSET_CARD_STYLES } from '../../../constants/Feeds.constants';
@ -75,6 +75,10 @@ const ActivityFeedCardNew = ({
const [isEditPost, setIsEditPost] = useState<boolean>(false); const [isEditPost, setIsEditPost] = useState<boolean>(false);
const { updateFeed } = useActivityFeedProvider(); const { updateFeed } = useActivityFeedProvider();
useEffect(() => {
setShowFeedEditor(false);
}, [feed.id]);
const onSave = (message: string) => { const onSave = (message: string) => {
postFeed(message, selectedThread?.id ?? '').catch(() => { postFeed(message, selectedThread?.id ?? '').catch(() => {
// ignore since error is displayed in toast in the parent promise. // ignore since error is displayed in toast in the parent promise.
@ -194,6 +198,10 @@ const ActivityFeedCardNew = ({
</Tooltip> </Tooltip>
) : null; ) : null;
const closeFeedEditor = () => {
setShowFeedEditor(false);
};
return ( return (
<Card <Card
className={classNames( className={classNames(
@ -331,6 +339,7 @@ const ActivityFeedCardNew = ({
.sort((a, b) => (b.postTs as number) - (a.postTs as number)) .sort((a, b) => (b.postTs as number) - (a.postTs as number))
.map((reply, index, arr) => ( .map((reply, index, arr) => (
<CommentCard <CommentCard
closeFeedEditor={closeFeedEditor}
feed={feed} feed={feed}
isLastReply={index === arr.length - 1} isLastReply={index === arr.length - 1}
key={reply.id} key={reply.id}

View File

@ -13,7 +13,13 @@
import { Tooltip, Typography } from 'antd'; import { Tooltip, Typography } from 'antd';
import classNames from 'classnames'; import classNames from 'classnames';
import { compare } from 'fast-json-patch'; import { compare } from 'fast-json-patch';
import React, { useCallback, useMemo, useState } from 'react'; import React, {
useCallback,
useEffect,
useMemo,
useRef,
useState,
} from 'react';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import { Thread } from '../../../generated/entity/feed/thread'; import { Thread } from '../../../generated/entity/feed/thread';
import { import {
@ -37,16 +43,42 @@ interface CommentCardInterface {
feed: Thread; feed: Thread;
post: any; post: any;
isLastReply: boolean; isLastReply: boolean;
closeFeedEditor: () => void;
} }
const CommentCard = ({ feed, post, isLastReply }: CommentCardInterface) => { const CommentCard = ({
feed,
post,
isLastReply,
closeFeedEditor,
}: CommentCardInterface) => {
const { updateFeed } = useActivityFeedProvider(); const { updateFeed } = useActivityFeedProvider();
const [isHovered, setIsHovered] = useState(false); const [isHovered, setIsHovered] = useState(false);
const [isEditPost, setIsEditPost] = useState<boolean>(false); const [isEditPost, setIsEditPost] = useState<boolean>(false);
const [postMessage, setPostMessage] = useState<string>(''); const [postMessage, setPostMessage] = useState<string>('');
const seperator = '.'; const seperator = '.';
const editorRef = useRef<HTMLDivElement>(null);
useEffect(() => {
const handleClickOutside = (event: MouseEvent) => {
if (
isEditPost &&
editorRef.current &&
!editorRef.current.contains(event.target as Node)
) {
setIsEditPost(false);
}
};
document.addEventListener('mousedown', handleClickOutside);
return () => {
document.removeEventListener('mousedown', handleClickOutside);
};
}, [isEditPost]);
const onEditPost = () => { const onEditPost = () => {
closeFeedEditor();
setIsEditPost(!isEditPost); setIsEditPost(!isEditPost);
}; };
@ -69,6 +101,7 @@ const CommentCard = ({ feed, post, isLastReply }: CommentCardInterface) => {
const feedBodyRender = useMemo(() => { const feedBodyRender = useMemo(() => {
if (isEditPost) { if (isEditPost) {
return ( return (
<div ref={editorRef}>
<ActivityFeedEditor <ActivityFeedEditor
focused focused
className="mb-8 reply-feed-editor" className="mb-8 reply-feed-editor"
@ -77,6 +110,7 @@ const CommentCard = ({ feed, post, isLastReply }: CommentCardInterface) => {
onSave={handleSave} onSave={handleSave}
onTextChange={(message) => setPostMessage(message)} onTextChange={(message) => setPostMessage(message)}
/> />
</div>
); );
} }

View File

@ -240,19 +240,26 @@
} }
.activity-feed-editor-container-new { .activity-feed-editor-container-new {
background-color: @grey-9; background-color: @grey-9;
border: none; border: 0.5px solid @blue-15;
border-radius: 10px; border-radius: 10px;
width: 100%; width: 100%;
.ql-container { .ql-container {
background-color: @grey-9; background-color: @grey-9;
border: none; border: 1px solid @blue-15;
width: 100%; width: 100%;
&:focus-within {
border: 0.5px solid @blue-15;
}
} }
.ql-toolbar { .ql-toolbar {
background-color: @grey-9; background-color: @grey-9;
border: none; border: 1px solid @blue-15;
border-bottom: 1px solid #d9d9d9;
flex-wrap: wrap; flex-wrap: wrap;
&:focus-within {
border: 0.5px solid @blue-15;
}
} }
.ql-toolbar button { .ql-toolbar button {
color: #292929; color: #292929;

View File

@ -994,6 +994,15 @@ export const TaskTabNew = ({
); );
}; };
const closeFeedEditor = () => {
setShowFeedEditor(false);
setComment('');
};
useEffect(() => {
closeFeedEditor();
}, [taskThread.id]);
return ( return (
<Row <Row
className="relative task-details-panel" className="relative task-details-panel"
@ -1088,6 +1097,7 @@ export const TaskTabNew = ({
.sort((a, b) => (b.postTs as number) - (a.postTs as number)) .sort((a, b) => (b.postTs as number) - (a.postTs as number))
.map((reply, index, arr) => ( .map((reply, index, arr) => (
<CommentCard <CommentCard
closeFeedEditor={closeFeedEditor}
feed={taskThread} feed={taskThread}
isLastReply={index === arr.length - 1} isLastReply={index === arr.length - 1}
key={reply.id} key={reply.id}