import {useEffect, useState} from 'react' import {Loader2, Plus, Trash2} from 'lucide-react' import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query' import {createSqsLambdaEventSourceMapping, deleteSqsLambdaEventSourceMapping, listCloudResources, listSqsLambdaEventSourceMappings, type SqsLambdaEventSourceMappingOverview} from '@/api/cloudProxyClient' import type {CloudProvider} from '@/types/cloud' import type {CloudResource} from '@/types/resource' import {ServiceIcon} from '@/components/serviceIcons' interface SqsLambdaTriggerPanelProps { cloud: CloudProvider resource?: CloudResource runtimeReachable: boolean } export function SqsLambdaTriggerPanel({cloud, resource, runtimeReachable}: SqsLambdaTriggerPanelProps) { const [queueArn, setQueueArn] = useState('') const [batchSize, setBatchSize] = useState('10') const [deleteTarget, setDeleteTarget] = useState(null) const queryClient = useQueryClient() const queuesQuery = useQuery({ queryKey: ['cloud-resources', cloud, 'messaging'], queryFn: ({signal}) => listCloudResources(cloud, 'messaging', undefined, signal), enabled: cloud === 'aws' && Boolean(resource) && runtimeReachable, }) const mappingsQuery = useQuery({ queryKey: ['sqs-lambda-event-source-mappings', cloud, resource?.id], queryFn: ({signal}) => listSqsLambdaEventSourceMappings(cloud, resource!.name, signal), enabled: cloud === 'aws' && Boolean(resource) && runtimeReachable, }) useEffect(() => { setQueueArn('') setBatchSize('10') setDeleteTarget(null) }, [resource?.id]) const createMutation = useMutation({ mutationFn: () => createSqsLambdaEventSourceMapping(cloud, resource!.name, {queueArn, batchSize: Number(batchSize)}), onSuccess: () => { setQueueArn('') queryClient.invalidateQueries({queryKey: ['sqs-lambda-event-source-mappings', cloud, resource?.id]}) }, }) const deleteMutation = useMutation({ mutationFn: (mapping: SqsLambdaEventSourceMappingOverview) => deleteSqsLambdaEventSourceMapping(cloud, resource!.name, mapping.id), onSuccess: () => { setDeleteTarget(null) queryClient.invalidateQueries({queryKey: ['sqs-lambda-event-source-mappings', cloud, resource?.id]}) }, }) if (!resource || resource.service !== 'serverless' || resource.type !== 'lambda') return null const queues = (queuesQuery.data ?? []).filter((queue) => (queue.type === 'queue' || queue.type === 'fifo-queue') && typeof queue.metadata.arn === 'string') const parsedBatchSize = Number(batchSize) const canCreate = Boolean(queueArn) && Number.isInteger(parsedBatchSize) && parsedBatchSize >= 1 && parsedBatchSize <= 10 && !createMutation.isPending return

Event Source

Add SQS trigger

Poll an SQS queue and invoke {resource.name} for each batch.

{ event.preventDefault() if (canCreate) createMutation.mutate() }}>
{createMutation.isError &&

{createMutation.error instanceof Error ? createMutation.error.message : 'Unable to add SQS trigger.'}

}

Configured Triggers

SQS event source mappings

{mappingsQuery.isLoading &&

Loading SQS triggers...

} {mappingsQuery.isError &&

{mappingsQuery.error instanceof Error ? mappingsQuery.error.message : 'Unable to load SQS triggers.'}

} {mappingsQuery.data?.length === 0 &&

No SQS triggers configured for this Lambda.

} {mappingsQuery.data?.map((mapping) =>
SQS{mapping.queueArn}Batch size: {mapping.batchSize ?? 'default'}{mapping.state ? ` ยท ${mapping.state}` : ''}
{deleteTarget?.id === mapping.id ?
Remove trigger?
: }
)}
}