diff --git a/src/apps/opportunities/src/components/ChallengeForum.spec.tsx b/src/apps/opportunities/src/components/ChallengeForum.spec.tsx index d371310ea..4bd6d986d 100644 --- a/src/apps/opportunities/src/components/ChallengeForum.spec.tsx +++ b/src/apps/opportunities/src/components/ChallengeForum.spec.tsx @@ -581,6 +581,40 @@ describe('ChallengeForum', () => { .toBeUndefined() }) + it('shows an edit timestamp for changed starter posts and replies only', async () => { + const editedAt = '2026-06-08T12:30:00.000Z' + topicDetail = { + posts: [{ + ...starterPost, + replies: [{ ...starterPost.replies[0], updatedAt: editedAt }], + updatedAt: editedAt, + }], + topic: announcement, + } + const { container }: RenderResult = render( + , + ) + await act(async () => fireEvent.click(container.querySelector('.topicOverlay') as HTMLButtonElement)) + expect(screen.getAllByText(/^Edited:/)) + .toHaveLength(2) + screen.getAllByText(/^Edited:/) + .forEach(timestamp => { + expect(timestamp) + .toHaveAttribute('datetime', editedAt) + expect(timestamp) + .toHaveTextContent(formatForumDate(editedAt)) + }) + }) + + it('does not mark unchanged posts as edited', async () => { + const { container }: RenderResult = render( + , + ) + await act(async () => fireEvent.click(container.querySelector('.topicOverlay') as HTMLButtonElement)) + expect(screen.queryByText(/^Edited:/)) + .not.toBeInTheDocument() + }) + it('opens the topic when the upper card is clicked, keeping the footer for actions', async () => { const { container }: RenderResult = render( , diff --git a/src/apps/opportunities/src/components/ChallengeForum.tsx b/src/apps/opportunities/src/components/ChallengeForum.tsx index 4af910bdb..9cd86e012 100644 --- a/src/apps/opportunities/src/components/ChallengeForum.tsx +++ b/src/apps/opportunities/src/components/ChallengeForum.tsx @@ -1197,6 +1197,13 @@ const ForumPostCard: FC<{ {' '} {formatForumDate(post.createdAt)} + {!post.deleted && Date.parse(post.updatedAt) > Date.parse(post.createdAt) && ( + + )} {props.parent && ( Replying to