import { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import axios from 'axios'; import { useForm } from 'react-hook-form'; import { toast } from 'sonner'; interface Campaign { id: string; name: string; url: string; image_url?: string; // QR code image URL if we want to show it is_active: boolean; created_at: string; } interface CreateCampaignInputs { name: string; url: string; } export const CampaignManagement = () => { const queryClient = useQueryClient(); const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); const { register, handleSubmit, reset, formState: { errors }, } = useForm(); // Fetch Campaigns const { data: campaigns, isLoading, isError, } = useQuery({ queryKey: ['campaigns'], queryFn: async () => { const res = await axios.get('http://localhost:8080/api/v1/campaigns'); return res.data.data as Campaign[]; }, }); // Create Campaign const createMutation = useMutation({ mutationFn: async (data: CreateCampaignInputs) => { await axios.post('http://localhost:8080/api/v1/campaigns', data); }, onSuccess: () => { toast.success('Campaign created successfully'); queryClient.invalidateQueries({ queryKey: ['campaigns'] }); setIsCreateModalOpen(false); reset(); }, onError: (error: any) => { toast.error(error.response?.data?.message || 'Failed to create campaign'); }, }); // Activate Campaign const activateMutation = useMutation({ mutationFn: async (id: string) => { await axios.put(`http://localhost:8080/api/v1/campaigns/${id}/activate`); }, onSuccess: () => { toast.success('Campaign activated'); queryClient.invalidateQueries({ queryKey: ['campaigns'] }); // Also invalidate active QR for the main app queryClient.invalidateQueries({ queryKey: ['active-campaign-qr'] }); }, onError: () => toast.error('Failed to activate campaign'), }); // Delete Campaign const deleteMutation = useMutation({ mutationFn: async (id: string) => { await axios.delete(`http://localhost:8080/api/v1/campaigns/${id}`); }, onSuccess: () => { toast.success('Campaign deleted'); queryClient.invalidateQueries({ queryKey: ['campaigns'] }); }, onError: () => toast.error('Failed to delete campaign'), }); const onCreateSubmit = (data: CreateCampaignInputs) => { createMutation.mutate(data); }; if (isLoading) return
Loading campaigns...
; if (isError) return
Error loading campaigns.
; return (

Campaigns

{campaigns?.map((campaign) => ( ))} {campaigns?.length === 0 && ( )}
Name URL Status Actions
{campaign.name} {campaign.url} {campaign.is_active ? ( Active ) : ( Inactive )} {!campaign.is_active && ( )}
No campaigns found. Create one to get started.
{/* Basic Create Modal */} {isCreateModalOpen && (

Create New Campaign

{errors.name && (

{errors.name.message}

)}
{errors.url && (

{errors.url.message}

)}
)}
); };