1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- import {Fragment} from 'react';
- import styled from '@emotion/styled';
- import {t} from 'sentry/locale';
- import space from 'sentry/styles/space';
- const scoreComponents = {
- 'exception:message:character-shingles': t('Exception Message'),
- 'exception:stacktrace:pairs': t('Stack Trace Frames'),
- 'exception:stacktrace:application-chunks': t('In-App Frames'),
- 'message:message:character-shingles': t('Log Message'),
- // v2
- 'similarity:*:type:character-5-shingle': t('Exception Type'),
- 'similarity:*:value:character-5-shingle': t('Exception Message'),
- 'similarity:*:stacktrace:frames-pairs': t('Stack Trace Frames'),
- 'similarity:*:message:character-5-shingle': t('Log Message'),
- };
- type ScoreValue = number | null;
- type Props = {
- // we treat the score list keys as opaque as we wish to be able to extend the
- // backend without having to fix UI. Keys not in scoreComponents are grouped
- // into Other anyway
- scoreList?: [string, ScoreValue][];
- };
- const SimilarScoreCard = ({scoreList = []}: Props) => {
- if (scoreList.length === 0) {
- return null;
- }
- let sumOtherScores = 0;
- let numOtherScores = 0;
- return (
- <Fragment>
- {scoreList.map(([key, score]) => {
- const title =
- scoreComponents[key.replace(/similarity:\d\d\d\d-\d\d-\d\d/, 'similarity:*')];
- if (!title) {
- if (score !== null) {
- sumOtherScores += score;
- numOtherScores += 1;
- }
- return null;
- }
- return (
- <Wrapper key={key}>
- <div>{title}</div>
- <Score score={score === null ? score : Math.round(score * 4)} />
- </Wrapper>
- );
- })}
- {numOtherScores > 0 && sumOtherScores > 0 && (
- <Wrapper>
- <div>{t('Other')}</div>
- <Score score={Math.round((sumOtherScores * 4) / numOtherScores)} />
- </Wrapper>
- )}
- </Fragment>
- );
- };
- const Wrapper = styled('div')`
- display: flex;
- justify-content: space-between;
- margin: ${space(0.25)} 0;
- `;
- const Score = styled('div')<{score: ScoreValue}>`
- height: 16px;
- width: 48px;
- border-radius: 2px;
- background-color: ${p =>
- p.score === null ? p.theme.similarity.empty : p.theme.similarity.colors[p.score]};
- `;
- export default SimilarScoreCard;
|