import { useParams, useNavigate } from 'react-router'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { adminBroadcastsApi, type BroadcastChannel } from '../api/adminBroadcasts'; import { AdminBackButton } from '../components/admin'; // Icons const StopIcon = () => ( ); const PhotoIcon = () => ( ); const VideoIcon = () => ( ); const DocumentIcon = () => ( ); const RefreshIcon = () => ( ); const TelegramIcon = () => ( ); const EmailIcon = () => ( ); // Channel badge component function ChannelBadge({ channel }: { channel?: BroadcastChannel }) { if (!channel || channel === 'telegram') { return ( Telegram ); } if (channel === 'email') { return ( Email ); } return ( + ); } // Status badge component const statusConfig: Record = { queued: { bg: 'bg-warning-500/20', text: 'text-warning-400', labelKey: 'admin.broadcasts.status.queued', }, in_progress: { bg: 'bg-accent-500/20', text: 'text-accent-400', labelKey: 'admin.broadcasts.status.inProgress', }, completed: { bg: 'bg-success-500/20', text: 'text-success-400', labelKey: 'admin.broadcasts.status.completed', }, partial: { bg: 'bg-warning-500/20', text: 'text-warning-400', labelKey: 'admin.broadcasts.status.partial', }, failed: { bg: 'bg-error-500/20', text: 'text-error-400', labelKey: 'admin.broadcasts.status.failed', }, cancelled: { bg: 'bg-dark-500/20', text: 'text-dark-400', labelKey: 'admin.broadcasts.status.cancelled', }, cancelling: { bg: 'bg-warning-500/20', text: 'text-warning-400', labelKey: 'admin.broadcasts.status.cancelling', }, }; function StatusBadge({ status }: { status: string }) { const { t } = useTranslation(); const config = statusConfig[status] || statusConfig.queued; return ( {t(config.labelKey)} ); } export default function AdminBroadcastDetail() { const { t } = useTranslation(); const navigate = useNavigate(); const queryClient = useQueryClient(); const { id } = useParams<{ id: string }>(); const broadcastId = id ? parseInt(id, 10) : null; // Fetch broadcast details const { data: broadcast, isLoading, refetch, } = useQuery({ queryKey: ['admin', 'broadcasts', 'detail', broadcastId], queryFn: async () => { if (!broadcastId) throw new Error('Invalid broadcast ID'); return adminBroadcastsApi.get(broadcastId); }, enabled: !!broadcastId && !isNaN(broadcastId), refetchInterval: (query) => { const data = query.state.data; if (data && ['queued', 'in_progress', 'cancelling'].includes(data.status)) { return 3000; } return false; }, }); // Stop mutation const stopMutation = useMutation({ mutationFn: adminBroadcastsApi.stop, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin', 'broadcasts'] }); refetch(); }, }); const isRunning = broadcast && ['queued', 'in_progress', 'cancelling'].includes(broadcast.status); if (!broadcastId || isNaN(broadcastId)) { navigate('/admin/broadcasts'); return null; } if (isLoading) { return (
); } if (!broadcast) { return (

{t('admin.broadcasts.notFound')}

); } return (
{/* Header */}

{t('admin.broadcasts.detail')} #{broadcast.id}

{new Date(broadcast.created_at).toLocaleString()}

{/* Progress */} {isRunning && (
{t('admin.broadcasts.progress')} {broadcast.progress_percent.toFixed(1)}%
)} {/* Stats */}

{broadcast.total_count}

{t('admin.broadcasts.total')}

{broadcast.sent_count}

{t('admin.broadcasts.sent')}

{broadcast.blocked_count}

{t('admin.broadcasts.blocked')}

{broadcast.failed_count}

{t('admin.broadcasts.failed')}

{/* Target */}

{t('admin.broadcasts.filter')}

{broadcast.target_type}

{/* Telegram Message */} {broadcast.message_text && (

{t('admin.broadcasts.message')}

{broadcast.message_text}
)} {/* Email Subject */} {broadcast.email_subject && (

{t('admin.broadcasts.emailSubject')}

{broadcast.email_subject}
)} {/* Email Content */} {broadcast.email_html_content && (

{t('admin.broadcasts.emailContent')}

{broadcast.email_html_content}
)} {/* Media */} {broadcast.has_media && (

{t('admin.broadcasts.media')}

{broadcast.media_type === 'photo' && } {broadcast.media_type === 'video' && } {broadcast.media_type === 'document' && } {broadcast.media_type}
)} {/* Admin info */}
{t('admin.broadcasts.createdBy')}:{' '} {broadcast.admin_name || t('admin.broadcasts.unknownAdmin')} {new Date(broadcast.created_at).toLocaleString()}
{/* Stop button */} {isRunning && broadcast.status !== 'cancelling' && ( )}
); }