import { useState } from 'react'; import { useNavigate } from 'react-router'; import { useQuery } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { adminBroadcastsApi } from '../api/adminBroadcasts'; import { usePlatform } from '../platform/hooks/usePlatform'; // Icons const BackIcon = () => ( ); const BroadcastIcon = () => ( ); const PlusIcon = () => ( ); const RefreshIcon = () => ( ); const PhotoIcon = () => ( ); const VideoIcon = () => ( ); const DocumentIcon = () => ( ); // 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)} ); } // Main component export default function AdminBroadcasts() { const { t } = useTranslation(); const navigate = useNavigate(); const { capabilities } = usePlatform(); const [page, setPage] = useState(0); const limit = 20; // Fetch broadcasts const { data, isLoading, refetch } = useQuery({ queryKey: ['admin', 'broadcasts', 'list', page], queryFn: () => adminBroadcastsApi.list(limit, page * limit), refetchInterval: 5000, // Auto refresh every 5s }); const broadcasts = data?.items || []; const total = data?.total || 0; const totalPages = Math.ceil(total / limit); return (
{/* Header */}
{/* Show back button only on web, not in Telegram Mini App */} {!capabilities.hasBackButton && ( )}

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

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

{/* Broadcasts list */} {isLoading ? (

{t('common.loading')}

) : broadcasts.length === 0 ? (

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

) : (
{broadcasts.map((broadcast) => ( ))}
)} {/* Pagination */} {totalPages > 1 && (
{page + 1} / {totalPages}
)}
); }