Implemented group story reaction delete/DOE

This commit is contained in:
Alvaro 2022-11-10 13:59:48 -07:00 committed by GitHub
parent 45069673ce
commit 810cbb5fe5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -306,6 +306,14 @@ export const StoryViewsNRepliesModal = ({
let repliesElement: JSX.Element | undefined; let repliesElement: JSX.Element | undefined;
function shouldCollapse(reply: ReplyType, otherReply?: ReplyType) {
// deleted reactions get rendered the same as deleted replies
return (
reply.conversationId === otherReply?.conversationId &&
(!otherReply?.reactionEmoji || Boolean(otherReply.deletedForEveryone))
);
}
if (replies.length) { if (replies.length) {
repliesElement = ( repliesElement = (
<div <div
@ -313,33 +321,19 @@ export const StoryViewsNRepliesModal = ({
ref={containerElementRef} ref={containerElementRef}
> >
{replies.map((reply, index) => { {replies.map((reply, index) => {
return reply.reactionEmoji ? ( return (
<Reaction <ReplyOrReactionMessage
key={reply.id} key={reply.id}
i18n={i18n} i18n={i18n}
reply={reply} reply={reply}
reactionEmoji={reply.reactionEmoji}
getPreferredBadge={getPreferredBadge}
/>
) : (
<Reply
key={reply.id}
i18n={i18n}
containerElementRef={containerElementRef}
reply={reply}
deleteGroupStoryReply={() => setDeleteReplyId(reply.id)} deleteGroupStoryReply={() => setDeleteReplyId(reply.id)}
deleteGroupStoryReplyForEveryone={() => deleteGroupStoryReplyForEveryone={() =>
setDeleteForEveryoneReplyId(reply.id) setDeleteForEveryoneReplyId(reply.id)
} }
getPreferredBadge={getPreferredBadge} getPreferredBadge={getPreferredBadge}
shouldCollapseAbove={ shouldCollapseAbove={shouldCollapse(reply, replies[index - 1])}
reply.conversationId === replies[index - 1]?.conversationId && shouldCollapseBelow={shouldCollapse(reply, replies[index + 1])}
!replies[index - 1]?.reactionEmoji containerElementRef={containerElementRef}
}
shouldCollapseBelow={
reply.conversationId === replies[index + 1]?.conversationId &&
!replies[index + 1]?.reactionEmoji
}
/> />
); );
})} })}
@ -505,22 +499,35 @@ export const StoryViewsNRepliesModal = ({
); );
}; };
type ReactionProps = { type ReplyOrReactionMessageProps = {
i18n: LocalizerType; i18n: LocalizerType;
reply: ReplyType; reply: ReplyType;
reactionEmoji: string; deleteGroupStoryReply: (replyId: string) => void;
deleteGroupStoryReplyForEveryone: (replyId: string) => void;
getPreferredBadge: PreferredBadgeSelectorType; getPreferredBadge: PreferredBadgeSelectorType;
shouldCollapseAbove: boolean;
shouldCollapseBelow: boolean;
containerElementRef: React.RefObject<HTMLElement>;
onContextMenu?: (ev: React.MouseEvent) => void;
}; };
const Reaction = ({ const ReplyOrReactionMessage = ({
i18n, i18n,
reply, reply,
reactionEmoji, deleteGroupStoryReply,
deleteGroupStoryReplyForEveryone,
containerElementRef,
getPreferredBadge, getPreferredBadge,
}: ReactionProps): JSX.Element => { shouldCollapseAbove,
// TODO: DESKTOP-4503 - reactions delete/doe shouldCollapseBelow,
}: ReplyOrReactionMessageProps) => {
const renderContent = (onContextMenu?: (ev: React.MouseEvent) => void) => {
if (reply.reactionEmoji && !reply.deletedForEveryone) {
return ( return (
<div className="StoryViewsNRepliesModal__reaction" key={reply.id}> <div
className="StoryViewsNRepliesModal__reaction"
onContextMenu={onContextMenu}
>
<div className="StoryViewsNRepliesModal__reaction--container"> <div className="StoryViewsNRepliesModal__reaction--container">
<Avatar <Avatar
acceptedMessageRequest={reply.author.acceptedMessageRequest} acceptedMessageRequest={reply.author.acceptedMessageRequest}
@ -552,34 +559,12 @@ const Reaction = ({
/> />
</div> </div>
</div> </div>
<Emojify text={reactionEmoji} /> <Emojify text={reply.reactionEmoji} />
</div> </div>
); );
}; }
type ReplyProps = { return (
i18n: LocalizerType;
reply: ReplyType;
deleteGroupStoryReply: (replyId: string) => void;
deleteGroupStoryReplyForEveryone: (replyId: string) => void;
getPreferredBadge: PreferredBadgeSelectorType;
shouldCollapseAbove: boolean;
shouldCollapseBelow: boolean;
containerElementRef: React.RefObject<HTMLElement>;
};
const Reply = ({
i18n,
reply,
deleteGroupStoryReply,
deleteGroupStoryReplyForEveryone,
getPreferredBadge,
shouldCollapseAbove,
shouldCollapseBelow,
containerElementRef,
}: ReplyProps): JSX.Element => {
const renderMessage = (onContextMenu?: (ev: React.MouseEvent) => void) => (
<div key={reply.id}>
<Message <Message
{...MESSAGE_DEFAULT_PROPS} {...MESSAGE_DEFAULT_PROPS}
author={reply.author} author={reply.author}
@ -607,10 +592,10 @@ const Reply = ({
textDirection={TextDirection.Default} textDirection={TextDirection.Default}
timestamp={reply.timestamp} timestamp={reply.timestamp}
/> />
</div>
); );
};
return reply.author.isMe ? ( return reply.author.isMe && !reply.deletedForEveryone ? (
<ContextMenu <ContextMenu
i18n={i18n} i18n={i18n}
key={reply.id} key={reply.id}
@ -629,12 +614,12 @@ const Reply = ({
> >
{({ openMenu, menuNode }) => ( {({ openMenu, menuNode }) => (
<> <>
{renderMessage(openMenu)} {renderContent(openMenu)}
{menuNode} {menuNode}
</> </>
)} )}
</ContextMenu> </ContextMenu>
) : ( ) : (
renderMessage() renderContent()
); );
}; };