diff --git a/apps/api/plane/app/serializers/issue.py b/apps/api/plane/app/serializers/issue.py index 1eda376015b..8a643ce4dc3 100644 --- a/apps/api/plane/app/serializers/issue.py +++ b/apps/api/plane/app/serializers/issue.py @@ -667,16 +667,33 @@ class Meta: class IssueReactionLiteSerializer(DynamicBaseSerializer): + display_name = serializers.CharField(source="actor.display_name", read_only=True) + class Meta: model = IssueReaction - fields = ["id", "actor", "issue", "reaction"] + fields = ["id", "actor", "issue", "reaction", "display_name"] class CommentReactionSerializer(BaseSerializer): + display_name = serializers.CharField(source="actor.display_name", read_only=True) + class Meta: model = CommentReaction - fields = "__all__" - read_only_fields = ["workspace", "project", "comment", "actor", "deleted_at"] + fields = [ + "id", + "actor", + "comment", + "reaction", + "display_name", + "deleted_at", + "workspace", + "project", + "created_at", + "updated_at", + "created_by", + "updated_by", + ] + read_only_fields = ["workspace", "project", "comment", "actor", "deleted_at", "created_by", "updated_by"] class IssueVoteSerializer(BaseSerializer): diff --git a/apps/web/ce/components/comments/comment-block.tsx b/apps/web/ce/components/comments/comment-block.tsx index 42c9dbfd1b4..6ed7fc09461 100644 --- a/apps/web/ce/components/comments/comment-block.tsx +++ b/apps/web/ce/components/comments/comment-block.tsx @@ -2,9 +2,8 @@ import { FC, ReactNode, useRef } from "react"; import { observer } from "mobx-react"; // plane imports import { useTranslation } from "@plane/i18n"; -import { Tooltip } from "@plane/propel/tooltip"; -import { TIssueComment } from "@plane/types"; -import { Avatar } from "@plane/ui"; +import { EIssueCommentAccessSpecifier, TIssueComment } from "@plane/types"; +import { Avatar, Tooltip } from "@plane/ui"; import { calculateTimeAgo, cn, getFileURL, renderFormattedDate, renderFormattedTime } from "@plane/utils"; // hooks import { useMember } from "@/hooks/store/use-member"; @@ -27,7 +26,13 @@ export const CommentBlock: FC = observer((props) => { // translation const { t } = useTranslation(); - if (!comment || !userDetails) return null; + const displayName = comment?.actor_detail?.is_bot + ? comment?.actor_detail?.first_name + ` ${t("bot")}` + : (userDetails?.display_name ?? comment?.actor_detail?.display_name); + + const avatarUrl = userDetails?.avatar_url ?? comment?.actor_detail?.avatar_url; + + if (!comment) return null; return (
= observer((props) => { "flex-shrink-0 relative w-7 h-6 rounded-full transition-border duration-1000 flex justify-center items-center z-[3] uppercase font-medium" )} > - +
-
- {comment?.actor_detail?.is_bot - ? comment?.actor_detail?.first_name + ` ${t("bot")}` - : comment?.actor_detail?.display_name || userDetails.display_name} +
+ + {`${displayName}${comment.access === EIssueCommentAccessSpecifier.EXTERNAL ? " (External User)" : ""}`} +
commented{" "} diff --git a/apps/web/core/components/issues/issue-detail/reactions/issue-comment.tsx b/apps/web/core/components/issues/issue-detail/reactions/issue-comment.tsx index 4305ef6edec..911b4fe8a13 100644 --- a/apps/web/core/components/issues/issue-detail/reactions/issue-comment.tsx +++ b/apps/web/core/components/issues/issue-detail/reactions/issue-comment.tsx @@ -85,7 +85,9 @@ export const IssueCommentReaction: FC = observer((props) const reactionUsers = (reactionIds?.[reaction] || []) .map((reactionId) => { const reactionDetails = getCommentReactionById(reactionId); - return reactionDetails ? getUserDetails(reactionDetails.actor)?.display_name : null; + return reactionDetails + ? getUserDetails(reactionDetails?.actor)?.display_name || reactionDetails?.display_name + : null; }) .filter((displayName): displayName is string => !!displayName); const formattedUsers = formatTextList(reactionUsers); diff --git a/apps/web/core/components/issues/issue-detail/reactions/issue.tsx b/apps/web/core/components/issues/issue-detail/reactions/issue.tsx index 243b26aef04..ff5ae309962 100644 --- a/apps/web/core/components/issues/issue-detail/reactions/issue.tsx +++ b/apps/web/core/components/issues/issue-detail/reactions/issue.tsx @@ -85,7 +85,9 @@ export const IssueReaction: FC = observer((props) => { const reactionUsers = (reactionIds?.[reaction] || []) .map((reactionId) => { const reactionDetails = getReactionById(reactionId); - return reactionDetails ? getUserDetails(reactionDetails.actor)?.display_name : null; + return reactionDetails + ? getUserDetails(reactionDetails?.actor)?.display_name || reactionDetails?.display_name + : null; }) .filter((displayName): displayName is string => !!displayName); diff --git a/packages/types/src/issues/activity/issue_comment_reaction.ts b/packages/types/src/issues/activity/issue_comment_reaction.ts index 892a3e9065c..590b18ca5eb 100644 --- a/packages/types/src/issues/activity/issue_comment_reaction.ts +++ b/packages/types/src/issues/activity/issue_comment_reaction.ts @@ -9,6 +9,7 @@ export type TIssueCommentReaction = { updated_at: Date; created_by: string; updated_by: string; + display_name: string; }; export type TIssueCommentReactionMap = { diff --git a/packages/types/src/issues/issue_reaction.ts b/packages/types/src/issues/issue_reaction.ts index 49c971f4afe..bb0bf7a6a27 100644 --- a/packages/types/src/issues/issue_reaction.ts +++ b/packages/types/src/issues/issue_reaction.ts @@ -5,6 +5,7 @@ export type TIssueReaction = { id: string; issue: string; reaction: string; + display_name: string; }; export interface IIssuePublicReaction {