contextSummaryDevice.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import styled from '@emotion/styled';
  2. import {DeviceName} from 'sentry/components/deviceName';
  3. import AnnotatedText from 'sentry/components/events/meta/annotatedText';
  4. import TextOverflow from 'sentry/components/textOverflow';
  5. import {t} from 'sentry/locale';
  6. import space from 'sentry/styles/space';
  7. import {Event, Meta} from 'sentry/types';
  8. import {defined} from 'sentry/utils';
  9. import ContextSummaryNoSummary from './contextSummaryNoSummary';
  10. import generateClassName from './generateClassName';
  11. import Item from './item';
  12. type Props = {
  13. data: Data;
  14. meta: NonNullable<Event['_meta']>['device'];
  15. };
  16. type Data = {
  17. arch?: string;
  18. model?: string;
  19. name?: string;
  20. };
  21. type SubTitle = {
  22. subject: string;
  23. value: string;
  24. meta?: Meta;
  25. };
  26. export function ContextSummaryDevice({data, meta}: Props) {
  27. if (Object.keys(data).length === 0) {
  28. return <ContextSummaryNoSummary title={t('Unknown Device')} />;
  29. }
  30. const renderName = () => {
  31. if (!defined(data.model)) {
  32. return t('Unknown Device');
  33. }
  34. return (
  35. <DeviceName value={data.model}>
  36. {deviceName => {
  37. return (
  38. <AnnotatedText
  39. value={meta.name?.[''] ? data.name : deviceName}
  40. meta={meta.name?.['']}
  41. />
  42. );
  43. }}
  44. </DeviceName>
  45. );
  46. };
  47. const getSubTitle = (): SubTitle | null => {
  48. if (defined(data.arch)) {
  49. return {
  50. subject: t('Arch:'),
  51. value: data.arch,
  52. meta: meta.arch?.[''],
  53. };
  54. }
  55. if (defined(data.model)) {
  56. return {
  57. subject: t('Model:'),
  58. value: data.model,
  59. meta: meta.model?.[''],
  60. };
  61. }
  62. return null;
  63. };
  64. // TODO(dcramer): we need a better way to parse it
  65. const className = generateClassName(data.model);
  66. const subTitle = getSubTitle();
  67. return (
  68. <Item className={className} icon={<span className="context-item-icon" />}>
  69. <h3>{renderName()}</h3>
  70. {subTitle && (
  71. <TextOverflow isParagraph data-test-id="context-sub-title">
  72. <Subject>{subTitle.subject}</Subject>
  73. <AnnotatedText value={subTitle.value} meta={subTitle.meta} />
  74. </TextOverflow>
  75. )}
  76. </Item>
  77. );
  78. }
  79. const Subject = styled('strong')`
  80. margin-right: ${space(0.5)};
  81. `;