From 0beac5c930fee596104c3f645dfee0db9d3cf008 Mon Sep 17 00:00:00 2001 From: Devin Binnie <52460000+devinbinnie@users.noreply.github.com> Date: Fri, 17 Jan 2025 09:55:09 -0500 Subject: [PATCH] [MM-62587] Hide thread_footer when root post is deleted (#29874) * [MM-62587] Hide thread_footer when root post is deleted * Also remove the replies line from the RHS * Fix logic to make sure post.delete_at exists * Fix playwright test --------- Co-authored-by: Mattermost Build --- .../channels/drafts/drafts_on_deleted_message.spec.ts | 2 +- .../channel_threads/thread_footer/thread_footer.tsx | 5 +++++ .../virtualized_thread_viewer/thread_viewer_row.tsx | 4 +++- .../virtualized_thread_viewer/virtualized_thread_viewer.tsx | 4 ++++ 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/e2e-tests/playwright/tests/functional/channels/drafts/drafts_on_deleted_message.spec.ts b/e2e-tests/playwright/tests/functional/channels/drafts/drafts_on_deleted_message.spec.ts index 9eb6846005d..3a82fb5e31d 100644 --- a/e2e-tests/playwright/tests/functional/channels/drafts/drafts_on_deleted_message.spec.ts +++ b/e2e-tests/playwright/tests/functional/channels/drafts/drafts_on_deleted_message.spec.ts @@ -62,7 +62,7 @@ test('MM-T5435_1 Global Drafts link in sidebar should be hidden when another use } // # Open the last post in the channel sent by admin again - await lastPostByAdmin.threadFooter.reply(); + await lastPostByAdmin.body.click(); // * Verify drafts in user's textbox is still visible const rhsTextboxValue = await sidebarRight.postCreate.getInputValue(); diff --git a/webapp/channels/src/components/threading/channel_threads/thread_footer/thread_footer.tsx b/webapp/channels/src/components/threading/channel_threads/thread_footer/thread_footer.tsx index 32ba2a30649..ba1e3cace16 100644 --- a/webapp/channels/src/components/threading/channel_threads/thread_footer/thread_footer.tsx +++ b/webapp/channels/src/components/threading/channel_threads/thread_footer/thread_footer.tsx @@ -10,6 +10,7 @@ import type {UserThread} from '@mattermost/types/threads'; import {threadIsSynthetic} from '@mattermost/types/threads'; import {setThreadFollow, getThread as fetchThread} from 'mattermost-redux/actions/threads'; +import {Posts} from 'mattermost-redux/constants'; import {getPost} from 'mattermost-redux/selectors/entities/posts'; import {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams'; import {makeGetThreadOrSynthetic} from 'mattermost-redux/selectors/entities/threads'; @@ -79,6 +80,10 @@ function ThreadFooter({ dispatch(setThreadFollow(currentUserId, currentTeamId, threadId, !isFollowing)); }, [isFollowing]); + if (post.delete_at > 0 || post.state === Posts.POST_DELETED) { + return null; + } + return (
{!isFollowing || threadIsSynthetic(thread) || !thread.unread_replies ? ( diff --git a/webapp/channels/src/components/threading/virtualized_thread_viewer/thread_viewer_row.tsx b/webapp/channels/src/components/threading/virtualized_thread_viewer/thread_viewer_row.tsx index 06f3e6efe04..201332781fb 100644 --- a/webapp/channels/src/components/threading/virtualized_thread_viewer/thread_viewer_row.tsx +++ b/webapp/channels/src/components/threading/virtualized_thread_viewer/thread_viewer_row.tsx @@ -24,6 +24,7 @@ type Props = { a11yIndex: number; currentUserId: string; isRootPost: boolean; + isDeletedPost: boolean; isLastPost: boolean; listId: string; onCardClick: (post: Post) => void; @@ -38,6 +39,7 @@ function ThreadViewerRow({ a11yIndex, currentUserId, isRootPost, + isDeletedPost, isLastPost, listId, onCardClick, @@ -76,7 +78,7 @@ function ThreadViewerRow({ timestampProps={timestampProps} location={Locations.RHS_ROOT} /> - + {!isDeletedPost && } ); case PostListUtils.isCombinedUserActivityPost(listId): { diff --git a/webapp/channels/src/components/threading/virtualized_thread_viewer/virtualized_thread_viewer.tsx b/webapp/channels/src/components/threading/virtualized_thread_viewer/virtualized_thread_viewer.tsx index d6eccc4fac6..cbb0a62a348 100644 --- a/webapp/channels/src/components/threading/virtualized_thread_viewer/virtualized_thread_viewer.tsx +++ b/webapp/channels/src/components/threading/virtualized_thread_viewer/virtualized_thread_viewer.tsx @@ -10,6 +10,7 @@ import AutoSizer from 'react-virtualized-auto-sizer'; import type {Post} from '@mattermost/types/posts'; import type {UserProfile} from '@mattermost/types/users'; +import {Posts} from 'mattermost-redux/constants'; import {getNewMessagesIndex, isDateLine, isStartOfNewMessages, isCreateComment} from 'mattermost-redux/utils/post_list'; import NewRepliesBanner from 'components/new_replies_banner'; @@ -349,6 +350,8 @@ class ThreadViewerVirtualized extends PureComponent { const isLastPost = itemId === this.props.lastPost.id; const isRootPost = itemId === this.props.selected.id; + const isDeletedPost = ('delete_at' in this.props.selected && this.props.selected.delete_at !== 0) || + ('state' in this.props.selected && this.props.selected.state === Posts.POST_DELETED); if (!isDateLine(itemId) && !isStartOfNewMessages(itemId) && !isCreateComment(itemId) && !isRootPost) { a11yIndex++; @@ -364,6 +367,7 @@ class ThreadViewerVirtualized extends PureComponent { currentUserId={this.props.currentUserId} isRootPost={isRootPost} isLastPost={isLastPost} + isDeletedPost={isDeletedPost} listId={itemId} onCardClick={this.props.onCardClick} previousPostId={getPreviousPostId(data, index)}