import { useParams, useNavigate } from 'react-router'; import { useQuery } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import i18n from '../i18n'; import { promocodesApi, PromoCodeType } from '../api/promocodes'; import { AdminBackButton } from '../components/admin'; import { EditIcon, ClockIcon, UserIcon } from '@/components/icons'; // Helper functions const getTypeLabel = (type: PromoCodeType): string => { const labels: Record = { balance: i18n.t('admin.promocodes.type.balance'), subscription_days: i18n.t('admin.promocodes.type.subscriptionDays'), trial_subscription: i18n.t('admin.promocodes.type.trialSubscription'), promo_group: i18n.t('admin.promocodes.type.promoGroup'), discount: i18n.t('admin.promocodes.type.discount'), }; return labels[type] || type; }; const getTypeColor = (type: PromoCodeType): string => { const colors: Record = { balance: 'bg-success-500/20 text-success-400', subscription_days: 'bg-accent-500/20 text-accent-400', trial_subscription: 'bg-accent-500/20 text-accent-400', promo_group: 'bg-warning-500/20 text-warning-400', discount: 'bg-pink-500/20 text-pink-400', }; return colors[type] || 'bg-dark-600 text-dark-300'; }; const formatDate = (date: string | null): string => { if (!date) return '-'; const localeMap: Record = { ru: 'ru-RU', en: 'en-US', zh: 'zh-CN', fa: 'fa-IR' }; const locale = localeMap[i18n.language] || 'ru-RU'; return new Date(date).toLocaleDateString(locale, { day: '2-digit', month: '2-digit', year: 'numeric', }); }; const formatDateTime = (date: string | null): string => { if (!date) return '-'; const localeMap: Record = { ru: 'ru-RU', en: 'en-US', zh: 'zh-CN', fa: 'fa-IR' }; const locale = localeMap[i18n.language] || 'ru-RU'; return new Date(date).toLocaleString(locale, { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit', }); }; export default function AdminPromocodeStats() { const { t } = useTranslation(); const navigate = useNavigate(); const { id } = useParams<{ id: string }>(); const { data: promocode, isLoading, error, } = useQuery({ queryKey: ['admin-promocode', id], queryFn: () => promocodesApi.getPromocode(Number(id)), enabled: !!id, }); if (isLoading) { return (
); } if (error || !promocode) { return (

{t('admin.promocodes.stats.title')}

{t('admin.promocodes.stats.notFound')}

); } return (
{/* Header */}
{promocode.code}
{getTypeLabel(promocode.type)} {!promocode.is_active && ( {t('admin.promocodes.stats.inactive')} )}
{/* Stats Cards */}
{promocode.total_uses}
{t('admin.promocodes.stats.totalUses')}
{promocode.today_uses}
{t('admin.promocodes.stats.today')}
{promocode.max_uses === 0 ? '∞' : promocode.uses_left}
{t('admin.promocodes.stats.remaining')}
{/* Details */}

{t('admin.promocodes.stats.details')}

{t('admin.promocodes.stats.type')}: {getTypeLabel(promocode.type)}
{promocode.type === 'balance' && (
{t('admin.promocodes.stats.bonus')}: +{promocode.balance_bonus_rubles} {t('admin.promocodes.form.rub')}
)} {(promocode.type === 'subscription_days' || promocode.type === 'trial_subscription') && (
{t('admin.promocodes.stats.daysLabel')}: +{promocode.subscription_days}
)} {promocode.type === 'discount' && ( <>
{t('admin.promocodes.stats.discountLabel')}: -{promocode.balance_bonus_kopeks}%
{t('admin.promocodes.stats.validFor')}: {t('admin.promocodes.stats.hoursValue', { count: promocode.subscription_days, })}
)}
{t('admin.promocodes.stats.limit')}: {promocode.current_uses}/{promocode.max_uses === 0 ? '∞' : promocode.max_uses}
{t('admin.promocodes.stats.status')}: {promocode.is_valid ? t('admin.promocodes.stats.active') : t('admin.promocodes.stats.inactive')}
{t('admin.promocodes.stats.created')}: {formatDateTime(promocode.created_at)}
{t('admin.promocodes.stats.validUntil')}: {promocode.valid_until ? formatDate(promocode.valid_until) : t('admin.promocodes.stats.unlimited')}
{promocode.first_purchase_only && (
{t('admin.promocodes.stats.restriction')}: {t('admin.promocodes.stats.firstPurchaseOnly')}
)}
{/* Usage History */}

{t('admin.promocodes.stats.usageHistory')}

{promocode.recent_uses.length === 0 ? (

{t('admin.promocodes.stats.noUsages')}

) : (
{promocode.recent_uses.map((use) => (
{use.user_full_name || use.user_username || `User #${use.user_id}`}
{use.user_username && (
@{use.user_username}
)}
{formatDateTime(use.used_at)}
))}
)}
); }