import {useNavigate} from "react-router-dom"; import {useState} from "react"; import { Alert, Box, Button, Card, CardContent, Checkbox, Chip, CircularProgress, Divider, FormControlLabel, IconButton, Stack, TextField, Typography } from "@mui/material"; import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import StarIcon from "@mui/icons-material/Star"; import DeleteOutlineIcon from "@mui/icons-material/DeleteOutline"; import AddPhotoAlternateOutlinedIcon from "@mui/icons-material/AddPhotoAlternateOutlined"; import { useParams } from "react-router-dom"; import { useEffect } from "react"; import axiosInstance from "../../api/axiosInstance.js"; const EMPTY_FORM = { description: '', phone: '', email: '', address: '', website: '', contactPerson: '', active: false, } export default function EditCompanyPage() { const navigate = useNavigate(); const [form, setForm] = useState(EMPTY_FORM); const [name, setName] = useState(''); const [saving, setSaving] = useState(false); const [error, setError] = useState(''); const { id } = useParams(); // Titelbild const [titleImageUrl, setTitleImageUrl] = useState(null); const [titleImageFile, setTitleImageFile] = useState(null); const [titleImagePreview, setTitleImagePreview] = useState(null); // Weitere Bilder const [otherImageUrls, setOtherImageUrls] = useState([]); const [otherFiles, setOtherFiles] = useState([]); const [otherPreviews, setOtherPreviews] = useState([]); useEffect(() => { const fetchData = async () => { try { const response = await axiosInstance.get('/company/' + id); const data = response.data; setName(data.name || ''); setForm({ description: data.description || '', phone: data.number || '', email: data.email || '', address: data.address || '', website: data.website || '', contactPerson: data.contactPerson || '', active: data.active || false, }); const imgs = data.pictures || []; setTitleImageUrl(imgs[0] || null); setOtherImageUrls(imgs.slice(1)); } catch (err) { // ✅ err.response.data kann ein Objekt sein → .error extrahieren const serverMessage = err.response?.data?.error || err.response?.data; setError(typeof serverMessage === 'string' ? serverMessage : 'Fehler beim Laden'); } }; fetchData(); }, [id]); const handleChange = (e) => { const { name, value, type, checked } = e.target; setForm((prev) => ({ ...prev, [name]: type === 'checkbox' ? checked : value })); }; // Titelbild-Handler const handleTitleImageChange = (e) => { const f = e.target.files[0]; if (!f) return; if (titleImagePreview) URL.revokeObjectURL(titleImagePreview); setTitleImageFile(f); setTitleImagePreview(URL.createObjectURL(f)); e.target.value = ''; }; const handleRemoveTitleImage = () => { if (titleImagePreview) URL.revokeObjectURL(titleImagePreview); setTitleImageUrl(null); setTitleImageFile(null); setTitleImagePreview(null); }; // Weitere Bilder-Handler const handleOtherFilesChange = (e) => { const selected = Array.from(e.target.files); setOtherFiles((prev) => [...prev, ...selected]); const newPreviews = selected.map((f) => URL.createObjectURL(f)); setOtherPreviews((prev) => [...prev, ...newPreviews]); e.target.value = ''; }; const handleRemoveOtherFile = (index) => { URL.revokeObjectURL(otherPreviews[index]); setOtherFiles((prev) => prev.filter((_, i) => i !== index)); setOtherPreviews((prev) => prev.filter((_, i) => i !== index)); }; const handleRemoveOtherUrl = (index) => { setOtherImageUrls((prev) => prev.filter((_, i) => i !== index)); }; const handleSubmit = async (e) => { e.preventDefault(); setSaving(true); setError(''); try { const formData = new FormData(); formData.append( 'data', new Blob([JSON.stringify({ ...form, existingTitleImage: titleImageUrl || null, existingOtherImages: otherImageUrls, })], { type: 'application/json' }) ); if (titleImageFile) formData.append('images', titleImageFile); otherFiles.forEach((f) => formData.append('images', f)); await axiosInstance.put(`/company/${id}`, formData, { headers: { 'Content-Type': undefined } }); navigate('/companies'); } catch (err) { // ✅ Fehlermeldung korrekt aus Axios-Response extrahieren const serverMessage = err.response?.data?.error || err.response?.data; const message = typeof serverMessage === 'string' ? serverMessage : err.message || 'Fehler beim Speichern'; setError(message); setSaving(false); } }; const hasTitleImage = titleImageUrl || titleImageFile; return ( navigate('/companies')} size="small"> Unternehmen bearbeiten {error && ( {typeof error === 'string' ? error : JSON.stringify(error)} )} Website muss mit "https://" anfangen setForm((prev) => ({ ...prev, active: e.target.checked })) } /> } label="Aktiv" /> {/* ── Titelbild ── */} } label="Titelbild" size="small" color="primary" sx={{ height: 22, fontSize: 11 }} /> Wird als Vorschaubild des Unternehmens verwendet {hasTitleImage ? ( {titleImageFile ? titleImageFile.name : titleImageUrl} ) : ( )} {/* ── Weitere Bilder ── */} Weitere Bilder {otherImageUrls.map((src, i) => ( {src} handleRemoveOtherUrl(i)}> ))} {otherPreviews.map((src, i) => ( {otherFiles[i]?.name} handleRemoveOtherFile(i)}> ))} ); }