import {useEffect, useState} from 'react' import {CalendarClock, Loader2, Plus, Trash2} from 'lucide-react' import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query' import {createEventBridgeLambdaTrigger, deleteEventBridgeLambdaTrigger, listEventBridgeLambdaTriggers, type EventBridgeLambdaTriggerOverview} from '@/api/cloudProxyClient' import type {CloudProvider} from '@/types/cloud' import type {CloudResource} from '@/types/resource' import {ServiceIcon} from '@/components/serviceIcons' interface ScheduledLambdaTriggerPanelProps { cloud: CloudProvider resource?: CloudResource runtimeReachable: boolean } export function ScheduledLambdaTriggerPanel({cloud, resource, runtimeReachable}: ScheduledLambdaTriggerPanelProps) { const [ruleName, setRuleName] = useState('') const [scheduleExpression, setScheduleExpression] = useState('rate(5 minutes)') const [deleteTarget, setDeleteTarget] = useState(null) const queryClient = useQueryClient() const triggersQuery = useQuery({ queryKey: ['eventbridge-lambda-triggers', cloud, resource?.id], queryFn: ({signal}) => listEventBridgeLambdaTriggers(cloud, resource!.name, signal), enabled: cloud === 'aws' && Boolean(resource) && runtimeReachable, }) useEffect(() => { setRuleName('') setScheduleExpression('rate(5 minutes)') setDeleteTarget(null) }, [resource?.id]) const createMutation = useMutation({ mutationFn: () => createEventBridgeLambdaTrigger(cloud, resource!.name, {ruleName, scheduleExpression}), onSuccess: () => { setRuleName('') queryClient.invalidateQueries({queryKey: ['eventbridge-lambda-triggers', cloud, resource?.id]}) }, }) const deleteMutation = useMutation({ mutationFn: (trigger: EventBridgeLambdaTriggerOverview) => deleteEventBridgeLambdaTrigger(cloud, resource!.name, trigger.id), onSuccess: () => { setDeleteTarget(null) queryClient.invalidateQueries({queryKey: ['eventbridge-lambda-triggers', cloud, resource?.id]}) }, }) if (!resource || resource.service !== 'serverless' || resource.type !== 'lambda') return null const canCreate = Boolean(ruleName.trim() && scheduleExpression.trim()) && !createMutation.isPending return

Schedule

Add scheduled trigger

Invoke {resource.name} on an EventBridge schedule.

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

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

}

Configured Schedules

EventBridge rules

{triggersQuery.isLoading &&

Loading scheduled triggers...

} {triggersQuery.isError &&

{triggersQuery.error instanceof Error ? triggersQuery.error.message : 'Unable to load scheduled triggers.'}

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

No scheduled triggers configured for this Lambda.

} {triggersQuery.data?.map((trigger) =>
RULE{trigger.ruleName}{trigger.scheduleExpression}{trigger.state ? ` ยท ${trigger.state}` : ''}
{deleteTarget?.id === trigger.id ?
Remove schedule?
: }
)}
}