import { useNavigate } from 'react-router-dom'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { serversApi, ServerListItem } from '../api/servers'; import { SyncIcon, EditIcon, CheckIcon, XIcon, UsersIcon, GiftIcon } from '../components/icons'; import { useBackButton } from '../platform/hooks/useBackButton'; import { usePlatform } from '../platform/hooks/usePlatform'; // BackIcon const BackIcon = () => ( ); // Country flags (simple emoji mapping) const getCountryFlag = (code: string | null): string => { if (!code) return ''; const codeMap: Record = { RU: '🇷🇺', US: '🇺🇸', DE: '🇩🇪', NL: '🇳🇱', GB: '🇬🇧', FR: '🇫🇷', FI: '🇫🇮', SE: '🇸🇪', PL: '🇵🇱', CZ: '🇨🇿', AT: '🇦🇹', CH: '🇨ðŸ‡', UA: '🇺🇦', KZ: '🇰🇿', JP: '🇯🇵', KR: '🇰🇷', SG: '🇸🇬', HK: 'ðŸ‡ðŸ‡°', CA: '🇨🇦', AU: '🇦🇺', BR: '🇧🇷', IN: '🇮🇳', TR: '🇹🇷', IL: '🇮🇱', AE: '🇦🇪', }; return codeMap[code.toUpperCase()] || code; }; export default function AdminServers() { const { t } = useTranslation(); const navigate = useNavigate(); const queryClient = useQueryClient(); const { capabilities } = usePlatform(); // Use native Telegram back button in Mini App useBackButton(() => navigate('/admin')); // Queries const { data: serversData, isLoading } = useQuery({ queryKey: ['admin-servers'], queryFn: () => serversApi.getServers(true), }); // Mutations const toggleMutation = useMutation({ mutationFn: serversApi.toggleServer, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin-servers'] }); }, }); const toggleTrialMutation = useMutation({ mutationFn: serversApi.toggleTrial, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin-servers'] }); }, }); const syncMutation = useMutation({ mutationFn: serversApi.syncServers, onSuccess: (result) => { queryClient.invalidateQueries({ queryKey: ['admin-servers'] }); alert(result.message); }, }); const servers = serversData?.servers || []; return ( {/* Header */} {/* Show back button only on web, not in Telegram Mini App */} {!capabilities.hasBackButton && ( navigate('/admin')} className="flex h-10 w-10 items-center justify-center rounded-xl border border-dark-700 bg-dark-800 transition-colors hover:border-dark-600" > )} {t('admin.servers.title')} {t('admin.servers.subtitle')} syncMutation.mutate()} disabled={syncMutation.isPending} className="flex items-center justify-center gap-2 rounded-lg bg-accent-500 px-4 py-2 text-white transition-colors hover:bg-accent-600 disabled:opacity-50" > {syncMutation.isPending ? t('admin.servers.syncing') : t('admin.servers.sync')} {/* Servers List */} {isLoading ? ( ) : servers.length === 0 ? ( {t('admin.servers.noServers')} syncMutation.mutate()} className="mt-4 text-accent-400 hover:text-accent-300" > {t('admin.servers.syncNow')} ) : ( {servers.map((server: ServerListItem) => ( {getCountryFlag(server.country_code)} {server.display_name} {server.is_trial_eligible && ( {t('admin.servers.trial')} )} {!server.is_available && ( {t('admin.servers.unavailable')} )} {server.is_full && ( {t('admin.servers.full')} )} {server.current_users} {server.max_users ? ` / ${server.max_users}` : ''} {server.price_rubles} ₽ {server.squad_uuid} {/* Toggle Available */} toggleMutation.mutate(server.id)} className={`rounded-lg p-2 transition-colors ${ server.is_available ? 'bg-success-500/20 text-success-400 hover:bg-success-500/30' : 'bg-dark-700 text-dark-400 hover:bg-dark-600' }`} title={ server.is_available ? t('admin.servers.disable') : t('admin.servers.enable') } > {server.is_available ? : } {/* Toggle Trial */} toggleTrialMutation.mutate(server.id)} className={`rounded-lg p-2 transition-colors ${ server.is_trial_eligible ? 'bg-accent-500/20 text-accent-400 hover:bg-accent-500/30' : 'bg-dark-700 text-dark-400 hover:bg-dark-600' }`} title={t('admin.servers.toggleTrial')} > {/* Edit */} navigate(`/admin/servers/${server.id}/edit`)} className="rounded-lg bg-dark-700 p-2 text-dark-300 transition-colors hover:bg-dark-600 hover:text-dark-100" title={t('admin.servers.edit')} > ))} )} ); }
{t('admin.servers.subtitle')}
{t('admin.servers.noServers')}