import MotionNumber from '@number-flow/react' import Link from 'next/link' import { useMemo } from 'react' import { Alert, AlertDescription, AlertTitle, Button, CriticalIcon } from 'ui' import { InfoTooltip } from 'ui-patterns/info-tooltip' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { SectionContent } from '../SectionContent' import { CategoryAttribute } from '../Usage.constants' import AlertError from '@/components/ui/AlertError' import Panel from '@/components/ui/Panel' import { PricingMetric } from '@/data/analytics/org-daily-stats-query' import { useOrgProjectsInfiniteQuery } from '@/data/projects/org-projects-infinite-query' import type { OrgSubscription } from '@/data/subscriptions/types' import { OrgUsageResponse } from '@/data/usage/org-usage-query' import { PROJECT_STATUS } from '@/lib/constants' export interface DiskUsageProps { slug: string projectRef?: string | null attribute: CategoryAttribute subscription?: OrgSubscription usage?: OrgUsageResponse currentBillingCycleSelected: boolean } export const DiskUsage = ({ slug, projectRef, attribute, subscription, usage, currentBillingCycleSelected, }: DiskUsageProps) => { const { data, isError, isPending: isLoading, isSuccess, error, } = useOrgProjectsInfiniteQuery({ slug }, { enabled: currentBillingCycleSelected }) const projects = useMemo(() => data?.pages.flatMap((page) => page.projects) || [], [data?.pages]) const relevantProjects = useMemo(() => { return isSuccess ? projects .filter((project) => { // We do want to show branches that are exceeding the 8 GB limit, as people could have persistent or very long-living branches const isBranchExceedingFreeQuota = project.is_branch && project.databases.some((db) => (db.disk_volume_size_gb ?? 8) > 8) const isActiveProject = project.status !== PROJECT_STATUS.INACTIVE const isHostedOnAws = project.databases.every((db) => db.cloud_provider === 'AWS') return ( (!project.is_branch || isBranchExceedingFreeQuota) && isActiveProject && isHostedOnAws ) }) .filter((it) => it.ref === projectRef || !projectRef) : [] // eslint-disable-next-line react-hooks/exhaustive-deps }, [isSuccess, projects, projectRef]) const hasProjectsExceedingDiskSize = useMemo(() => { return relevantProjects.some((it) => it.databases.some( (db) => db.type === 'READ_REPLICA' || (db.disk_volume_size_gb && db.disk_volume_size_gb > 8) ) ) }, [relevantProjects]) const gp3UsageInPeriod = usage?.usages.find( (it) => it.metric === PricingMetric.DISK_SIZE_GB_HOURS_GP3 ) const io2UsageInPeriod = usage?.usages.find( (it) => it.metric === PricingMetric.DISK_SIZE_GB_HOURS_IO2 ) return (
{attribute.name} usage
Included in {subscription?.plan?.name} Plan
8 GB GP3 disk per project
Overages in period
{(gp3UsageInPeriod?.usage ?? 0).toLocaleString()} GP3 GB-Hrs {io2UsageInPeriod?.usage ? ` / ${io2UsageInPeriod.usage.toLocaleString()} IO2 GB-Hrs` : ``}
Current disk size per project
Breakdown of disk per project. Head to your project's disk management section to see database size used.
No active projects
You don't have any active projects in this organization.
{primaryDiskUsage} GB for Primary Database
{replicaDbs.length > 0 && ( <>{replicaDiskUsage} GB for {replicaDbs.length} Read{' '} {replicaDbs.length === 1 ? 'Replica' : 'Replicas'}
Read replicas have their own disk and use 25% more disk to account for WAL files.
> )}Data not available
Switch to current billing cycle to see current disk size per project.