import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { promocodesApi, PromoGroup } from '../api/promocodes'; import { useBackButton } from '../platform/hooks/useBackButton'; import { usePlatform } from '../platform/hooks/usePlatform'; // Icons const BackIcon = () => ( ); const PlusIcon = () => ( ); const EditIcon = () => ( ); const TrashIcon = () => ( ); const UsersIcon = () => ( ); export default function AdminPromoGroups() { const { t } = useTranslation(); const navigate = useNavigate(); const queryClient = useQueryClient(); const { capabilities } = usePlatform(); // Use native Telegram back button in Mini App useBackButton(() => navigate('/admin')); const [deleteConfirm, setDeleteConfirm] = useState(null); // Query const { data: groupsData, isLoading } = useQuery({ queryKey: ['admin-promo-groups'], queryFn: () => promocodesApi.getPromoGroups({ limit: 100 }), }); // Delete mutation const deleteMutation = useMutation({ mutationFn: promocodesApi.deletePromoGroup, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin-promo-groups'] }); setDeleteConfirm(null); }, }); const groups = groupsData?.items || []; 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.promoGroups.title')} {t('admin.promoGroups.subtitle')} navigate('/admin/promo-groups/create')} 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.promoGroups.addGroup')} {/* Stats */} {groups.length > 0 && ( {groups.length} {t('admin.promoGroups.stats.total')} {groups.reduce((sum, g) => sum + g.members_count, 0)} {t('admin.promoGroups.stats.members')} {groups.filter((g) => g.auto_assign_total_spent_kopeks).length} {t('admin.promoGroups.stats.autoAssign')} )} {/* List */} {isLoading ? ( ) : groups.length === 0 ? ( {t('admin.promoGroups.noGroups')} ) : ( {groups.map((group: PromoGroup) => ( {group.name} {group.is_default && ( {t('admin.promoGroups.default')} )} {group.server_discount_percent > 0 && ( {t('admin.promoGroups.servers')}: -{group.server_discount_percent}% )} {group.traffic_discount_percent > 0 && ( {t('admin.promoGroups.traffic')}: -{group.traffic_discount_percent}% )} {group.device_discount_percent > 0 && ( {t('admin.promoGroups.devices')}: -{group.device_discount_percent}% )} {group.period_discounts && Object.keys(group.period_discounts).length > 0 && Object.entries(group.period_discounts).map(([days, percent]) => ( {t('admin.promoGroups.daysShort', { days })}: -{percent}% ))} {group.auto_assign_total_spent_kopeks && group.auto_assign_total_spent_kopeks > 0 && ( {t('admin.promoGroups.autoFrom', { amount: group.auto_assign_total_spent_kopeks / 100, })} )} {t('admin.promoGroups.members', { count: group.members_count })} navigate(`/admin/promo-groups/${group.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.promoGroups.actions.edit')} > setDeleteConfirm(group.id)} className="rounded-lg bg-dark-700 p-2 text-dark-300 transition-colors hover:bg-error-500/20 hover:text-error-400" title={t('admin.promoGroups.actions.delete')} disabled={group.is_default} > ))} )} {/* Delete Confirmation */} {deleteConfirm && ( {t('admin.promoGroups.confirm.title')} {t('admin.promoGroups.confirm.text')} setDeleteConfirm(null)} className="px-4 py-2 text-dark-300 transition-colors hover:text-dark-100" > {t('admin.promoGroups.confirm.cancel')} deleteMutation.mutate(deleteConfirm)} className="rounded-lg bg-error-500 px-4 py-2 text-white transition-colors hover:bg-error-600" > {t('admin.promoGroups.confirm.delete')} )} ); }
{t('admin.promoGroups.subtitle')}
{t('admin.promoGroups.noGroups')}
{t('admin.promoGroups.confirm.text')}