import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { Box, Typography, Card, CardContent, TextField, Button, Alert, CircularProgress, Stack, IconButton, Divider, ToggleButton, ToggleButtonGroup, Collapse, Chip, } from '@mui/material'; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; import DeleteOutlineIcon from '@mui/icons-material/DeleteOutline'; import AddPhotoAlternateOutlinedIcon from '@mui/icons-material/AddPhotoAlternateOutlined'; import NotificationsActiveIcon from '@mui/icons-material/NotificationsActive'; import NotificationsOffOutlinedIcon from '@mui/icons-material/NotificationsOffOutlined'; import StarIcon from '@mui/icons-material/Star'; import axiosInstance from '../../api/axiosInstance.js'; const EMPTY_FORM = { title: '', description: '', category: '', pushNotification: false, pushMessage: '', }; export default function CreateNewsPage() { const navigate = useNavigate(); const [form, setForm] = useState(EMPTY_FORM); const [files, setFiles] = useState([]); const [previews, setPreviews] = useState([]); const [saving, setSaving] = useState(false); const [error, setError] = useState(''); const handleChange = (e) => { const { name, value } = e.target; setForm((prev) => ({ ...prev, [name]: value })); }; const handleFileChange = (e) => { const selected = Array.from(e.target.files); setFiles((prev) => [...prev, ...selected]); const newPreviews = selected.map((f) => URL.createObjectURL(f)); setPreviews((prev) => [...prev, ...newPreviews]); e.target.value = ''; }; const handleRemoveFile = (index) => { URL.revokeObjectURL(previews[index]); setFiles((prev) => prev.filter((_, i) => i !== index)); setPreviews((prev) => prev.filter((_, i) => i !== index)); }; const handleSubmit = async (e) => { e.preventDefault(); setSaving(true); setError(''); try { const formData = new FormData(); const jsonPayload = { title: form.title, description: form.description, category: form.category, pushNotification: form.pushNotification, ...(form.pushNotification && form.pushMessage ? { pushMessage: form.pushMessage } : {}), }; formData.append('data', new Blob([JSON.stringify(jsonPayload)], { type: 'application/json' })); files.forEach((file) => formData.append('images', file)); await axiosInstance.post('/news', formData, { headers: { 'Content-Type': 'multipart/form-data' }, }); navigate('/posts'); } catch (err) { setError(err.response?.data?.error ?? 'Erstellen fehlgeschlagen'); } finally { setSaving(false); } }; const isValid = form.title && form.description && form.category; return ( navigate('/posts')} size="small"> News erstellen {error && ( {typeof error === 'string' ? error : JSON.stringify(error)} )} {/* Bild-Upload */} Bilder {files.length > 0 && ( Das erste Bild wird als Vorschaubild verwendet )} {previews.map((src, i) => ( {i === 0 && ( } label="Vorschaubild" size="small" color="primary" sx={{ height: 20, fontSize: 11 }} /> )} {files[i]?.name} handleRemoveFile(i)}> ))} {/* Push Notification */} Push Notification Wird gebündelt nach ~30 min gesendet. Kein Versand bei Ruhezeiten (22–8 Uhr), wenn in den letzten 90 min bereits gesendet wurde oder das Tageslimit (3) erreicht ist. { if (val === null) return; setForm((prev) => ({ ...prev, pushNotification: val })); }} size="small" > Aus An ); }