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'; // Icons const EditIcon = () => ( ); const ClockIcon = () => ( ); const UserIcon = () => ( ); // 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')} )} navigate(`/admin/promocodes/${id}/edit`)} 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" > {t('admin.promocodes.modal.edit')} {/* 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)} ))} )} ); }
{t('admin.promocodes.stats.notFound')}
{t('admin.promocodes.stats.noUsages')}