import { useParams } from 'common' import { useState } from 'react' import { AWS_REGIONS, AWS_REGIONS_KEYS } from 'shared-data' import { toast } from 'sonner' import { Button, InfoIcon, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, SheetFooter, SheetSection, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { ReadReplicaEligibilityWarnings } from './ReadReplicaEligibilityWarnings' import { ReadReplicaPricingDialog } from './ReadReplicaPricingDialog' import { useCheckEligibilityDeployReplica } from './useCheckEligibilityDeployReplica' import { useGetReplicaCost } from './useGetReplicaCost' import { AVAILABLE_REPLICA_REGIONS } from '@/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.constants' import { Region, useReadReplicaSetUpMutation } from '@/data/read-replicas/replica-setup-mutation' import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' import { AWS_REGIONS_DEFAULT, BASE_PATH } from '@/lib/constants' interface ReadReplicaFormProps { onSuccess: () => void onClose: () => void } export const ReadReplicaForm = ({ onSuccess, onClose }: ReadReplicaFormProps) => { const { ref: projectRef } = useParams() const { data } = useReadReplicasQuery({ projectRef }) const [defaultRegion] = Object.entries(AWS_REGIONS).find( ([_, name]) => name === AWS_REGIONS_DEFAULT ) ?? ['ap-southeast-1'] const { totalCost } = useGetReplicaCost() const { can: canDeployReplica } = useCheckEligibilityDeployReplica() const [selectedRegion, setSelectedRegion] = useState(defaultRegion) const { mutate: setUpReplica, isPending: isSettingUp } = useReadReplicaSetUpMutation({ onSuccess: () => { const region = AVAILABLE_REPLICA_REGIONS.find((r) => r.key === selectedRegion)?.name toast.success(`Spinning up new replica in ${region ?? ' Unknown'}...`) onSuccess?.() onClose() }, }) const availableRegions = process.env.NEXT_PUBLIC_ENVIRONMENT === 'staging' ? AVAILABLE_REPLICA_REGIONS.filter((x) => ['SOUTHEAST_ASIA', 'CENTRAL_EU', 'EAST_US'].includes(x.key) ) : AVAILABLE_REPLICA_REGIONS const onSubmit = async () => { const regionKey = AWS_REGIONS[selectedRegion as AWS_REGIONS_KEYS].code if (!projectRef) return console.error('Project is required') if (!regionKey) return toast.error('Unable to deploy replica: Unsupported region selected') const primary = data?.find((db) => db.identifier === projectRef) setUpReplica({ projectRef, region: regionKey as Region, size: primary?.size ?? 't4g.small' }) } return ( <> {!canDeployReplica && ( )}

New replica will cost an additional {totalCost}/month

) }