replayMetaData.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import {Fragment} from 'react';
  2. import styled from '@emotion/styled';
  3. import Link from 'sentry/components/links/link';
  4. import ContextIcon from 'sentry/components/replays/contextIcon';
  5. import ErrorCount from 'sentry/components/replays/header/errorCount';
  6. import HeaderPlaceholder from 'sentry/components/replays/header/headerPlaceholder';
  7. import TimeSince from 'sentry/components/timeSince';
  8. import {IconCalendar} from 'sentry/icons';
  9. import {t} from 'sentry/locale';
  10. import {space} from 'sentry/styles/space';
  11. import {useLocation} from 'sentry/utils/useLocation';
  12. import type {ReplayRecord} from 'sentry/views/replays/types';
  13. type Props = {
  14. replayRecord: ReplayRecord | undefined;
  15. };
  16. function ReplayMetaData({replayRecord}: Props) {
  17. const {pathname, query} = useLocation();
  18. const errorsTabHref = {
  19. pathname,
  20. query: {
  21. ...query,
  22. t_main: 'console',
  23. f_c_logLevel: 'issue',
  24. f_c_search: undefined,
  25. },
  26. };
  27. return (
  28. <KeyMetrics>
  29. <KeyMetricLabel>{t('OS')}</KeyMetricLabel>
  30. <KeyMetricData>
  31. <ContextIcon
  32. name={replayRecord?.os.name ?? ''}
  33. version={replayRecord?.os.version ?? undefined}
  34. />
  35. </KeyMetricData>
  36. <KeyMetricLabel>{t('Browser')}</KeyMetricLabel>
  37. <KeyMetricData>
  38. <ContextIcon
  39. name={replayRecord?.browser.name ?? ''}
  40. version={replayRecord?.browser.version ?? undefined}
  41. />
  42. </KeyMetricData>
  43. <KeyMetricLabel>{t('Start Time')}</KeyMetricLabel>
  44. <KeyMetricData>
  45. {replayRecord ? (
  46. <Fragment>
  47. <IconCalendar color="gray300" />
  48. <TimeSince date={replayRecord.started_at} unitStyle="regular" />
  49. </Fragment>
  50. ) : (
  51. <HeaderPlaceholder width="80px" height="16px" />
  52. )}
  53. </KeyMetricData>
  54. <KeyMetricLabel>{t('Errors')}</KeyMetricLabel>
  55. <KeyMetricData>
  56. {replayRecord ? (
  57. <StyledLink to={errorsTabHref}>
  58. <ErrorCount countErrors={replayRecord.count_errors} />
  59. </StyledLink>
  60. ) : (
  61. <HeaderPlaceholder width="80px" height="16px" />
  62. )}
  63. </KeyMetricData>
  64. </KeyMetrics>
  65. );
  66. }
  67. const KeyMetrics = styled('dl')`
  68. display: grid;
  69. grid-template-rows: max-content 1fr;
  70. grid-template-columns: repeat(4, max-content);
  71. grid-auto-flow: column;
  72. gap: 0 ${space(3)};
  73. align-items: center;
  74. color: ${p => p.theme.gray300};
  75. margin: 0;
  76. @media (min-width: ${p => p.theme.breakpoints.medium}) {
  77. justify-self: flex-end;
  78. }
  79. `;
  80. const KeyMetricLabel = styled('dt')`
  81. font-size: ${p => p.theme.fontSizeMedium};
  82. `;
  83. const KeyMetricData = styled('dd')`
  84. font-size: ${p => p.theme.fontSizeExtraLarge};
  85. font-weight: normal;
  86. display: flex;
  87. align-items: center;
  88. gap: ${space(1)};
  89. line-height: ${p => p.theme.text.lineHeightBody};
  90. `;
  91. const StyledLink = styled(Link)`
  92. display: flex;
  93. gap: ${space(1)};
  94. `;
  95. export default ReplayMetaData;