import { useState, useEffect, useContext } from 'react' import { Trash2, DollarSign, Eye, MousePointer, Target, FileEdit, BarChart3, MessageSquare } from 'lucide-react' import { useLanguage } from '../i18n/LanguageContext' import { PLATFORMS, getBrandColor } from '../utils/api' import CommentsSection from './CommentsSection' import Modal from './Modal' import TabbedModal from './TabbedModal' import BudgetBar from './BudgetBar' import PortalSelect from './PortalSelect' import { AppContext } from '../App' export default function CampaignDetailPanel({ campaign, onClose, onSave, onDelete, brands, permissions }) { const { t, lang, currencySymbol } = useLanguage() const { teams } = useContext(AppContext) const [form, setForm] = useState({}) const [dirty, setDirty] = useState(false) const [saving, setSaving] = useState(false) const [showDeleteConfirm, setShowDeleteConfirm] = useState(false) const [activeTab, setActiveTab] = useState('details') const campaignId = campaign?._id || campaign?.id const isCreateMode = !campaignId useEffect(() => { if (campaign) { setForm({ name: campaign.name || '', description: campaign.description || '', brand_id: campaign.brandId || campaign.brand_id || '', team_id: campaign.team_id || '', status: campaign.status || 'planning', start_date: campaign.startDate ? new Date(campaign.startDate).toISOString().slice(0, 10) : (campaign.start_date || ''), end_date: campaign.endDate ? new Date(campaign.endDate).toISOString().slice(0, 10) : (campaign.end_date || ''), budget: campaign.budget || '', goals: campaign.goals || '', platforms: campaign.platforms || [], budget_spent: campaign.budgetSpent || campaign.budget_spent || '', revenue: campaign.revenue || '', impressions: campaign.impressions || '', clicks: campaign.clicks || '', conversions: campaign.conversions || '', notes: campaign.notes || '', }) setDirty(isCreateMode) } }, [campaign]) if (!campaign) return null const statusOptions = [ { value: 'planning', label: 'Planning' }, { value: 'active', label: 'Active' }, { value: 'paused', label: 'Paused' }, { value: 'completed', label: 'Completed' }, { value: 'cancelled', label: 'Cancelled' }, ] const update = (field, value) => { setForm(f => ({ ...f, [field]: value })) setDirty(true) } const handleSave = async () => { setSaving(true) try { const data = { name: form.name, description: form.description, brand_id: form.brand_id ? Number(form.brand_id) : null, team_id: form.team_id ? Number(form.team_id) : null, status: form.status, start_date: form.start_date, end_date: form.end_date, budget: form.budget ? Number(form.budget) : null, goals: form.goals, platforms: form.platforms || [], budget_spent: form.budget_spent ? Number(form.budget_spent) : 0, revenue: form.revenue ? Number(form.revenue) : 0, impressions: form.impressions ? Number(form.impressions) : 0, clicks: form.clicks ? Number(form.clicks) : 0, conversions: form.conversions ? Number(form.conversions) : 0, notes: form.notes || '', } await onSave(isCreateMode ? null : campaignId, data) setDirty(false) if (isCreateMode) onClose() } finally { setSaving(false) } } const confirmDelete = async () => { setShowDeleteConfirm(false) await onDelete(campaignId) onClose() } const brandName = (() => { if (form.brand_id) { const b = brands?.find(b => String(b._id || b.id) === String(form.brand_id)) return b ? (lang === 'ar' && b.name_ar ? b.name_ar : b.name) : null } return campaign.brand_name || campaign.brandName || null })() const tabs = isCreateMode ? [{ key: 'details', label: t('campaigns.details'), icon: FileEdit }] : [ { key: 'details', label: t('campaigns.details'), icon: FileEdit }, { key: 'performance', label: t('campaigns.performance'), icon: BarChart3 }, { key: 'discussion', label: t('campaigns.discussion'), icon: MessageSquare }, ] return ( <> update('name', e.target.value)} className="w-full text-lg font-semibold text-text-primary bg-transparent border-0 p-0 focus:outline-none focus:ring-0" placeholder={t('campaigns.name')} />
{statusOptions.find(s => s.value === form.status)?.label} {brandName && ( {brandName} )}
} tabs={tabs} activeTab={activeTab} onTabChange={setActiveTab} footer={ <>
{onDelete && !isCreateMode && ( )}
{dirty && ( )}
} > {/* Details Tab */} {activeTab === 'details' && (