vitalDetailPanel.tsx 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import React from 'react';
  2. import styled from '@emotion/styled';
  3. import {DrawerHeader} from 'sentry/components/globalDrawer/components';
  4. import ExternalLink from 'sentry/components/links/externalLink';
  5. import {t} from 'sentry/locale';
  6. import {space} from 'sentry/styles/space';
  7. import {PageAlert, PageAlertProvider} from 'sentry/utils/performance/contexts/pageAlert';
  8. import {PERFORMANCE_SCORE_COLORS} from 'sentry/views/insights/browser/webVitals/utils/performanceScoreColors';
  9. import {SampleDrawerBody} from 'sentry/views/insights/common/components/sampleDrawerBody';
  10. import useCrossPlatformProject from 'sentry/views/insights/mobile/common/queries/useCrossPlatformProject';
  11. import {
  12. PerformanceScore,
  13. type VitalItem,
  14. type VitalStatus,
  15. } from 'sentry/views/insights/mobile/screens/utils';
  16. export function VitalDetailPanel({
  17. vital,
  18. status,
  19. }: {
  20. status: VitalStatus | undefined;
  21. vital: VitalItem | undefined;
  22. }) {
  23. const {selectedPlatform} = useCrossPlatformProject();
  24. const platformDocsLink = vital?.platformDocLinks[selectedPlatform];
  25. const sdkDocsLink = vital?.sdkDocLinks[selectedPlatform];
  26. return (
  27. <PageAlertProvider>
  28. <DrawerHeader />
  29. <SampleDrawerBody>
  30. {vital && (
  31. <React.Fragment>
  32. <VitalDetailTitle>{vital.title}</VitalDetailTitle>
  33. {status && (
  34. <h2>
  35. {status.formattedValue ?? '-'}{' '}
  36. {status.score !== PerformanceScore.NONE && (
  37. <Badge status={status.score}>{status.description}</Badge>
  38. )}
  39. </h2>
  40. )}
  41. <p>{vital.docs}</p>
  42. {vital.setup && <p>{vital.setup}</p>}
  43. {(platformDocsLink || sdkDocsLink) && (
  44. <React.Fragment>
  45. <SubHeading>{t('Learn more')}</SubHeading>
  46. <ul>
  47. {sdkDocsLink && (
  48. <li>
  49. <ExternalLink href={sdkDocsLink}>
  50. {t('Sentry SDK documentation')}
  51. </ExternalLink>
  52. </li>
  53. )}
  54. {platformDocsLink && (
  55. <li>
  56. <ExternalLink href={platformDocsLink}>
  57. {t('Platform documentation')}
  58. </ExternalLink>
  59. </li>
  60. )}
  61. </ul>
  62. </React.Fragment>
  63. )}
  64. </React.Fragment>
  65. )}
  66. <PageAlert />
  67. </SampleDrawerBody>
  68. </PageAlertProvider>
  69. );
  70. }
  71. const VitalDetailTitle = styled('h4')`
  72. margin-bottom: ${space(1)};
  73. `;
  74. const Badge = styled('div')<{status: keyof typeof PERFORMANCE_SCORE_COLORS}>`
  75. white-space: nowrap;
  76. border-radius: 12px;
  77. color: ${p => p.theme[PERFORMANCE_SCORE_COLORS[p.status].normal]};
  78. background-color: ${p => p.theme[PERFORMANCE_SCORE_COLORS[p.status].light]};
  79. border: solid 1px ${p => p.theme[PERFORMANCE_SCORE_COLORS[p.status].light]};
  80. font-size: ${p => p.theme.fontSizeSmall};
  81. padding: 0 ${space(1)};
  82. display: inline-block;
  83. height: 17px;
  84. vertical-align: middle;
  85. `;
  86. const SubHeading = styled('div')`
  87. font-weight: ${p => p.theme.fontWeightBold};
  88. margin-bottom: ${space(1)};
  89. `;