import {useCallback} from 'react'; import styled from '@emotion/styled'; import * as Sentry from '@sentry/react'; import {addSuccessMessage} from 'sentry/actionCreators/indicator'; import {closeModal} from 'sentry/actionCreators/modal'; import {Button} from 'sentry/components/button'; import {SidebarPanelKey} from 'sentry/components/sidebar/types'; import {t} from 'sentry/locale'; import SidebarPanelStore from 'sentry/stores/sidebarPanelStore'; import {space} from 'sentry/styles/space'; import type {Organization} from 'sentry/types/organization'; import useApi from 'sentry/utils/useApi'; import {sendReplayOnboardRequest} from 'getsentry/actionCreators/upsell'; import SubscriptionStore from 'getsentry/stores/subscriptionStore'; import type {Plan, PreviewData, Subscription} from 'getsentry/types'; import {PlanTier} from 'getsentry/types'; import type {AM2UpdateSurfaces} from 'getsentry/utils/trackGetsentryAnalytics'; import trackGetsentryAnalytics from 'getsentry/utils/trackGetsentryAnalytics'; import type {Reservations} from './types'; import {redirectToManage} from './utils'; type Props = { organization: Organization; plan: Plan; previewData: PreviewData; reservations: Reservations; subscription: Subscription; surface: AM2UpdateSurfaces; isActionDisabled?: boolean; onComplete?: () => void; }; function ActionButtons({ isActionDisabled, onComplete, organization, plan, previewData, reservations, subscription, surface, }: Props) { const api = useApi(); const onUpdatePlan = useCallback(async () => { try { await api.requestPromise(`/customers/${organization.slug}/subscription/`, { method: 'PUT', data: { ...reservations, plan: plan?.id, referrer: 'replay-am2-update-modal', }, }); SubscriptionStore.loadData(organization.slug, () => { if (onComplete) { onComplete(); } closeModal(); addSuccessMessage(t('Subscription Updated!')); window.location.hash = 'replay-sidequest'; SidebarPanelStore.activatePanel(SidebarPanelKey.REPLAYS_ONBOARDING); trackGetsentryAnalytics('upgrade_now.modal.update_now', { organization, planTier: subscription.planTier, canSelfServe: subscription.canSelfServe, channel: subscription.channel, has_billing_scope: organization.access?.includes('org:billing'), surface, has_price_change: previewData.billedAmount !== 0, }); }); } catch (err) { Sentry.captureException(err); redirectToManage(organization); } }, [ api, onComplete, organization, plan, previewData.billedAmount, reservations, subscription, surface, ]); const onEmailOwner = useCallback(async () => { const currentPlanName = subscription.planTier === PlanTier.AM2 ? 'am2-non-beta' : 'am1-non-beta'; await sendReplayOnboardRequest({ api, orgSlug: organization.slug, currentPlan: currentPlanName, onSuccess: () => { onComplete?.(); closeModal(); trackGetsentryAnalytics('upgrade_now.modal.sent_email', { organization, surface, planTier: subscription.planTier, canSelfServe: subscription.canSelfServe, channel: subscription.channel, has_billing_scope: organization.access?.includes('org:billing'), }); }, onError: () => { redirectToManage(organization); }, }); }, [api, organization, subscription, surface, onComplete]); const onClickManageSubscription = useCallback(() => { trackGetsentryAnalytics('upgrade_now.modal.manage_sub', { organization, surface, planTier: subscription.planTier, canSelfServe: subscription.canSelfServe, channel: subscription.channel, has_billing_scope: organization.access?.includes('org:billing'), }); }, [organization, subscription, surface]); const hasBillingAccess = organization.access?.includes('org:billing'); return hasBillingAccess ? ( ) : ( ); } const ButtonRow = styled('p')` display: flex; gap: ${space(1.5)}; margin-top: ${space(3)}; margin-bottom: ${space(2)}; `; export default ActionButtons;