Skip to content

Commit dff2ecb

Browse files

File tree

2 files changed

+58
-15
lines changed

2 files changed

+58
-15
lines changed

static/app/views/replays/detail/ai/chapterList.tsx

Lines changed: 51 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import {useCallback, useMemo} from 'react';
1+
import {useCallback, useMemo, useState} from 'react';
22
import styled from '@emotion/styled';
33
import classNames from 'classnames';
44

55
import {Alert} from 'sentry/components/core/alert';
66
import EmptyMessage from 'sentry/components/emptyMessage';
77
import {useReplayContext} from 'sentry/components/replays/replayContext';
8-
import {IconChevron} from 'sentry/icons';
8+
import {IconChevron, IconFire, IconMegaphone} from 'sentry/icons';
99
import {t} from 'sentry/locale';
1010
import {space} from 'sentry/styles/space';
1111
import useCrumbHandlers from 'sentry/utils/replays/hooks/useCrumbHandlers';
@@ -33,10 +33,12 @@ export function ChapterList({summaryData}: Props) {
3333
const chapterData = useMemo(
3434
() =>
3535
summaryData?.data.time_ranges
36-
.map(({period_title, period_start, period_end}) => ({
36+
.map(({period_title, period_start, period_end, error, feedback}) => ({
3737
title: period_title,
3838
start: period_start,
3939
end: period_end,
40+
error,
41+
feedback,
4042
breadcrumbs:
4143
replay
4244
?.getChapterFrames()
@@ -60,14 +62,16 @@ export function ChapterList({summaryData}: Props) {
6062

6163
return (
6264
<ChaptersList>
63-
{chapterData.map(({title, start, end, breadcrumbs}, i) => (
65+
{chapterData.map(({title, start, end, breadcrumbs, error, feedback}, i) => (
6466
<ChapterRow
6567
key={i}
6668
title={title}
6769
start={start}
6870
end={end}
6971
breadcrumbs={breadcrumbs}
7072
onClickChapterTimestamp={onClickChapterTimestamp}
73+
error={error}
74+
feedback={feedback}
7175
/>
7276
))}
7377
</ChaptersList>
@@ -81,9 +85,13 @@ function ChapterRow({
8185
breadcrumbs,
8286
onClickChapterTimestamp,
8387
className,
88+
error,
89+
feedback,
8490
}: {
8591
breadcrumbs: ReplayFrame[];
8692
end: number;
93+
error: boolean;
94+
feedback: boolean;
8795
onClickChapterTimestamp: (event: React.MouseEvent<Element>, start: number) => void;
8896
start: number;
8997
title: string;
@@ -92,6 +100,7 @@ function ChapterRow({
92100
const {replay, currentTime} = useReplayContext();
93101
const {onClickTimestamp} = useCrumbHandlers();
94102
const [currentHoverTime] = useCurrentHoverTime();
103+
const [isHovered, setIsHovered] = useState(false);
95104

96105
const startOffset = Math.max(start - (replay?.getStartTimestampMs() ?? 0), 0);
97106
const endOffset = Math.max(end - (replay?.getStartTimestampMs() ?? 0), 0);
@@ -107,11 +116,27 @@ function ChapterRow({
107116
beforeHoverTime: currentHoverTime === undefined ? undefined : isBeforeHover,
108117
afterHoverTime: currentHoverTime === undefined ? undefined : !isBeforeHover,
109118
})}
119+
onMouseEnter={() => setIsHovered(true)}
120+
onMouseLeave={() => setIsHovered(false)}
110121
>
111-
<Chapter>
112-
<ChapterIconArrowWrapper>
113-
<ChapterIconArrow direction="right" size="xs" />
114-
</ChapterIconArrowWrapper>
122+
<Chapter error={error} feedback={feedback}>
123+
<ChapterIconWrapper>
124+
{error ? (
125+
isHovered ? (
126+
<ChapterIconArrow direction="right" size="xs" color="errorText" />
127+
) : (
128+
<IconFire size="xs" color="errorText" />
129+
)
130+
) : feedback ? (
131+
isHovered ? (
132+
<ChapterIconArrow direction="right" size="xs" color="pink300" />
133+
) : (
134+
<IconMegaphone size="xs" color="pink300" />
135+
)
136+
) : (
137+
<ChapterIconArrow direction="right" size="xs" />
138+
)}
139+
</ChapterIconWrapper>
115140
<ChapterTitle>
116141
<span>{title}</span>
117142

@@ -149,12 +174,14 @@ function ChapterRow({
149174
);
150175
}
151176

152-
const ChapterIconArrowWrapper = styled('div')`
177+
const ChapterIconWrapper = styled('div')`
153178
display: flex;
154179
align-items: center;
155180
justify-content: center;
156-
padding: ${space(1)} ${space(0.5)};
181+
padding: ${space(0.5)};
182+
margin-right: ${space(1)};
157183
background-color: ${p => p.theme.background};
184+
border-radius: 50%;
158185
z-index: 2; /* needs to be above "ChapterWrapper summary::after" */
159186
`;
160187

@@ -191,6 +218,7 @@ const ChapterWrapper = styled('details')`
191218
192219
&:last-child summary::after {
193220
bottom: 0;
221+
display: none; /* hide the vertical line for the last chapter */
194222
}
195223
196224
&.activeChapter .beforeCurrentTime:last-child {
@@ -212,12 +240,22 @@ const ChapterBreadcrumbRow = styled(BreadcrumbRow)`
212240
}
213241
`;
214242

215-
const Chapter = styled('summary')`
243+
const Chapter = styled('summary')<{error?: boolean; feedback?: boolean}>`
216244
cursor: pointer;
217245
display: flex;
218246
align-items: center;
219247
font-size: ${p => p.theme.fontSize.lg};
220248
padding: 0 ${space(0.75)};
249+
color: ${p =>
250+
p.error ? p.theme.errorText : p.feedback ? p.theme.pink300 : p.theme.textColor};
251+
&:hover {
252+
background-color: ${p =>
253+
p.error
254+
? p.theme.red100
255+
: p.feedback
256+
? p.theme.pink100
257+
: p.theme.backgroundSecondary};
258+
}
221259
222260
/* sorry */
223261
&:focus-visible {
@@ -243,9 +281,8 @@ const ChapterTitle = styled('div')`
243281
font-weight: ${p => p.theme.fontWeight.bold};
244282
}
245283
246-
:not(details[open] &) {
247-
border-bottom: 1px solid ${p => p.theme.innerBorder};
248-
}
284+
border-bottom: 1px solid ${p => p.theme.innerBorder};
285+
249286
details:last-child:not([open]) & {
250287
border-bottom: none;
251288
}

static/app/views/replays/detail/ai/useFetchReplaySummary.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,13 @@ import useProjectFromId from 'sentry/utils/useProjectFromId';
77
export interface SummaryResponse {
88
data: {
99
summary: string;
10-
time_ranges: Array<{period_end: number; period_start: number; period_title: string}>;
10+
time_ranges: Array<{
11+
error: boolean;
12+
feedback: boolean;
13+
period_end: number;
14+
period_start: number;
15+
period_title: string;
16+
}>;
1117
title: string;
1218
};
1319
}

0 commit comments

Comments
 (0)