Skip to content

Commit b2a034c

Browse files
authored
fix(replay): Add error boundary for "Tags" tab (#91854)
The replay "Tags" tab is crashing because `user.geo` is an object, but the component expects a string. This PR just adds an error boundary so that only the un-renderable row is affected. Fixes JAVASCRIPT-30NR
1 parent 8215061 commit b2a034c

File tree

2 files changed

+44
-38
lines changed

2 files changed

+44
-38
lines changed

static/app/components/replays/replayTagsTableRow.tsx

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import styled from '@emotion/styled';
44
import type {LocationDescriptor} from 'history';
55

66
import {Tooltip} from 'sentry/components/core/tooltip';
7+
import ErrorBoundary from 'sentry/components/errorBoundary';
78
import {AnnotatedText} from 'sentry/components/events/meta/annotatedText';
89
import {KeyValueTableRow} from 'sentry/components/keyValueTable';
910
import Link from 'sentry/components/links/link';
@@ -108,21 +109,23 @@ function ReplayTagsTableRow({name, values, generateUrl}: Props) {
108109
</StyledTooltip>
109110
}
110111
value={
111-
<ValueContainer>
112-
<StyledTooltip
113-
disabled={releaseKeys.includes(name)}
114-
overlayStyle={
115-
expandedViewKeys.includes(name) ? {textAlign: 'left'} : undefined
116-
}
117-
title={
118-
expandedViewKeys.includes(name) ? renderValueList(values) : renderTagValue
119-
}
120-
isHoverable
121-
showOnlyOnOverflow
122-
>
123-
{renderTagValue}
124-
</StyledTooltip>
125-
</ValueContainer>
112+
<ErrorBoundary mini>
113+
<ValueContainer>
114+
<StyledTooltip
115+
disabled={releaseKeys.includes(name)}
116+
overlayStyle={
117+
expandedViewKeys.includes(name) ? {textAlign: 'left'} : undefined
118+
}
119+
title={
120+
expandedViewKeys.includes(name) ? renderValueList(values) : renderTagValue
121+
}
122+
isHoverable
123+
showOnlyOnOverflow
124+
>
125+
{renderTagValue}
126+
</StyledTooltip>
127+
</ValueContainer>
128+
</ErrorBoundary>
126129
}
127130
/>
128131
);

static/app/views/replays/detail/tagPanel/index.tsx

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import styled from '@emotion/styled';
44
import type {LocationDescriptor} from 'history';
55

66
import EmptyMessage from 'sentry/components/emptyMessage';
7+
import ErrorBoundary from 'sentry/components/errorBoundary';
78
import {KeyValueTable} from 'sentry/components/keyValueTable';
89
import Placeholder from 'sentry/components/placeholder';
910
import {useReplayContext} from 'sentry/components/replays/replayContext';
@@ -73,29 +74,31 @@ export default function TagPanel() {
7374
const filteredTags = Object.entries(items);
7475

7576
return (
76-
<PaddedFluidHeight>
77-
<TagFilters tags={tags} {...filterProps} />
78-
<TabItemContainer>
79-
<StyledPanel>
80-
<FluidPanel>
81-
{filteredTags.length ? (
82-
<KeyValueTable noMargin>
83-
{filteredTags.map(([key, values]) => (
84-
<ReplayTagsTableRow
85-
key={key}
86-
name={key}
87-
values={values}
88-
generateUrl={key.includes('sdk.replay.') ? undefined : generateUrl}
89-
/>
90-
))}
91-
</KeyValueTable>
92-
) : (
93-
<EmptyMessage>{t('No tags for this replay were found.')}</EmptyMessage>
94-
)}
95-
</FluidPanel>
96-
</StyledPanel>
97-
</TabItemContainer>
98-
</PaddedFluidHeight>
77+
<ErrorBoundary mini>
78+
<PaddedFluidHeight>
79+
<TagFilters tags={tags} {...filterProps} />
80+
<TabItemContainer>
81+
<StyledPanel>
82+
<FluidPanel>
83+
{filteredTags.length ? (
84+
<KeyValueTable noMargin>
85+
{filteredTags.map(([key, values]) => (
86+
<ReplayTagsTableRow
87+
key={key}
88+
name={key}
89+
values={values}
90+
generateUrl={key.includes('sdk.replay.') ? undefined : generateUrl}
91+
/>
92+
))}
93+
</KeyValueTable>
94+
) : (
95+
<EmptyMessage>{t('No tags for this replay were found.')}</EmptyMessage>
96+
)}
97+
</FluidPanel>
98+
</StyledPanel>
99+
</TabItemContainer>
100+
</PaddedFluidHeight>
101+
</ErrorBoundary>
99102
);
100103
}
101104

0 commit comments

Comments
 (0)