replayMetaData.tsx 2.6 KB

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