replayRageClickSdkVersionBanner.tsx 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import {useEffect} from 'react';
  2. import styled from '@emotion/styled';
  3. import replaysDeadRageBackground from 'sentry-images/spot/replay-dead-rage-changelog.svg';
  4. import {LinkButton} from 'sentry/components/button';
  5. import PageBanner from 'sentry/components/replays/pageBanner';
  6. import {IconBroadcast} from 'sentry/icons';
  7. import {t, tct} from 'sentry/locale';
  8. import {trackAnalytics} from 'sentry/utils/analytics';
  9. import getRouteStringFromRoutes from 'sentry/utils/getRouteStringFromRoutes';
  10. import {MIN_DEAD_RAGE_CLICK_SDK} from 'sentry/utils/replays/sdkVersions';
  11. import useDismissAlert from 'sentry/utils/useDismissAlert';
  12. import useOrganization from 'sentry/utils/useOrganization';
  13. import {useRoutes} from 'sentry/utils/useRoutes';
  14. export default function ReplayRageClickSdkVersionBanner() {
  15. const organization = useOrganization();
  16. const {dismiss, isDismissed} = useDismissAlert({
  17. key: `${organization.id}:replay-rage-dead-click-sdk-version-banner-v1`,
  18. });
  19. const routes = useRoutes();
  20. const surface = getRouteStringFromRoutes(routes);
  21. useEffect(() => {
  22. trackAnalytics('replay.rage-click-sdk-banner.rendered', {
  23. is_dismissed: isDismissed,
  24. organization,
  25. surface,
  26. });
  27. // eslint-disable-next-line react-hooks/exhaustive-deps
  28. }, []); // Don't log immediatly after the banner is dismissed. On each pageload/mount is fine.
  29. if (isDismissed) {
  30. return null;
  31. }
  32. return (
  33. <PageBanner
  34. button={
  35. <LinkButton
  36. analyticsEventKey="replay.rage-click-sdk-banner.viewed_changelog"
  37. analyticsEventName="Replay Rage Click SDK Banner Viewed Changelog"
  38. analyticsParams={{surface}}
  39. external
  40. href={MIN_DEAD_RAGE_CLICK_SDK.changelog}
  41. priority="primary"
  42. >
  43. {t('Read Changelog')}
  44. </LinkButton>
  45. }
  46. description={t(
  47. "Understand what your users do when your user experience doesn't meet their expectations"
  48. )}
  49. heading={t('Introducing Rage and Dead Clicks')}
  50. icon={<IconBroadcast size="sm" />}
  51. image={replaysDeadRageBackground}
  52. onDismiss={() => {
  53. trackAnalytics('replay.rage-click-sdk-banner.dismissed', {
  54. organization,
  55. surface,
  56. });
  57. dismiss();
  58. }}
  59. title={tct("What's new in [version]", {
  60. version: (
  61. <PurpleText>
  62. {tct(`version [version_number]`, {
  63. version_number: MIN_DEAD_RAGE_CLICK_SDK.minVersion,
  64. })}
  65. </PurpleText>
  66. ),
  67. })}
  68. />
  69. );
  70. }
  71. const PurpleText = styled('strong')`
  72. color: ${p => p.theme.purple400};
  73. `;