import { useState } from 'react'; import { Box, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Paper, Button, Dialog, DialogTitle, DialogContent, DialogActions, TextField, IconButton, Typography, CircularProgress, Select, MenuItem, FormControl, InputLabel, Chip, } from '@mui/material'; import DeleteIcon from '@mui/icons-material/Delete'; import AddIcon from '@mui/icons-material/Add'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { bannerApi } from '../../services/banners'; import { useNotification } from '../../contexts/NotificationContext'; import type { BannerLevel, BannerShowAs } from '../../types/banner.types'; const LEVEL_LABEL: Record = { info: 'Info', important: 'Wichtig', critical: 'Kritisch', }; const LEVEL_COLOR: Record = { info: 'info', important: 'warning', critical: 'error', }; function formatDateTime(iso: string | null | undefined): string { if (!iso) return 'Kein Ablauf'; return new Date(iso).toLocaleString('de-DE', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit', }); } const SHOW_AS_LABEL: Record = { banner: 'Banner', widget: 'Widget', }; function BannerManagementTab() { const queryClient = useQueryClient(); const { showSuccess, showError } = useNotification(); const [dialogOpen, setDialogOpen] = useState(false); const [newMessage, setNewMessage] = useState(''); const [newLevel, setNewLevel] = useState('info'); const [newEndsAt, setNewEndsAt] = useState(''); const [newShowAs, setNewShowAs] = useState('banner'); const { data: banners, isLoading } = useQuery({ queryKey: ['admin', 'banners'], queryFn: bannerApi.getAll, placeholderData: (previousData: any) => previousData, }); const createMutation = useMutation({ mutationFn: () => bannerApi.create({ message: newMessage.trim(), level: newLevel, show_as: newShowAs, starts_at: new Date().toISOString(), ends_at: newEndsAt ? new Date(newEndsAt).toISOString() : null, }), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin', 'banners'] }); queryClient.invalidateQueries({ queryKey: ['banners', 'active'] }); showSuccess('Banner wurde erstellt'); setDialogOpen(false); setNewMessage(''); setNewLevel('info'); setNewEndsAt(''); setNewShowAs('banner'); }, onError: (error: any) => { const message = error?.response?.data?.message || 'Banner konnte nicht erstellt werden'; showError(message); }, }); const deleteMutation = useMutation({ mutationFn: (id: string) => bannerApi.delete(id), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin', 'banners'] }); queryClient.invalidateQueries({ queryKey: ['banners', 'active'] }); showSuccess('Banner wurde gelöscht'); }, onError: () => { showError('Banner konnte nicht gelöscht werden'); }, }); const handleCreate = () => { if (newMessage.trim()) { createMutation.mutate(); } }; const handleClose = () => { setDialogOpen(false); setNewMessage(''); setNewLevel('info'); setNewEndsAt(''); setNewShowAs('banner'); }; if (isLoading) { return ; } return ( Ankündigungsbanner Stufe Anzeige Nachricht Erstellt am Ablauf Aktionen {(banners ?? []).map((banner) => ( {banner.message} {formatDateTime(banner.created_at)} {formatDateTime(banner.ends_at)} deleteMutation.mutate(banner.id)} disabled={deleteMutation.isPending} > ))} {(banners ?? []).length === 0 && ( Keine Banner vorhanden )}
Banner erstellen setNewMessage(e.target.value)} inputProps={{ maxLength: 2000 }} helperText={`${newMessage.length}/2000`} /> Stufe Anzeige als setNewEndsAt(e.target.value)} InputLabelProps={{ shrink: true }} helperText="Leer lassen für kein Ablaufdatum" />
); } export default BannerManagementTab;