import {useQuery} from '@tanstack/react-query' import {FormEvent, useEffect, useState} from 'react' import {getLoadBalancingDependencies} from '@/api/cloudProxyClient' import type {CloudResource} from '@/types/resource' type Props = { resource?: CloudResource isSubmitting: boolean submitError: string | null onCancel: () => void onSubmit: (values: Record) => void } export function LoadBalancerPanel({resource, isSubmitting, submitError, onCancel, onSubmit}: Props) { const dependencies = useQuery({queryKey: ['loadbalancing-dependencies'], queryFn: ({signal}) => getLoadBalancingDependencies('loadbalancing', signal)}) const [name, setName] = useState('') const [scheme, setScheme] = useState('internet-facing') const [vpcId, setVpcId] = useState('') const [subnetIds, setSubnetIds] = useState([]) const [securityGroupIds, setSecurityGroupIds] = useState([]) const [error, setError] = useState(null) useEffect(() => { if (!resource) return setVpcId(typeof resource.metadata.vpcId === 'string' ? resource.metadata.vpcId : '') setSecurityGroupIds(stringValues(resource.metadata.securityGroups)) }, [resource]) const subnets = (dependencies.data?.subnets ?? []).filter((subnet) => subnet.vpcId === vpcId) const groups = (dependencies.data?.securityGroups ?? []).filter((group) => group.vpcId === vpcId) const selectedZones = new Set(subnets.filter((subnet) => subnetIds.includes(subnet.id)).map((subnet) => subnet.availabilityZone)) function selectVpc(nextVpcId: string) { setVpcId(nextVpcId) setSubnetIds([]) setSecurityGroupIds([]) setError(null) } function submit(event: FormEvent) { event.preventDefault() if (!resource && !name.trim()) return setError('Load balancer name is required.') if (!resource && (subnetIds.length < 2 || selectedZones.size < 2)) return setError('Select two subnets in distinct Availability Zones.') if (securityGroupIds.length === 0) return setError('Select at least one security group.') setError(null) onSubmit(resource ? {securityGroups: securityGroupIds.join(',')} : { name: name.trim(), subnets: subnetIds.join(','), securityGroups: securityGroupIds.join(','), scheme, }) } if (dependencies.isLoading) return

Loading VPC configuration...

if (dependencies.isError) return

Unable to load VPC configuration.

return
{resource ? 'Security groups' : 'Application Load Balancer'}
{!resource && } {!resource && } {!resource &&
Subnets*Select at least two subnets in distinct Availability Zones.{subnets.map((subnet) => )}
}
Security Groups*{groups.map((group) => )}
{(error || submitError) &&
{error ?? submitError}
}
} function toggle(values: string[], value: string): string[] { return values.includes(value) ? values.filter((entry) => entry !== value) : [...values, value] } function stringValues(value: unknown): string[] { return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === 'string') : [] }