import React, { useEffect, useState, useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; import { getCategories, createCampaign, } from '../service/campaigns/campaigns.service'; import type { ICreateCampaignPayload, ICampaignDiscountCode, } from '../service/campaigns/campaigns.interface'; const PRIORITY_OPTIONS = [ { label: 'Soft - recommend when relevant', value: 'soft' }, { label: 'Balanced - prefer campaign products', value: 'balanced' }, { label: 'Strong - only campaign products', value: 'strong' }, ]; const GOAL_OPTIONS = [ { label: 'Conversion - drive purchases', value: 'conversion' }, { label: 'Awareness - showcase products', value: 'awareness' }, { label: 'Upsell - upgrade existing interest', value: 'upsell' }, { label: 'Clearance - move old stock', value: 'clearance' }, ]; const TONE_OPTIONS = [ { label: 'Professional', value: 'Professional - formal, business-appropriate language', }, { label: 'Friendly', value: 'Friendly - warm, approachable, and conversational', }, { label: 'Casual', value: 'Casual - relaxed, informal, like talking to a friend', }, { label: 'Enthusiastic', value: 'Enthusiastic - energetic, excited, positive vibes', }, { label: 'Helpful', value: 'Helpful - supportive, solution-oriented, empathetic', }, { label: 'Persuasive', value: 'Persuasive - convincing, compelling, sales-focused', }, { label: 'Informative', value: 'Informative - educational, factual, detailed explanations', }, { label: 'Witty', value: 'Witty - clever, humorous, playful with words' }, ]; const CampaignCreate = (): JSX.Element => { const navigate = useNavigate(); const [categories, setCategories] = useState([]); const [loadingCategories, setLoadingCategories] = useState(false); const [formName, setFormName] = useState(''); const [selectedCategories, setSelectedCategories] = useState>( new Set() ); const [formDescription, setFormDescription] = useState(''); const [formPriority, setFormPriority] = useState('balanced'); const [formGoal, setFormGoal] = useState('conversion'); const [formTone, setFormTone] = useState( 'Friendly - warm, approachable, and conversational' ); const [formMinPrice, setFormMinPrice] = useState(''); const [formMaxPrice, setFormMaxPrice] = useState(''); const [discountCodes, setDiscountCodes] = useState( [] ); const [dcCode, setDcCode] = useState(''); const [dcDescription, setDcDescription] = useState(''); const [dcValue, setDcValue] = useState(''); const [dcType, setDcType] = useState<'percentage' | 'fixed'>('percentage'); const [dcMaxUses, setDcMaxUses] = useState(''); const [creating, setCreating] = useState(false); const [error, setError] = useState(null); const [categorySearch, setCategorySearch] = useState(''); const fetchCategories = useCallback(async () => { try { setLoadingCategories(true); const response = await getCategories(); if (!response.errors && response.data) { setCategories(response.data.categories || []); } } catch (err: any) { setError(err?.message || 'Failed to load categories'); } finally { setLoadingCategories(false); } }, []); useEffect(() => { fetchCategories(); }, [fetchCategories]); const toggleCategory = (cat: string) => { setSelectedCategories(prev => { const next = new Set(prev); if (next.has(cat)) { next.delete(cat); } else { next.add(cat); } return next; }); }; const filteredCategories = categorySearch ? categories.filter(c => c.toLowerCase().includes(categorySearch.toLowerCase()) ) : categories; const selectAll = () => { setSelectedCategories(new Set(filteredCategories)); }; const deselectAll = () => { setSelectedCategories(new Set()); }; const handleCreate = async () => { if (!formName.trim() || selectedCategories.size === 0) return; const payload: ICreateCampaignPayload = { name: formName.trim(), target_categories: Array.from(selectedCategories), description: formDescription.trim(), priority: formPriority as 'soft' | 'balanced' | 'strong', goal: formGoal as ICreateCampaignPayload['goal'], tone_of_voice: formTone, min_price: formMinPrice ? parseFloat(formMinPrice) : null, max_price: formMaxPrice ? parseFloat(formMaxPrice) : null, discount_codes: discountCodes.length > 0 ? discountCodes : undefined, }; try { setCreating(true); setError(null); await createCampaign(payload); navigate('/campaigns'); } catch (err: any) { setError(err?.message || 'Failed to create campaign'); } finally { setCreating(false); } }; return (
{/* Header */}

Create Campaign

{error && (

{error}

)} {/* Campaign details */}

Campaign Details

setFormName(e.target.value)} placeholder="e.g. Winter Sale 2026" />