import { PermissionAction } from '@supabase/shared-types/out/constants' import { useFlag, useParams } from 'common' import { ExternalLink } from 'lucide-react' import { useTheme } from 'next-themes' import Image from 'next/image' import Link from 'next/link' import { Alert, AlertTitle, Button } from 'ui' import { Admonition } from 'ui-patterns/admonition' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { ProjectUpdateDisabledTooltip } from '../ProjectUpdateDisabledTooltip' import SpendCapSidePanel from './SpendCapSidePanel' import { ScaffoldSection, ScaffoldSectionContent, ScaffoldSectionDetail, } from '@/components/layouts/Scaffold' import AlertError from '@/components/ui/AlertError' import { InlineLink } from '@/components/ui/InlineLink' import NoPermission from '@/components/ui/NoPermission' import PartnerIcon from '@/components/ui/PartnerIcon' import { PARTNER_TO_NAME } from '@/components/ui/PartnerManagedResource' import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' import { BASE_PATH, DOCS_URL } from '@/lib/constants' import { MANAGED_BY } from '@/lib/constants/infrastructure' import { useOrgSettingsPageStateSnapshot } from '@/state/organization-settings' export interface CostControlProps {} const CostControl = ({}: CostControlProps) => { const { slug } = useParams() const { resolvedTheme } = useTheme() const { data: selectedOrganization } = useSelectedOrganizationQuery() const { isSuccess: isPermissionsLoaded, can: canReadSubscriptions } = useAsyncCheckPermissions( PermissionAction.BILLING_READ, 'stripe.subscriptions' ) const snap = useOrgSettingsPageStateSnapshot() const projectUpdateDisabled = useFlag('disableProjectCreationAndUpdate') const { data: subscription, error, isPending: isLoading, isSuccess, isError, } = useOrgSubscriptionQuery({ orgSlug: slug }, { enabled: canReadSubscriptions }) const currentPlan = subscription?.plan const isUsageBillingEnabled = subscription?.usage_billing_enabled ?? false const canChangeTier = !projectUpdateDisabled && !['team', 'enterprise', 'platform'].includes(currentPlan?.id || '') const costControlDisabled = selectedOrganization?.managed_by === MANAGED_BY.AWS_MARKETPLACE return ( <>

Cost Control

Allow scaling beyond your plan's{' '} included quota.

More information

Spend cap

{isPermissionsLoaded && !canReadSubscriptions ? ( ) : ( <> {isLoading && (
)} {isError && } {isSuccess && costControlDisabled && ( The Spend Cap is not available for organizations managed by{' '} {PARTNER_TO_NAME[selectedOrganization?.managed_by]}. )} {isSuccess && !costControlDisabled && (
{['team', 'enterprise', 'platform'].includes(currentPlan?.id || '') ? ( <> {currentPlan?.name || ''} plan requires you to have spend cap off at all times. Your projects will never become unresponsive. Only when your{' '} included usage {' '} is exceeded will you be charged for any additional usage. } /> ) : (

If you need to go beyond the included quota, simply switch off your spend cap to pay for additional usage.

)}
Spend Cap

Spend cap is {isUsageBillingEnabled ? 'disabled' : 'enabled'}

{isUsageBillingEnabled ? ( You will be charged for usage beyond the included quota. ) : ( You won't be charged any extra for usage. However, your projects could become unresponsive or enter read only mode if you exceed the included quota. )}

)} )}
) } export default CostControl