import React, { useState, useEffect } from 'react'; import { X } from 'lucide-react'; import { DevMarketingActivity } from '../../types'; import { Building } from '../../types'; import { backendApi } from '../../services/apiClient'; interface Props { isOpen: boolean; onClose: () => void; onSuccess: () => void; activity?: DevMarketingActivity | null; } export const MarketingActivityModal: React.FC = ({ isOpen, onClose, onSuccess, activity }) => { const [formData, setFormData] = useState({ buildingId: '', address: '', activistsCount: 0, meetingsHeld: 0, adsDistributed: 0, competitor: '', status: 'voting' as 'voting' | 'my_house' | 'competitor_house', notes: '', source: 'existing' as 'existing' | 'pipeline', }); const [buildings, setBuildings] = useState([]); const [pipelineAddresses, setPipelineAddresses] = useState<{id: string, address: string}[]>([]); const [loading, setLoading] = useState(false); const [loadingBuildings, setLoadingBuildings] = useState(true); const isEditMode = !!activity; useEffect(() => { if (isOpen) { if (activity) { // Режим редактирования setFormData({ buildingId: activity.buildingId || '', address: activity.address, activistsCount: activity.activistsCount, meetingsHeld: activity.meetingsHeld, adsDistributed: activity.adsDistributed, competitor: activity.competitor || '', status: activity.status, notes: '', source: activity.buildingId ? 'existing' : 'pipeline', }); } fetchData(); } }, [isOpen, activity]); const fetchData = async () => { try { setLoadingBuildings(true); const buildingsData = await backendApi.getBuildings(); setBuildings(buildingsData); try { const pipelineData = await backendApi.getDevelopmentPipeline(); setPipelineAddresses(pipelineData.map(p => ({ id: p.id, address: p.address }))); } catch (err) { console.warn('Failed to load pipeline addresses:', err); } } catch (error) { console.error('Error fetching data:', error); } finally { setLoadingBuildings(false); } }; if (!isOpen) return null; const handleSourceChange = (source: 'existing' | 'pipeline') => { setFormData({ ...formData, source, buildingId: '', address: '' }); }; const handleBuildingChange = (value: string) => { if (formData.source === 'existing') { const building = buildings.find(b => b.id === value); setFormData({ ...formData, buildingId: value, address: building?.passport?.address || '' }); } else { const pipelineItem = pipelineAddresses.find(p => p.id === value); setFormData({ ...formData, buildingId: value, address: pipelineItem?.address || '' }); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!formData.address || !formData.status) { alert('Заполните обязательные поля: адрес и статус'); return; } try { setLoading(true); if (isEditMode && activity) { // Обновление существующей активности await backendApi.updateDevelopmentMarketing(activity.id, { address: formData.address, activists_count: formData.activistsCount, meetings_held: formData.meetingsHeld, ads_distributed: formData.adsDistributed, competitor: formData.competitor || null, status: formData.status, notes: formData.notes || null, }); } else { // Создание новой активности const payload = { address: formData.address, building_id: formData.source === 'existing' ? formData.buildingId : null, activists_count: formData.activistsCount, meetings_held: formData.meetingsHeld, ads_distributed: formData.adsDistributed, competitor: formData.competitor || null, status: formData.status, notes: formData.notes || null, }; await backendApi.createDevelopmentMarketing(payload); } onSuccess(); onClose(); // Сброс формы только если не режим редактирования if (!isEditMode) { setFormData({ buildingId: '', address: '', activistsCount: 0, meetingsHeld: 0, adsDistributed: 0, competitor: '', status: 'voting', notes: '', source: 'existing', }); } } catch (error: any) { console.error('Error saving marketing activity:', error); const errorMessage = error?.message || error?.error || 'Ошибка при сохранении'; alert(errorMessage); } finally { setLoading(false); } }; return (
e.stopPropagation()} >

{isEditMode ? 'Редактировать активность' : 'Создать маркетинговую активность'}

{!isEditMode && ( <> {/* Выбор источника */}
{/* Выбор дома/адреса */}
{loadingBuildings ? (
Загрузка...
) : ( <> {formData.source === 'existing' ? ( ) : ( )} )}
)} {/* Адрес */}
setFormData({ ...formData, address: e.target.value })} className="w-full p-2.5 rounded-xl border border-slate-200 text-sm focus:ring-2 focus:ring-primary-500 outline-none" />
{/* Статус */}
{/* Конкурент */}
setFormData({ ...formData, competitor: e.target.value })} placeholder="УК ЖилКом, ТСЖ Рассвет и т.д." className="w-full p-2.5 rounded-xl border border-slate-200 text-sm focus:ring-2 focus:ring-primary-500 outline-none" />
{/* Метрики */}
setFormData({ ...formData, activistsCount: parseInt(e.target.value) || 0 })} className="w-full p-2.5 rounded-xl border border-slate-200 text-sm focus:ring-2 focus:ring-primary-500 outline-none" />
setFormData({ ...formData, meetingsHeld: parseInt(e.target.value) || 0 })} className="w-full p-2.5 rounded-xl border border-slate-200 text-sm focus:ring-2 focus:ring-primary-500 outline-none" />
setFormData({ ...formData, adsDistributed: parseInt(e.target.value) || 0 })} className="w-full p-2.5 rounded-xl border border-slate-200 text-sm focus:ring-2 focus:ring-primary-500 outline-none" />
{/* Примечания */}