import { useNavigate } from 'react-router-dom'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { tariffsApi, TariffListItem } from '../api/tariffs'; import { useDestructiveConfirm, useNotify } from '@/platform'; import { useBackButton } from '../platform/hooks/useBackButton'; import { usePlatform } from '../platform/hooks/usePlatform'; // Icons const PlusIcon = () => ( ); const EditIcon = () => ( ); const TrashIcon = () => ( ); const CheckIcon = () => ( ); const XIcon = () => ( ); const GiftIcon = () => ( ); // BackIcon const BackIcon = () => ( ); export default function AdminTariffs() { const { t } = useTranslation(); const navigate = useNavigate(); const queryClient = useQueryClient(); const confirmDelete = useDestructiveConfirm(); const notify = useNotify(); const { capabilities } = usePlatform(); // Use native Telegram back button in Mini App useBackButton(() => navigate('/admin')); // Queries const { data: tariffsData, isLoading } = useQuery({ queryKey: ['admin-tariffs'], queryFn: () => tariffsApi.getTariffs(true), }); // Mutations const deleteMutation = useMutation({ mutationFn: tariffsApi.deleteTariff, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin-tariffs'] }); notify.success(t('admin.tariffs.deleteSuccess')); }, }); const handleDelete = async (tariff: TariffListItem) => { // If tariff has active subscriptions, show warning but still allow deletion const confirmText = tariff.subscriptions_count > 0 ? t('admin.tariffs.confirmDeleteWithSubscriptions', { count: tariff.subscriptions_count, }) : t('admin.tariffs.confirmDeleteText'); const confirmed = await confirmDelete( confirmText, t('common.delete'), t('admin.tariffs.confirmDelete'), ); if (confirmed) { deleteMutation.mutate(tariff.id); } }; const toggleMutation = useMutation({ mutationFn: tariffsApi.toggleTariff, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin-tariffs'] }); }, }); const toggleTrialMutation = useMutation({ mutationFn: tariffsApi.toggleTrial, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin-tariffs'] }); }, }); const tariffs = tariffsData?.tariffs || []; return (
{/* Header */}
{/* Show back button only on web, not in Telegram Mini App */} {!capabilities.hasBackButton && ( )}

{t('admin.tariffs.title')}

{t('admin.tariffs.subtitle')}

{/* Tariffs List */} {isLoading ? (
) : tariffs.length === 0 ? (

{t('admin.tariffs.noTariffs')}

) : (
{tariffs.map((tariff: TariffListItem) => (

{tariff.name}

{tariff.is_daily ? ( {t('admin.tariffs.dailyType')} ) : ( {t('admin.tariffs.periodType')} )} {tariff.is_trial_available && ( {t('admin.tariffs.trial')} )} {!tariff.is_active && ( {t('admin.tariffs.inactive')} )}
{tariff.is_daily && tariff.daily_price_kopeks > 0 && ( {(tariff.daily_price_kopeks / 100).toFixed(2)}{' '} {t('admin.tariffs.currencyPerDay')} )} {tariff.traffic_limit_gb === 0 ? t('admin.tariffs.unlimited') : `${tariff.traffic_limit_gb} GB`} {t('admin.tariffs.devices', { count: tariff.device_limit })} {t('admin.tariffs.servers', { count: tariff.servers_count })} {t('admin.tariffs.subscriptions', { count: tariff.subscriptions_count })}
{/* Toggle Active */} {/* Toggle Trial */} {/* Edit */} {/* Delete */}
))}
)}
); }