Browse Source

chore(stacktrace): Remove codecov banner (#69879)

this pr removes the codecov banner from the stacktrace banners. it also
updates our hooks for prompts to allow for options to be passed in.
Richard Roggenkemper 10 months ago
parent
commit
6692337b13

+ 3 - 1
static/app/actionCreators/prompts.tsx

@@ -138,14 +138,16 @@ export function usePrompt({
   organization,
   projectId,
   daysToSnooze,
+  options,
 }: {
   feature: string;
   organization: Organization;
   daysToSnooze?: number;
+  options?: Partial<UseApiQueryOptions<PromptResponse>>;
   projectId?: string;
 }) {
   const api = useApi({persistInFlight: true});
-  const prompt = usePromptsCheck({feature, organization, projectId});
+  const prompt = usePromptsCheck({feature, organization, projectId}, options);
   const queryClient = useQueryClient();
 
   const isPromptDismissed =

+ 0 - 61
static/app/components/events/interfaces/crashContent/exception/banners/addCodecovBanner.tsx

@@ -1,61 +0,0 @@
-import styled from '@emotion/styled';
-
-import addCoverage from 'sentry-images/spot/add-coverage.svg';
-
-import {LinkButton} from 'sentry/components/button';
-import {IconClose} from 'sentry/icons';
-import {t} from 'sentry/locale';
-
-import {
-  CloseBannerButton,
-  IntegationBannerDescription,
-  IntegationBannerTitle,
-  StacktraceIntegrationBannerWrapper,
-} from './addIntegrationBanner';
-
-interface AddCodecovBannerProps {
-  onClick: () => void;
-  onDismiss: () => void;
-  orgSlug: string;
-}
-
-export function AddCodecovBanner({onDismiss, onClick, orgSlug}: AddCodecovBannerProps) {
-  return (
-    <StacktraceIntegrationBannerWrapper>
-      <div>
-        <IntegationBannerTitle>
-          {t('View Test Coverage with CodeCov')}
-        </IntegationBannerTitle>
-        <IntegationBannerDescription>
-          {t(
-            'Enable CodeCov to get quick, line-by-line test coverage information in stack traces.'
-          )}
-        </IntegationBannerDescription>
-        <LinkButton to={`/settings/${orgSlug}/organization/`} size="sm" onClick={onClick}>
-          {t('Enable in Settings')}
-        </LinkButton>
-      </div>
-      <CoverageBannerImage src={addCoverage} />
-      <CloseBannerButton
-        borderless
-        priority="link"
-        aria-label={t('Dismiss')}
-        icon={<IconClose color="subText" />}
-        size="xs"
-        onClick={onDismiss}
-      />
-    </StacktraceIntegrationBannerWrapper>
-  );
-}
-
-const CoverageBannerImage = styled('img')`
-  position: absolute;
-  display: block;
-  bottom: 6px;
-  right: 4rem;
-  pointer-events: none;
-
-  @media (max-width: ${p => p.theme.breakpoints.small}) {
-    display: none;
-  }
-`;

+ 1 - 68
static/app/components/events/interfaces/crashContent/exception/banners/stacktraceBanners.spec.tsx

@@ -1,6 +1,5 @@
 import {EventFixture} from 'sentry-fixture/event';
 import {EventEntryStacktraceFixture} from 'sentry-fixture/eventEntryStacktrace';
-import {GitHubIntegrationFixture} from 'sentry-fixture/githubIntegration';
 import {OrganizationFixture} from 'sentry-fixture/organization';
 import {ProjectFixture} from 'sentry-fixture/project';
 
@@ -92,7 +91,7 @@ describe('StacktraceBanners', () => {
       `/organizations/${org.slug}/prompts-activity/`,
       expect.objectContaining({
         query: {
-          feature: ['stacktrace_link', 'codecov_stacktrace_prompt'],
+          feature: 'stacktrace_link',
           organization_id: org.id,
           project_id: project.id,
         },
@@ -116,70 +115,4 @@ describe('StacktraceBanners', () => {
       })
     );
   });
-
-  it('renders add codecov and allows dismissing', async () => {
-    const stacktraceLinkMock = MockApiClient.addMockResponse({
-      url: `/projects/${org.slug}/${project.slug}/stacktrace-link/`,
-      body: {
-        config: {
-          provider: {
-            key: 'github',
-          },
-        },
-        sourceUrl: null,
-        integrations: [GitHubIntegrationFixture()],
-      },
-    });
-    const {container} = render(
-      <StacktraceBanners stacktrace={stacktrace} event={event} />,
-      {
-        organization: org,
-      }
-    );
-    expect(
-      await screen.findByText('View Test Coverage with CodeCov')
-    ).toBeInTheDocument();
-    expect(stacktraceLinkMock).toHaveBeenCalledTimes(1);
-    expect(stacktraceLinkMock).toHaveBeenCalledWith(
-      `/projects/${org.slug}/${project.slug}/stacktrace-link/`,
-      expect.objectContaining({
-        query: {
-          file: inAppFrame.filename,
-          absPath: inAppFrame.absPath,
-          commitId: event.release?.lastCommit?.id,
-          lineNo: inAppFrame.lineNo,
-          module: inAppFrame.module,
-          platform: undefined,
-          groupId: event.groupID,
-        },
-      })
-    );
-    expect(promptActivity).toHaveBeenCalledTimes(1);
-    expect(promptActivity).toHaveBeenCalledWith(
-      `/organizations/${org.slug}/prompts-activity/`,
-      expect.objectContaining({
-        query: {
-          feature: ['stacktrace_link', 'codecov_stacktrace_prompt'],
-          organization_id: org.id,
-          project_id: project.id,
-        },
-      })
-    );
-
-    await userEvent.click(screen.getByRole('button', {name: 'Dismiss'}));
-    expect(container).toBeEmptyDOMElement();
-
-    expect(promptsUpdateMock).toHaveBeenCalledTimes(1);
-    expect(promptsUpdateMock).toHaveBeenCalledWith(
-      '/organizations/org-slug/prompts-activity/',
-      expect.objectContaining({
-        data: {
-          feature: 'codecov_stacktrace_prompt',
-          organization_id: org.id,
-          project_id: project.id,
-          status: 'dismissed',
-        },
-      })
-    );
-  });
 });

+ 12 - 105
static/app/components/events/interfaces/crashContent/exception/banners/stacktraceBanners.tsx

@@ -1,52 +1,17 @@
 import {useMemo} from 'react';
 
-import type {PromptResponse} from 'sentry/actionCreators/prompts';
-import {
-  makePromptsCheckQueryKey,
-  promptsUpdate,
-  usePromptsCheck,
-} from 'sentry/actionCreators/prompts';
+import {usePrompt} from 'sentry/actionCreators/prompts';
 import useStacktraceLink from 'sentry/components/events/interfaces/frame/useStacktraceLink';
 import {hasFileExtension} from 'sentry/components/events/interfaces/frame/utils';
-import type {
-  Event,
-  Frame,
-  Organization,
-  StacktraceLinkResult,
-  StacktraceType,
-} from 'sentry/types';
+import type {Event, Frame, StacktraceType} from 'sentry/types';
 import {trackAnalytics} from 'sentry/utils/analytics';
 import {getAnalyticsDataForEvent} from 'sentry/utils/events';
-import {promptIsDismissed} from 'sentry/utils/promptIsDismissed';
-import {setApiQueryData, useQueryClient} from 'sentry/utils/queryClient';
-import useApi from 'sentry/utils/useApi';
 import useOrganization from 'sentry/utils/useOrganization';
 import useProjects from 'sentry/utils/useProjects';
 
-import {AddCodecovBanner} from './addCodecovBanner';
 import {AddIntegrationBanner} from './addIntegrationBanner';
 
-function shouldShowCodecovPrompt(
-  organization: Organization,
-  stacktraceLink: StacktraceLinkResult
-) {
-  const enabled =
-    organization.features.includes('codecov-integration') && !organization.codecovAccess;
-
-  return enabled && stacktraceLink.config?.provider.key === 'github';
-}
-
-function getPromptStatus(promptData: ReturnType<typeof usePromptsCheck>, key: string) {
-  return promptData.isSuccess && promptData.data.features
-    ? promptIsDismissed({
-        dismissedTime: promptData.data.features[key]?.dismissed_ts,
-        snoozedTime: promptData.data.features[key]?.snoozed_ts,
-      })
-    : false;
-}
-
 const integrationPromptKey = 'stacktrace_link';
-const codecovPromptKey = 'codecov_stacktrace_prompt';
 
 interface StacktraceBannersProps {
   event: Event;
@@ -55,8 +20,6 @@ interface StacktraceBannersProps {
 
 export function StacktraceBanners({stacktrace, event}: StacktraceBannersProps) {
   const organization = useOrganization({allowNull: true});
-  const api = useApi();
-  const queryClient = useQueryClient();
   const {projects} = useProjects();
   const expectedDefaultFrame: Frame | undefined = (stacktrace.frames ?? [])
     .filter(
@@ -81,61 +44,25 @@ export function StacktraceBanners({stacktrace, event}: StacktraceBannersProps) {
       enabled,
     }
   );
-  const promptKeys = organization?.features.includes('codecov-integration')
-    ? [integrationPromptKey, codecovPromptKey]
-    : integrationPromptKey;
-  const prompt = usePromptsCheck(
-    {
-      organization: organization!,
-      feature: promptKeys,
-      projectId: project?.id,
-    },
-    {
-      enabled,
-    }
-  );
 
-  if (!enabled || !stacktraceLink) {
+  const {isLoading, isError, isPromptDismissed, dismissPrompt} = usePrompt({
+    organization: organization!,
+    feature: integrationPromptKey,
+    projectId: project?.id,
+    options: {enabled},
+  });
+
+  if (!enabled || !stacktraceLink || isLoading || isError) {
     return null;
   }
 
-  const dismissPrompt = (key: string) => {
-    promptsUpdate(api, {
-      organization,
-      projectId: project?.id,
-      feature: key,
-      status: 'dismissed',
-    });
-
-    // Update cached query data
-    // Will set prompt to dismissed
-    setApiQueryData<PromptResponse>(
-      queryClient,
-      makePromptsCheckQueryKey({
-        organization,
-        feature: promptKeys,
-        projectId: project?.id,
-      }),
-      () => {
-        const dimissedTs = new Date().getTime() / 1000;
-        return {
-          data: {dismissed_ts: dimissedTs},
-          features: {[key]: {dismissed_ts: dimissedTs}},
-        };
-      }
-    );
-  };
-
   // No integrations installed, show banner
-  if (
-    stacktraceLink.integrations.length === 0 &&
-    !getPromptStatus(prompt, integrationPromptKey)
-  ) {
+  if (stacktraceLink.integrations.length === 0 && !isPromptDismissed) {
     return (
       <AddIntegrationBanner
         orgSlug={organization.slug}
         onDismiss={() => {
-          dismissPrompt(integrationPromptKey);
+          dismissPrompt();
           trackAnalytics('integrations.stacktrace_link_cta_dismissed', {
             view: 'stacktrace_issue_details',
             organization,
@@ -146,25 +73,5 @@ export function StacktraceBanners({stacktrace, event}: StacktraceBannersProps) {
     );
   }
 
-  if (
-    shouldShowCodecovPrompt(organization, stacktraceLink) &&
-    !getPromptStatus(prompt, codecovPromptKey)
-  ) {
-    return (
-      <AddCodecovBanner
-        orgSlug={organization.slug}
-        onClick={() => {
-          trackAnalytics('integrations.stacktrace_codecov_prompt_clicked', {
-            view: 'stacktrace_link',
-            organization,
-          });
-        }}
-        onDismiss={() => {
-          dismissPrompt(codecovPromptKey);
-        }}
-      />
-    );
-  }
-
   return null;
 }

File diff suppressed because it is too large
+ 0 - 0
static/images/spot/add-coverage.svg


Some files were not shown because too many files changed in this diff