import React, { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import axios from '../api/client'; import { Zap, Plus, Trash2, Clock, CheckCircle2, XCircle, ChevronDown, Power } from 'lucide-react'; import toast from 'react-hot-toast'; interface PluginInstallation { id: string; template_name: string; template_description: string; category: string; logo_url?: string; } interface EventPlugin { id: string; event: number; plugin_installation: number; plugin_name: string; plugin_description: string; plugin_category: string; plugin_logo_url?: string; trigger: string; trigger_display: string; offset_minutes: number; timing_description: string; is_active: boolean; execution_order: number; } interface TriggerOption { value: string; label: string; } interface OffsetPreset { value: number; label: string; } interface EventAutomationsProps { eventId: string | number; compact?: boolean; } const TRIGGER_OPTIONS: TriggerOption[] = [ { value: 'before_start', label: 'Before Start' }, { value: 'at_start', label: 'At Start' }, { value: 'after_start', label: 'After Start' }, { value: 'after_end', label: 'After End' }, { value: 'on_complete', label: 'When Completed' }, { value: 'on_cancel', label: 'When Canceled' }, ]; const OFFSET_PRESETS: OffsetPreset[] = [ { value: 0, label: 'Immediately' }, { value: 5, label: '5 min' }, { value: 10, label: '10 min' }, { value: 15, label: '15 min' }, { value: 30, label: '30 min' }, { value: 60, label: '1 hour' }, ]; const EventAutomations: React.FC = ({ eventId, compact = false }) => { const queryClient = useQueryClient(); const [showAddForm, setShowAddForm] = useState(false); const [selectedPlugin, setSelectedPlugin] = useState(''); const [selectedTrigger, setSelectedTrigger] = useState('at_start'); const [selectedOffset, setSelectedOffset] = useState(0); // Fetch installed plugins const { data: plugins = [] } = useQuery({ queryKey: ['plugin-installations'], queryFn: async () => { const { data } = await axios.get('/api/plugin-installations/'); return data; }, }); // Fetch event plugins const { data: eventPlugins = [], isLoading } = useQuery({ queryKey: ['event-plugins', eventId], queryFn: async () => { const { data } = await axios.get(`/api/event-plugins/?event_id=${eventId}`); return data; }, enabled: !!eventId, }); // Add plugin mutation const addMutation = useMutation({ mutationFn: async (data: { plugin_installation: string; trigger: string; offset_minutes: number }) => { return axios.post('/api/event-plugins/', { event: eventId, ...data, }); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['event-plugins', eventId] }); setShowAddForm(false); setSelectedPlugin(''); setSelectedTrigger('at_start'); setSelectedOffset(0); toast.success('Automation added'); }, onError: () => { toast.error('Failed to add automation'); }, }); // Toggle mutation const toggleMutation = useMutation({ mutationFn: async (pluginId: string) => { return axios.post(`/api/event-plugins/${pluginId}/toggle/`); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['event-plugins', eventId] }); }, }); // Delete mutation const deleteMutation = useMutation({ mutationFn: async (pluginId: string) => { return axios.delete(`/api/event-plugins/${pluginId}/`); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['event-plugins', eventId] }); toast.success('Automation removed'); }, }); const handleAdd = () => { if (!selectedPlugin) return; addMutation.mutate({ plugin_installation: selectedPlugin, trigger: selectedTrigger, offset_minutes: selectedOffset, }); }; const showOffset = !['on_complete', 'on_cancel'].includes(selectedTrigger); if (isLoading) { return (
Loading automations...
); } return (
{/* Header */}
Automations {eventPlugins.length > 0 && ( {eventPlugins.length} )}
{!showAddForm && plugins.length > 0 && ( )}
{/* Existing automations */} {eventPlugins.length > 0 && (
{eventPlugins.map((ep) => (

{ep.plugin_name}

{ep.timing_description}
))}
)} {/* Add automation form */} {showAddForm && (
{/* Plugin selector */}
{/* Timing selector - visual */}
{TRIGGER_OPTIONS.map((opt) => ( ))}
{/* Offset selector - only for time-based triggers */} {showOffset && (
{OFFSET_PRESETS.map((preset) => ( ))}
)} {/* Preview */} {selectedPlugin && (
Will run: {selectedTrigger === 'on_complete' ? 'When completed' : selectedTrigger === 'on_cancel' ? 'When canceled' : selectedTrigger === 'before_start' && selectedOffset > 0 ? `${selectedOffset} min before start` : selectedTrigger === 'after_end' && selectedOffset > 0 ? `${selectedOffset} min after end` : selectedTrigger === 'after_start' && selectedOffset > 0 ? `${selectedOffset} min after start` : selectedTrigger === 'at_start' && selectedOffset > 0 ? `${selectedOffset} min after start` : selectedTrigger === 'before_start' ? 'At start' : selectedTrigger === 'after_end' ? 'At end' : 'At start'}
)} {/* Actions */}
)} {/* Empty state */} {eventPlugins.length === 0 && !showAddForm && (
{plugins.length > 0 ? ( ) : (

Install plugins from the Marketplace to use automations

)}
)}
); }; export default EventAutomations;