import dayjs from 'dayjs' import { ExternalLink } from 'lucide-react' import Link from 'next/link' import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' import { useOrgUsageQuery } from 'data/usage/org-usage-query' import { useSelectedOrganization } from 'hooks/misc/useSelectedOrganization' import { AlertDescription_Shadcn_, AlertTitle_Shadcn_, Alert_Shadcn_, Button } from 'ui' import { CriticalIcon, WarningIcon } from 'ui' import { PricingMetric } from 'data/analytics/org-daily-stats-query' export const Restriction = () => { const org = useSelectedOrganization() const { data: usage, isSuccess: isSuccessOrgUsage } = useOrgUsageQuery({ orgSlug: org?.slug }) const { data: subscription, isSuccess: isSuccessSubscription } = useOrgSubscriptionQuery({ orgSlug: org?.slug, }) const hasExceededAnyLimits = Boolean( usage?.usages.find( (metric) => metric.metric !== PricingMetric.DISK_SIZE_GB_HOURS_GP3 && !metric.unlimited && metric.capped && metric.usage > (metric?.pricing_free_units ?? 0) ) ) // don't show any alerts until everything has been fetched if (!isSuccessOrgUsage || !isSuccessSubscription || !org) { return null } let shownAlert: 'exceededLimits' | 'gracePeriod' | 'gracePeriodOver' | 'restricted' | null = null if (subscription && hasExceededAnyLimits && !org?.restriction_status) { shownAlert = 'exceededLimits' } else if (org?.restriction_status === 'grace_period') { shownAlert = 'gracePeriod' } else if (org?.restriction_status === 'grace_period_over') { shownAlert = 'gracePeriodOver' } else if (org?.restriction_status === 'restricted') { shownAlert = 'restricted' } if (shownAlert === null) { return null } return ( <> {shownAlert === 'exceededLimits' && ( Your organization's usage has exceeded its included quota

Your projects can become unresponsive or enter read-only mode.{' '} {subscription.plan.id === 'free' ? 'Please upgrade to the Pro Plan to ensure that your projects remain available.' : 'Please disable spend cap to ensure that your projects remain available.'}

)} {shownAlert === 'gracePeriod' && ( Your grace period has started.

Your organization is over its quota. You can continue with your projects until your grace period ends on{' '} {dayjs(org.restriction_data['grace_period_end']).format('DD MMM, YYYY')} . After that, the Fair Use Policy will apply. If you plan to maintain this level of usage, upgrade your plan to avoid any restrictions. If restrictions are applied, requests to your projects will return a 402 status code.

)} {shownAlert === 'gracePeriodOver' && ( Your grace period is over.

Your grace period ended on{' '} {dayjs(org.restriction_data['grace_period_end']).format('DD MMM, YYYY')} . Fair Use Policy applies now. Stay below your plan’s quota or upgrade your plan if you expect to exceed it. If you exceed your quota, requests will respond with a 402 status code.

)} {shownAlert === 'restricted' && ( All services are restricted.

Fair Use Policy applies and your service is restricted. Your projects are not able to serve requests and will respond with a 402 status code. You have exceeded your plan’s quota and your grace period ended on{' '} {dayjs(org.restriction_data['grace_period_end']).format('DD MMM, YYYY')} . Upgrade to lift restrictions or wait until your quota refills.

)} ) }