import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' import { ExternalLink, Info } from 'lucide-react' import Link from 'next/link' import { SetStateAction } from 'react' import { toast } from 'sonner' import { Alert, AlertDescription, AlertTitle, Button, InfoIcon } from 'ui' import { PageSection, PageSectionContent, PageSectionMeta, PageSectionSummary, PageSectionTitle, } from 'ui-patterns' import { Markdown } from '@/components/interfaces/Markdown' import DiskSizeConfigurationModal from '@/components/interfaces/Settings/Database/DiskSizeConfigurationModal' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' import { DocsButton } from '@/components/ui/DocsButton' import Panel from '@/components/ui/Panel' import { useProjectDiskResizeMutation } from '@/data/config/project-disk-resize-mutation' import { useDatabaseSizeQuery } from '@/data/database/database-size-query' import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' import { useIsAwsNimbusCloudProvider, useSelectedProjectQuery, } from '@/hooks/misc/useSelectedProject' import { useUrlState } from '@/hooks/ui/useUrlState' import { DOCS_URL } from '@/lib/constants' import { formatBytes } from '@/lib/helpers' export interface DiskSizeConfigurationProps { disabled?: boolean } export const DiskSizeConfiguration = ({ disabled = false }: DiskSizeConfigurationProps) => { const { ref: projectRef } = useParams() const { data: project } = useSelectedProjectQuery() const { data: organization } = useSelectedOrganizationQuery() const isAwsNimbus = useIsAwsNimbusCloudProvider() const { reportsAll } = useIsFeatureEnabled(['reports:all']) const [{ show_increase_disk_size_modal }, setUrlParams] = useUrlState() const showIncreaseDiskSizeModal = show_increase_disk_size_modal === 'true' const setShowIncreaseDiskSizeModal = (value: SetStateAction) => { const show = typeof value === 'function' ? value(showIncreaseDiskSizeModal) : value setUrlParams({ show_increase_disk_size_modal: show ? 'true' : undefined }) } const { can: canUpdateDiskSizeConfig } = useAsyncCheckPermissions( PermissionAction.UPDATE, 'projects', { resource: { project_id: project?.id, }, } ) const { isPending: isUpdatingDiskSize } = useProjectDiskResizeMutation({ onSuccess: (_, variables) => { toast.success(`Successfully updated disk size to ${variables.volumeSize} GB`) setShowIncreaseDiskSizeModal(false) }, }) const { hasAccess: hasAccessToDiskSizeConfig } = useCheckEntitlements( 'instances.disk_modifications' ) const currentDiskSize = project?.volumeSizeGb ?? 0 const { data } = useDatabaseSizeQuery({ projectRef: project?.ref, connectionString: project?.connectionString, }) const databaseSizeBytesUsed = data ?? 0 return ( <> Disk Management {organization?.usage_billing_enabled === true ? (
{currentDiskSize && (

Current Disk Storage

)}

Briven employs auto-scaling storage and allows for manual disk size adjustments when necessary

{!isAwsNimbus && ( setShowIncreaseDiskSizeModal(true)} tooltip={{ content: { side: 'bottom', text: !canUpdateDiskSizeConfig ? 'You need additional permissions to increase the disk size' : undefined, }, }} > Increase disk size )}
Space used
{formatBytes(databaseSizeBytesUsed, 2, 'GB')}
Total size
{currentDiskSize} GB
{reportsAll && (
)}
Importing a lot of data?
) : ( {hasAccessToDiskSizeConfig === false ? 'Disk size configuration is not available for projects on the Free Plan' : 'Disk size configuration is only available when the spend cap has been disabled'} {hasAccessToDiskSizeConfig === false ? (

If you are intending to use more than 500MB of disk space, then you will need to upgrade to at least the Pro Plan.

) : (

If you are intending to use more than 8GB of disk space, then you will need to disable your spend cap.

)}
)}
) }