contextSummaryDevice.tsx 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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 {Meta} from 'sentry/types';
  8. import {defined} from 'sentry/utils';
  9. import ContextSummaryNoSummary from './contextSummaryNoSummary';
  10. import Item from './item';
  11. import {ContextItemProps} from './types';
  12. import {generateIconName} from './utils';
  13. type Data = {
  14. arch?: string;
  15. model?: string;
  16. name?: string;
  17. };
  18. type SubTitle = {
  19. subject: string;
  20. value: string;
  21. meta?: Meta;
  22. };
  23. type Props = ContextItemProps<Data, 'device'>;
  24. export function ContextSummaryDevice({data, meta}: Props) {
  25. if (Object.keys(data).length === 0) {
  26. return <ContextSummaryNoSummary title={t('Unknown Device')} />;
  27. }
  28. const renderName = () => {
  29. if (!defined(data.model)) {
  30. return t('Unknown Device');
  31. }
  32. return (
  33. <DeviceName value={data.model}>
  34. {deviceName => {
  35. return (
  36. <AnnotatedText
  37. value={meta.name?.[''] ? data.name : deviceName}
  38. meta={meta.name?.['']}
  39. />
  40. );
  41. }}
  42. </DeviceName>
  43. );
  44. };
  45. const getSubTitle = (): SubTitle | null => {
  46. if (defined(data.arch)) {
  47. return {
  48. subject: t('Arch:'),
  49. value: data.arch,
  50. meta: meta.arch?.[''],
  51. };
  52. }
  53. if (defined(data.model)) {
  54. return {
  55. subject: t('Model:'),
  56. value: data.model,
  57. meta: meta.model?.[''],
  58. };
  59. }
  60. return null;
  61. };
  62. const subTitle = getSubTitle();
  63. return (
  64. <Item icon={generateIconName(data.model)}>
  65. <h3>{renderName()}</h3>
  66. {subTitle && (
  67. <TextOverflow isParagraph data-test-id="context-sub-title">
  68. <Subject>{subTitle.subject}</Subject>
  69. <AnnotatedText value={subTitle.value} meta={subTitle.meta} />
  70. </TextOverflow>
  71. )}
  72. </Item>
  73. );
  74. }
  75. const Subject = styled('strong')`
  76. margin-right: ${space(0.5)};
  77. `;