import { useState } from 'react'; import { useNavigate } from 'react-router'; import { useTranslation } from 'react-i18next'; import { useQuery } from '@tanstack/react-query'; import { statsApi, type NodeStatus } from '../api/admin'; import { formatUptime } from '../utils/format'; const CABINET_VERSION = __APP_VERSION__; import { useCurrency } from '../hooks/useCurrency'; import { usePlatform } from '../platform/hooks/usePlatform'; // Icons - styled like main navigation const BackIcon = () => ( ); const ServerIcon = () => ( ); const UsersOnlineIcon = () => ( ); const WalletIcon = () => ( ); const ChartBarIcon = () => ( ); const SparklesIcon = () => ( ); const TagIcon = () => ( ); const RefreshIcon = () => ( ); const PowerIcon = () => ( ); const RestartIcon = () => ( ); const ChevronDownIcon = () => ( ); const UsersIcon = () => ( ); const MegaphoneIcon = () => ( ); const BanknotesIcon = () => ( ); const ExclamationIcon = () => ( ); interface StatCardProps { title: string; value: string | number; subtitle?: string; icon: React.ReactNode; color: 'accent' | 'success' | 'warning' | 'error' | 'info'; trend?: { value: number; label: string; }; } function StatCard({ title, value, subtitle, icon, color, trend }: StatCardProps) { const colorClasses = { accent: 'bg-accent-500/20 text-accent-400', success: 'bg-success-500/20 text-success-400', warning: 'bg-warning-500/20 text-warning-400', error: 'bg-error-500/20 text-error-400', info: 'bg-info-500/20 text-info-400', }; return (
{t('adminDashboard.subtitle')}
{stats?.nodes.online || 0} {t('adminDashboard.nodes.online').toLowerCase()} /{' '} {stats?.nodes.total || 0} {t('adminDashboard.stats.total').toLowerCase()}
{t('adminDashboard.revenue.last7Days')}
{t('adminDashboard.subscriptions.subtitle')}
{t('adminDashboard.tariffs.subtitle')}
| {t('adminDashboard.tariffs.tariffName')} | {t('adminDashboard.tariffs.activeSubscriptions')} | {t('adminDashboard.tariffs.trialSubscriptions')} | {t('adminDashboard.tariffs.purchasedToday')} | {t('adminDashboard.tariffs.purchasedWeek')} | {t('adminDashboard.tariffs.purchasedMonth')} |
|---|---|---|---|---|---|
| {tariff.tariff_name} | {tariff.active_subscriptions} | {tariff.trial_subscriptions} | {tariff.purchased_today} | {tariff.purchased_week} | {tariff.purchased_month} |
{referrers.total_referrers}{' '} {t('adminDashboard.topReferrers.stats', { count: referrers.total_referrals })}
{campaigns.total_campaigns}{' '} {t('adminDashboard.topCampaigns.stats', { count: campaigns.total_registrations })}
{t('adminDashboard.recentPayments.today', { amount: `${formatAmount(payments.total_today_kopeks / 100)} ${currencySymbol}`, })} {' '} ·{' '} {t('adminDashboard.recentPayments.week', { amount: `${formatAmount(payments.total_week_kopeks / 100)} ${currencySymbol}`, })}
| {t('adminDashboard.table.user')} | {t('adminDashboard.table.type')} | {t('adminDashboard.table.amount')} | {t('adminDashboard.table.method')} | {t('adminDashboard.table.date')} |
|---|---|---|---|---|
| {payment.type_display} | {formatAmount(payment.amount_rubles)} {currencySymbol} | {payment.payment_method || '-'} | {new Date(payment.created_at).toLocaleString('ru-RU', { day: '2-digit', month: '2-digit', hour: '2-digit', minute: '2-digit', })} |