diff --git a/static/app/components/feedback/feedbackItem/feedbackActivitySection.spec.tsx b/static/app/components/feedback/feedbackItem/feedbackActivitySection.spec.tsx index d4d65a967e58..b86a8aee4e45 100644 --- a/static/app/components/feedback/feedbackItem/feedbackActivitySection.spec.tsx +++ b/static/app/components/feedback/feedbackItem/feedbackActivitySection.spec.tsx @@ -42,6 +42,7 @@ describe('FeedbackActivitySection', () => { { type: GroupActivityType.NOTE, id: 'note-1', + commentId: 'note-1', data: {text: 'Existing feedback note'}, dateCreated: '2020-01-01T00:00:00', user, @@ -89,6 +90,7 @@ describe('FeedbackActivitySection', () => { method: 'POST', body: { id: 'note-2', + commentId: 'note-2', user, type: 'note', data: {text: comment}, @@ -127,6 +129,7 @@ describe('FeedbackActivitySection', () => { { type: GroupActivityType.NOTE, id: 'note-1', + commentId: 'note-1', data: {text: 'Existing feedback note'}, dateCreated: '2020-01-01T00:00:00', user, diff --git a/static/app/types/group.tsx b/static/app/types/group.tsx index 40101c2b3522..00162b99aeca 100644 --- a/static/app/types/group.tsx +++ b/static/app/types/group.tsx @@ -708,11 +708,11 @@ export interface GroupActivityIntegrationData { } export interface GroupActivityNote extends GroupActivityBase { + commentId: string; data: { text: string; }; type: GroupActivityType.NOTE; - commentId?: string; } interface GroupActivitySetResolved extends GroupActivityBase { diff --git a/static/app/views/issueDetails/activitySection/activityLineItem.stories.tsx b/static/app/views/issueDetails/activitySection/activityLineItem.stories.tsx index 8d2c179c62a8..8cf90deb92c8 100644 --- a/static/app/views/issueDetails/activitySection/activityLineItem.stories.tsx +++ b/static/app/views/issueDetails/activitySection/activityLineItem.stories.tsx @@ -431,6 +431,7 @@ function activity( actor: GroupActivity['user'] = user ): GroupActivity { return { + ...(type === GroupActivityType.NOTE ? {commentId: type} : {}), data, dateCreated: '2025-01-01T00:00:00Z', id: type, diff --git a/static/app/views/issueDetails/activitySection/index.spec.tsx b/static/app/views/issueDetails/activitySection/index.spec.tsx index f59298aa3958..5c1ec6fd29ec 100644 --- a/static/app/views/issueDetails/activitySection/index.spec.tsx +++ b/static/app/views/issueDetails/activitySection/index.spec.tsx @@ -54,6 +54,7 @@ describe('ActivitySection', () => { { type: GroupActivityType.NOTE, id: 'note-1', + commentId: 'note-1', data: {text: 'Test Note'}, dateCreated: '2020-01-01T00:00:00', user, @@ -82,6 +83,7 @@ describe('ActivitySection', () => { method: 'POST', body: { id: 'note-2', + commentId: 'note-2', user: UserFixture({id: '2'}), type: 'note', data: {text: comment}, @@ -122,6 +124,7 @@ describe('ActivitySection', () => { method: 'POST', body: { id: 'note-3', + commentId: 'note-3', user: UserFixture({id: '2'}), type: 'note', data: {text: comment}, @@ -152,6 +155,7 @@ describe('ActivitySection', () => { method: 'POST', body: { id: 'note-4', + commentId: 'note-4', user: UserFixture({id: '2'}), type: 'note', data: {text: '@Jane Doe'}, @@ -181,12 +185,14 @@ describe('ActivitySection', () => { ); }); - it.each([ - {id: '123', commentId: undefined}, - {id: '987', commentId: '123'}, - ])('deletes only the comment with identity %j', async identity => { + it('deletes only the referenced comment', async () => { jest.spyOn(indicators, 'addSuccessMessage'); - const note = ActivityFeedFixture({...identity, user, data: {text: 'Test Note'}}); + const note = ActivityFeedFixture({ + id: '987', + commentId: '123', + user, + data: {text: 'Test Note'}, + }); const resolution = ActivityFeedFixture({ id: '123', type: GroupActivityType.SET_RESOLVED, @@ -234,6 +240,7 @@ describe('ActivitySection', () => { { type: GroupActivityType.NOTE, id: 'note-1', + commentId: 'note-1', data: {text: 'Undeletable Note'}, dateCreated: '2020-01-01T00:00:00', user, @@ -274,6 +281,7 @@ describe('ActivitySection', () => { { type: GroupActivityType.NOTE, id: 'note-1', + commentId: 'note-1', data: {text: '**Bold Note** and [docs](https://docs.sentry.io/)'}, dateCreated: tenMinutesAgo(), user, @@ -305,6 +313,7 @@ describe('ActivitySection', () => { { type: GroupActivityType.NOTE, id: 'note-1', + commentId: 'note-1', data: {text: 'User note'}, dateCreated: '2020-01-01T00:00:00', user, @@ -875,6 +884,7 @@ describe('ActivitySection', () => { { type: GroupActivityType.NOTE, id: 'note-1', + commentId: 'note-1', data: {text: 'This note came from my sentry app'}, dateCreated: '2020-01-01T00:00:00', sentry_app: sentryApp, @@ -932,6 +942,7 @@ describe('ActivitySection', () => { { type: GroupActivityType.NOTE, id: 'note-1', + commentId: 'note-1', data: {text: 'Test Note'}, dateCreated: '2020-01-01T00:00:00', user: UserFixture({id: '2'}), @@ -959,6 +970,7 @@ describe('ActivitySection', () => { const activities: GroupActivity[] = Array.from({length: 7}, (_, index) => ({ type: GroupActivityType.NOTE, id: `note-${index + 1}`, + commentId: `note-${index + 1}`, data: {text: `Test Note ${index + 1}`}, dateCreated: '2020-01-01T00:00:00', user: UserFixture({id: '2'}), @@ -989,6 +1001,7 @@ describe('ActivitySection', () => { const activities: GroupActivity[] = Array.from({length: 3}, (_, index) => ({ type: GroupActivityType.NOTE, id: `note-${index + 1}`, + commentId: `note-${index + 1}`, data: {text: `Test Note ${index + 1}`}, dateCreated: '2020-01-01T00:00:00', user: UserFixture({id: '2'}), @@ -1026,6 +1039,7 @@ describe('ActivitySection', () => { const activities: GroupActivity[] = Array.from({length: 7}, (_, index) => ({ type: GroupActivityType.NOTE, id: `note-${index + 1}`, + commentId: `note-${index + 1}`, data: {text: `Test Note ${index + 1}`}, dateCreated: tenMinutesAgo(), user: UserFixture({id: '2'}), @@ -1114,6 +1128,7 @@ describe('ActivitySection', () => { const activities: GroupActivity[] = Array.from({length: 3}, (_, index) => ({ type: GroupActivityType.NOTE, id: `note-${index + 1}`, + commentId: `note-${index + 1}`, data: {text: `Test Note ${index + 1}`}, dateCreated: '2020-01-01T00:00:00', user: UserFixture({id: '2'}), @@ -1788,6 +1803,7 @@ describe('ActivitySection', () => { { type: GroupActivityType.NOTE, id: 'note-between-pull-request-activities', + commentId: 'note-between-pull-request-activities', dateCreated: '2020-01-01T00:01:00', data: {text: 'An activity between the pull request activities'}, user, @@ -2065,6 +2081,7 @@ describe('ActivitySection', () => { { type: GroupActivityType.NOTE, id: 'activity-during-rca', + commentId: 'activity-during-rca', dateCreated: '2020-01-01T00:02:00Z', data: {text: 'Checked during analysis'}, user, diff --git a/static/app/views/issueDetails/activitySection/index.tsx b/static/app/views/issueDetails/activitySection/index.tsx index dcbfba17f524..a59b4ecc5508 100644 --- a/static/app/views/issueDetails/activitySection/index.tsx +++ b/static/app/views/issueDetails/activitySection/index.tsx @@ -44,7 +44,7 @@ interface ActivityFeedRowProps { function getActivityKey(activity: GroupActivity): string { return isActivityNote(activity) - ? `comment:${activity.commentId ?? activity.id}` + ? `comment:${activity.commentId}` : `activity:${activity.id}`; } @@ -151,28 +151,27 @@ export function ActivitySection({ } async function handleDelete(item: GroupActivityNote) { - const commentId = item.commentId ?? item.id; + const commentId = item.commentId; await deleteComment(commentId); trackAnalytics('issue_details.comment_deleted', {organization}); addSuccessMessage(t('Comment removed')); onActivityChange?.( activities.filter( - activity => - !isActivityNote(activity) || (activity.commentId ?? activity.id) !== commentId + activity => !isActivityNote(activity) || activity.commentId !== commentId ) ); } async function handleUpdate(item: GroupActivityNote, data: NoteType) { try { - const commentId = item.commentId ?? item.id; + const commentId = item.commentId; const result = await updateComment(commentId, data); trackAnalytics('issue_details.comment_updated', {organization}); addSuccessMessage(t('Comment updated')); onActivityChange?.( activities.map(activity => - isActivityNote(activity) && (activity.commentId ?? activity.id) === commentId - ? {...activity, commentId, data: {...activity.data, ...result.data}} + isActivityNote(activity) && activity.commentId === commentId + ? {...activity, data: {...activity.data, ...result.data}} : activity ) ); diff --git a/static/app/views/issueDetails/activitySection/useMutateActivity.tsx b/static/app/views/issueDetails/activitySection/useMutateActivity.tsx index 92bde5295897..a7e09c4506e3 100644 --- a/static/app/views/issueDetails/activitySection/useMutateActivity.tsx +++ b/static/app/views/issueDetails/activitySection/useMutateActivity.tsx @@ -86,11 +86,9 @@ export function useMutateActivity({organization, group}: Props) { case 'PUT': return updateGroup( prev.json.activity.map(item => - item.type === GroupActivityType.NOTE && - (item.commentId ?? item.id) === mutation.noteId + item.type === GroupActivityType.NOTE && item.commentId === mutation.noteId ? { ...item, - commentId: mutation.noteId, data: {...item.data, ...result.data}, } : item @@ -102,7 +100,7 @@ export function useMutateActivity({organization, group}: Props) { prev.json.activity.filter( item => item.type !== GroupActivityType.NOTE || - (item.commentId ?? item.id) !== mutation.noteId + item.commentId !== mutation.noteId ), prev.json.numComments - 1 ); diff --git a/static/app/views/issueDetails/sidebar/sidebar.spec.tsx b/static/app/views/issueDetails/sidebar/sidebar.spec.tsx index a83b3cccde02..f108969d4c65 100644 --- a/static/app/views/issueDetails/sidebar/sidebar.spec.tsx +++ b/static/app/views/issueDetails/sidebar/sidebar.spec.tsx @@ -32,6 +32,7 @@ describe('IssueDetailsSidebar', () => { { type: GroupActivityType.NOTE, id: 'note-1', + commentId: 'note-1', data: {text: activityContent}, dateCreated: '2020-01-01T00:00:00', user, diff --git a/static/app/views/issueList/progressActivityTooltip.spec.tsx b/static/app/views/issueList/progressActivityTooltip.spec.tsx index aaa6da11a890..c36992423e65 100644 --- a/static/app/views/issueList/progressActivityTooltip.spec.tsx +++ b/static/app/views/issueList/progressActivityTooltip.spec.tsx @@ -96,6 +96,7 @@ describe('ProgressActivityTooltip', () => { it('shows comment text', async () => { const noteActivity: GroupActivity = { id: 'activity-4', + commentId: 'activity-4', type: GroupActivityType.NOTE, data: {text: 'This is the useful part of the comment.'}, dateCreated: '2024-01-04T00:00:00.000Z', diff --git a/tests/js/fixtures/activityFeed.ts b/tests/js/fixtures/activityFeed.ts index 805a6ee8462a..a65ade05f502 100644 --- a/tests/js/fixtures/activityFeed.ts +++ b/tests/js/fixtures/activityFeed.ts @@ -8,6 +8,7 @@ import {GroupActivityType, IssueCategory, IssueType} from 'sentry/types/group'; export function ActivityFeedFixture(params: Partial = {}): Activity { return { + commentId: params.id ?? '42', data: {text: 'Very interesting comment'}, dateCreated: '2019-04-29T21:43:32.280Z', user: UserFixture({