samplingSDKAlert.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import {useEffect} from 'react';
  2. import styled from '@emotion/styled';
  3. import {openModal} from 'sentry/actionCreators/modal';
  4. import Alert from 'sentry/components/alert';
  5. import Button from 'sentry/components/button';
  6. import ProjectBadge from 'sentry/components/idBadge/projectBadge';
  7. import {t} from 'sentry/locale';
  8. import space from 'sentry/styles/space';
  9. import {Organization} from 'sentry/types';
  10. import {RecommendedSdkUpgrade, SamplingRule} from 'sentry/types/sampling';
  11. import trackAdvancedAnalyticsEvent from 'sentry/utils/analytics/trackAdvancedAnalyticsEvent';
  12. import {
  13. RecommendedStepsModal,
  14. RecommendedStepsModalProps,
  15. } from './modals/recommendedStepsModal';
  16. import {isUniformRule} from './utils';
  17. type Props = Pick<RecommendedStepsModalProps, 'projectId' | 'onReadDocs'> & {
  18. organization: Organization;
  19. recommendedSdkUpgrades: RecommendedSdkUpgrade[];
  20. rules: SamplingRule[];
  21. showLinkToTheModal?: boolean;
  22. };
  23. export function SamplingSDKAlert({
  24. organization,
  25. projectId,
  26. recommendedSdkUpgrades,
  27. rules,
  28. onReadDocs,
  29. showLinkToTheModal = true,
  30. }: Props) {
  31. useEffect(() => {
  32. if (recommendedSdkUpgrades.length === 0) {
  33. return;
  34. }
  35. trackAdvancedAnalyticsEvent('sampling.sdk.updgrades.alert', {
  36. organization,
  37. project_id: projectId,
  38. });
  39. }, [recommendedSdkUpgrades.length, organization, projectId]);
  40. if (recommendedSdkUpgrades.length === 0) {
  41. return null;
  42. }
  43. function handleOpenRecommendedSteps() {
  44. openModal(modalProps => (
  45. <RecommendedStepsModal
  46. {...modalProps}
  47. onReadDocs={onReadDocs}
  48. organization={organization}
  49. projectId={projectId}
  50. recommendedSdkUpgrades={recommendedSdkUpgrades}
  51. />
  52. ));
  53. }
  54. const uniformRule = rules.find(isUniformRule);
  55. return (
  56. <Alert
  57. data-test-id="recommended-sdk-upgrades-alert"
  58. type="info"
  59. showIcon
  60. trailingItems={
  61. showLinkToTheModal && uniformRule ? (
  62. <Button onClick={handleOpenRecommendedSteps} priority="link" borderless>
  63. {t('Learn More')}
  64. </Button>
  65. ) : undefined
  66. }
  67. >
  68. {t(
  69. 'To ensure you are properly monitoring the performance of all your other services, we require you update to the latest version of the following SDK(s):'
  70. )}
  71. <Projects>
  72. {recommendedSdkUpgrades.map(recommendedSdkUpgrade => (
  73. <ProjectBadge
  74. key={recommendedSdkUpgrade.project.id}
  75. project={recommendedSdkUpgrade.project}
  76. avatarSize={16}
  77. />
  78. ))}
  79. </Projects>
  80. </Alert>
  81. );
  82. }
  83. const Projects = styled('div')`
  84. display: flex;
  85. flex-wrap: wrap;
  86. gap: ${space(1.5)};
  87. justify-content: flex-start;
  88. margin-top: ${space(1)};
  89. `;