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 { AdminBackButton } from '../components/admin';
import { useDestructiveConfirm, useNotify } from '@/platform';
// Icons
const PlusIcon = () => (
);
const EditIcon = () => (
);
const TrashIcon = () => (
);
const CheckIcon = () => (
);
const XIcon = () => (
);
const GiftIcon = () => (
);
export default function AdminTariffs() {
const { t } = useTranslation();
const navigate = useNavigate();
const queryClient = useQueryClient();
const confirmDelete = useDestructiveConfirm();
const notify = useNotify();
// 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 */}
{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 */}
))}
)}
);
}