import { useParams } from 'common' import { UseFormReturn } from 'react-hook-form' import { FormControl, FormField, FormInputGroupInput, InputGroup, InputGroupAddon, InputGroupText, } from 'ui' import { Admonition } from 'ui-patterns' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { DiskStorageSchemaType } from '../DiskManagement.schema' import { DISK_AUTOSCALE_CONFIG_DEFAULTS } from '../ui/DiskManagement.constants' import { useDiskAutoscaleCustomConfigQuery } from '@/data/config/disk-autoscale-config-query' type AutoScaleFieldProps = { form: UseFormReturn } export const AutoScaleFields = ({ form }: AutoScaleFieldProps) => { const { ref: projectRef } = useParams() const { control, setValue, formState: { errors }, } = form const { totalSize, growthPercent, maxSizeGb, minIncrementGb } = form.watch() const { isError } = useDiskAutoscaleCustomConfigQuery({ projectRef }) const _growthPercent = growthPercent ?? DISK_AUTOSCALE_CONFIG_DEFAULTS.growthPercent const _minIncrementGb = minIncrementGb ?? DISK_AUTOSCALE_CONFIG_DEFAULTS.minIncrementSize const _maxSizeGb = errors.maxSizeGb ? DISK_AUTOSCALE_CONFIG_DEFAULTS.maxSizeGb : (maxSizeGb ?? DISK_AUTOSCALE_CONFIG_DEFAULTS.maxSizeGb) const growthSize = Math.floor(totalSize * (_growthPercent / 100)) const autoscaleGrowValue = Math.min( Math.max(Math.floor((totalSize * _growthPercent) / 100), _minIncrementGb), 200 ) const totalSizeAfterGrowth = Math.max(autoscaleGrowValue + totalSize, 8) const formattedTotalSizeAfterGrowth = totalSizeAfterGrowth < _maxSizeGb ? totalSizeAfterGrowth : _maxSizeGb const formattedGrowValue = formattedTotalSizeAfterGrowth - totalSize return ( <> { return ( { setValue( 'growthPercent', e.target.value === '' ? null : e.target.valueAsNumber, { shouldDirty: true, shouldValidate: true, } ) }} placeholder={String(DISK_AUTOSCALE_CONFIG_DEFAULTS.growthPercent)} /> % ) }} /> { return ( growthSize && !errors.minIncrementGb ? `This value takes precedence as the minimum increment is larger than the growth percent` : undefined } className="[&>div>span]:text-foreground-lighter" > { setValue( 'minIncrementGb', e.target.value === '' ? null : e.target.valueAsNumber, { shouldDirty: true, shouldValidate: true, } ) }} placeholder={String(DISK_AUTOSCALE_CONFIG_DEFAULTS.minIncrementSize)} /> GB ) }} /> { return ( { setValue('maxSizeGb', e.target.value === '' ? null : e.target.valueAsNumber, { shouldDirty: true, shouldValidate: true, }) }} placeholder={String(DISK_AUTOSCALE_CONFIG_DEFAULTS.maxSizeGb)} /> GB ) }} /> { Disk size will automatically be expanded by{' '} {String(formattedGrowValue).length > 4 ? formattedGrowValue.toFixed(2) : formattedGrowValue}{' '} GB {' '} to a total of {formattedTotalSizeAfterGrowth} GB{' '} when the database reaches 90% of the disk size } ) }