diff --git a/static/app/views/issueDetails/activitySection/activityLineItem/activityFeedItem.ts b/static/app/views/issueDetails/activitySection/activityLineItem/activityFeedItem.ts index 0190d526a928..3c537e5b8ead 100644 --- a/static/app/views/issueDetails/activitySection/activityLineItem/activityFeedItem.ts +++ b/static/app/views/issueDetails/activitySection/activityLineItem/activityFeedItem.ts @@ -29,6 +29,7 @@ export type ActivityFeedItem = | { activity: GroupActivity; type: 'activity'; + actorActivity?: GroupActivity; } | CollapsedSeerActivity; diff --git a/static/app/views/issueDetails/activitySection/activityLineItem/index.tsx b/static/app/views/issueDetails/activitySection/activityLineItem/index.tsx index 5e152566cc90..dc69b797430e 100644 --- a/static/app/views/issueDetails/activitySection/activityLineItem/index.tsx +++ b/static/app/views/issueDetails/activitySection/activityLineItem/index.tsx @@ -33,10 +33,12 @@ export function ActivityLine({item, group, timestampUnitStyle}: ActivityLineProp const timestamp = ( ); - const actorActivity = - item.type === GroupActivityType.SEER_ITERATION_COMPLETED - ? item.startedActivity - : activity; + let actorActivity = activity; + if (item.type === GroupActivityType.SEER_ITERATION_COMPLETED) { + actorActivity = item.startedActivity; + } else if (item.type === 'activity' && item.actorActivity) { + actorActivity = item.actorActivity; + } return ( diff --git a/static/app/views/issueDetails/activitySection/index.spec.tsx b/static/app/views/issueDetails/activitySection/index.spec.tsx index fb3293e9b550..f7425d8cabc2 100644 --- a/static/app/views/issueDetails/activitySection/index.spec.tsx +++ b/static/app/views/issueDetails/activitySection/index.spec.tsx @@ -1609,6 +1609,7 @@ describe('ActivitySection', () => { ); expect(await screen.findByText('Referenced in pull request')).toBeInTheDocument(); + expect(screen.getByRole('img', {name: 'Seer activity'})).toBeInTheDocument(); expect(screen.getAllByRole('link', {name: `#${pullRequest.id}`})).toHaveLength(1); }); diff --git a/static/app/views/issueDetails/activitySection/index.tsx b/static/app/views/issueDetails/activitySection/index.tsx index ec5566643666..8c9eb9932452 100644 --- a/static/app/views/issueDetails/activitySection/index.tsx +++ b/static/app/views/issueDetails/activitySection/index.tsx @@ -137,14 +137,24 @@ function isDuplicatePullRequestActivity( } } -function removeAdjacentDuplicatePullRequestActivities( - activities: GroupActivity[] -): GroupActivity[] { - return activities.filter( - (activity, index) => - !isDuplicatePullRequestActivity(activity, activities[index - 1]) && - !isDuplicatePullRequestActivity(activity, activities[index + 1]) - ); +function removeAdjacentDuplicatePullRequestActivities(activities: GroupActivity[]): { + activities: GroupActivity[]; + actorActivityById: Map; +} { + const actorActivityById = new Map(); + const filteredActivities = activities.filter((activity, index) => { + const duplicateActivity = [activities[index - 1], activities[index + 1]].find( + adjacentActivity => isDuplicatePullRequestActivity(activity, adjacentActivity) + ); + + if (activity.type === GroupActivityType.SEER_PR_CREATED && duplicateActivity) { + actorActivityById.set(duplicateActivity.id, activity); + } + + return !duplicateActivity; + }); + + return {activities: filteredActivities, actorActivityById}; } export function ActivitySection({ @@ -203,10 +213,15 @@ export function ActivitySection({ ? group.activity : group.activity.filter(item => !SEER_ACTIVITY_TYPES.has(item.type)); - const filteredActivities = removeAdjacentDuplicatePullRequestActivities( - visibleActivities - ).filter(item => !filterComments || item.type === GroupActivityType.NOTE); - const displayedActivities = collapseSeerActivityPairs(filteredActivities); + const {activities: deduplicatedActivities, actorActivityById} = + removeAdjacentDuplicatePullRequestActivities(visibleActivities); + const filteredActivities = deduplicatedActivities.filter( + item => !filterComments || item.type === GroupActivityType.NOTE + ); + const displayedActivities = collapseSeerActivityPairs(filteredActivities).map(item => { + const actorActivity = actorActivityById.get(item.activity.id); + return item.type === 'activity' && actorActivity ? {...item, actorActivity} : item; + }); const inputVariant = variant === 'sidebar' ? 'compact' : 'full'; const timestampUnitStyle = variant === 'sidebar' ? 'short' : undefined;