Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { UpgradePlanButton } from '@/components/ui/UpgradePlanButton'
import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization'
import { useTrackExperimentExposure } from '@/hooks/misc/useTrackExperimentExposure'
import { usePHFlag } from '@/hooks/ui/useFlag'
import { useTrack } from '@/lib/telemetry/track'

const EXPERIMENT_ID = 'headerUpgradeCta'
type HeaderUpgradeCtaVariant = 'control' | 'test'

interface HeaderUpgradeButtonProps {
className?: string
}

export const HeaderUpgradeButton = ({ className }: HeaderUpgradeButtonProps) => {
const track = useTrack()
const { data: organization } = useSelectedOrganizationQuery()
const flagValue = usePHFlag<HeaderUpgradeCtaVariant | false>(EXPERIMENT_ID)

const isFreePlan = organization?.plan?.id === 'free'
const isInExperiment = flagValue === 'control' || flagValue === 'test'
const showButton = flagValue === 'test'

// Track experiment exposure for all free-plan users in the experiment (both control and test)
const variant = isFreePlan && isInExperiment ? (flagValue as string) : undefined
useTrackExperimentExposure(EXPERIMENT_ID, variant)

if (!isFreePlan) return null
if (!showButton) return null

const handleClick = () => {
track('header_upgrade_cta_clicked')
}

return <UpgradePlanButton source={EXPERIMENT_ID} className={className} onClick={handleClick} />
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { CommandMenuTriggerInput } from 'ui-patterns'

import { BreadcrumbsView } from './BreadcrumbsView'
import { FeedbackDropdown } from './FeedbackDropdown/FeedbackDropdown'
import { HeaderUpgradeButton } from './HeaderUpgradeButton'
import { HomeIcon } from './HomeIcon'
import { LocalVersionPopover } from './LocalVersionPopover'
import { MergeRequestButton } from './MergeRequestButton'
Expand Down Expand Up @@ -253,6 +254,7 @@ export const LayoutHeader = ({
)}
</AnimatePresence>
</div>
<HeaderUpgradeButton className="hidden md:flex" />
<UserDropdown triggerClassName="hidden md:flex" />
</>
) : (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { useState } from 'react'
import { Button, cn } from 'ui'
import { CommandMenuTrigger, MobileSheetNav } from 'ui-patterns'

import { HeaderUpgradeButton } from '../LayoutHeader/HeaderUpgradeButton'
import { HomeIcon } from '../LayoutHeader/HomeIcon'
import { useMobileSheet } from './MobileSheetContext'
import { OrgSelector } from './OrgSelector'
Expand Down Expand Up @@ -91,6 +92,7 @@ const MobileNavigationBar = ({
</button>
</CommandMenuTrigger>
)}
{IS_PLATFORM && <HeaderUpgradeButton />}
{IS_PLATFORM ? <UserDropdown /> : <LocalDropdown />}
{!hideMobileMenu && (
<Button
Expand Down
4 changes: 3 additions & 1 deletion apps/studio/components/ui/UpgradePlanButton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ interface UpgradePlanButtonProps {
disabled?: boolean
className?: string
slug?: string
onClick?: () => void
}

/**
Expand All @@ -42,6 +43,7 @@ export const UpgradePlanButton = ({
children,
className,
slug: slugParam,
onClick,
}: PropsWithChildren<UpgradePlanButtonProps>) => {
const { ref } = useParams()
const { data: organization } = useSelectedOrganizationQuery()
Expand Down Expand Up @@ -120,7 +122,7 @@ export const UpgradePlanButton = ({
}

return (
<Button asChild type={variant} disabled={disabled} className={className}>
<Button asChild type={variant} disabled={disabled} className={className} onClick={onClick}>
{link}
</Button>
)
Expand Down
13 changes: 13 additions & 0 deletions packages/common/telemetry-constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3021,6 +3021,18 @@ export interface PricingPageExperimentExposedEvent {
}
}

/**
* User clicked the "Upgrade to Pro" CTA in the dashboard header.
* GROWTH-615: always-visible upgrade button in dashboard header for free-plan users.
*
* @group Events
* @source studio
*/
export interface HeaderUpgradeCtaClickedEvent {
action: 'header_upgrade_cta_clicked'
groups: Omit<TelemetryGroups, 'project'>
}

/**
* @hidden
*/
Expand Down Expand Up @@ -3190,3 +3202,4 @@ export type TelemetryEvent =
| FreeMicroUpgradeBannerDismissedEvent
| FreeMicroUpgradeBannerCtaClickedEvent
| PricingPageExperimentExposedEvent
| HeaderUpgradeCtaClickedEvent
Loading