contextSummaryDevice.tsx 2.2 KB

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