import React, { useState, useEffect } from 'react'; import { WorkPhoto } from '../../types'; import { apiClient } from '../../services/apiClient'; import { Plus, X, Image as ImageIcon, Loader2, Calendar, Building2, FileText } from 'lucide-react'; interface WorkPhotosManagerProps { buildingId?: string; residentReportId?: number; onPhotoSelect?: (photo: WorkPhoto) => void; } export const WorkPhotosManager: React.FC = ({ buildingId, residentReportId, onPhotoSelect }) => { const [photos, setPhotos] = useState([]); const [isLoading, setIsLoading] = useState(true); const [showCreateForm, setShowCreateForm] = useState(false); useEffect(() => { loadPhotos(); }, [buildingId, residentReportId]); const loadPhotos = async () => { try { setIsLoading(true); const params = new URLSearchParams(); if (buildingId) params.append('building_id', buildingId); if (residentReportId) params.append('resident_report_id', String(residentReportId)); const queryString = params.toString(); const path = `/pr/work-photos${queryString ? `?${queryString}` : ''}`; const data = await apiClient.get(path); setPhotos(data); } catch (err) { console.error('Error loading work photos:', err); setPhotos([]); } finally { setIsLoading(false); } }; const handleDelete = async (id: number) => { if (!confirm('Удалить фото отчет?')) return; try { await apiClient.delete(`/pr/work-photos/${id}`); await loadPhotos(); } catch (err) { console.error('Error deleting work photo:', err); alert('Ошибка удаления фото отчета'); } }; return (

Фото отчеты работ

{showCreateForm && ( setShowCreateForm(false)} onSuccess={() => { setShowCreateForm(false); loadPhotos(); }} /> )} {isLoading ? (
) : photos.length === 0 ? (

Фото отчеты не найдены

) : (
{photos.map(photo => ( ))}
)}
); }; interface WorkPhotoCardProps { photo: WorkPhoto; onDelete: (id: number) => void; onSelect?: (photo: WorkPhoto) => void; } const WorkPhotoCard: React.FC = ({ photo, onDelete, onSelect }) => { const API_BASE_URL = import.meta.env.VITE_API_BASE_URL || 'http://localhost:4000/api'; return (
{photo.workName}
{new Date(photo.workDate).toLocaleDateString('ru-RU')}
{photo.description && (

{photo.description}

)}
{photo.photoBeforeUrl ? (
До
До
) : (
)} {photo.photoAfterUrl ? (
После
После
) : (
)}
); }; interface WorkPhotoCreateFormProps { buildingId?: string; residentReportId?: number; onClose: () => void; onSuccess: () => void; } const WorkPhotoCreateForm: React.FC = ({ buildingId, residentReportId, onClose, onSuccess }) => { const [formData, setFormData] = useState({ building_id: buildingId || '', resident_report_id: residentReportId || '', work_name: '', work_date: new Date().toISOString().split('T')[0], description: '' }); const [photoBefore, setPhotoBefore] = useState(null); const [photoAfter, setPhotoAfter] = useState(null); const [isSubmitting, setIsSubmitting] = useState(false); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!formData.building_id || !formData.work_name || !formData.work_date) { alert('Заполните обязательные поля'); return; } try { setIsSubmitting(true); const formDataToSend = new FormData(); formDataToSend.append('building_id', formData.building_id); if (formData.resident_report_id) { formDataToSend.append('resident_report_id', String(formData.resident_report_id)); } formDataToSend.append('work_name', formData.work_name); formDataToSend.append('work_date', formData.work_date); if (formData.description) { formDataToSend.append('description', formData.description); } if (photoBefore) { formDataToSend.append('photo_before', photoBefore); } if (photoAfter) { formDataToSend.append('photo_after', photoAfter); } const API_BASE_URL = import.meta.env.VITE_API_BASE_URL || 'http://localhost:4000/api'; const response = await fetch(`${API_BASE_URL}/pr/work-photos`, { method: 'POST', body: formDataToSend }); if (!response.ok) { throw new Error('Ошибка создания фото отчета'); } onSuccess(); } catch (err) { console.error('Error creating work photo:', err); alert('Ошибка создания фото отчета'); } finally { setIsSubmitting(false); } }; return (

Добавить фото отчет

{!buildingId && (
setFormData({ ...formData, building_id: e.target.value })} className="w-full p-3 border border-slate-200 rounded-xl text-sm" required />
)}
setFormData({ ...formData, work_name: e.target.value })} className="w-full p-3 border border-slate-200 rounded-xl text-sm" placeholder="Например: Ремонт подъезда" required />
setFormData({ ...formData, work_date: e.target.value })} className="w-full p-3 border border-slate-200 rounded-xl text-sm" required />