import { useState } from 'react' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import { useTranslation } from 'react-i18next' import { tariffsApi, TariffListItem, TariffDetail, TariffCreateRequest, TariffUpdateRequest, PeriodPrice, ServerInfo, ServerTrafficLimit } from '../api/tariffs' // Icons const TariffIcon = () => ( ) const PlusIcon = () => ( ) const EditIcon = () => ( ) const TrashIcon = () => ( ) const CheckIcon = () => ( ) const XIcon = () => ( ) const InfinityIcon = () => ( ) // Default period options const DEFAULT_PERIODS = [7, 14, 30, 90, 180, 365] interface TariffModalProps { tariff?: TariffDetail | null servers: ServerInfo[] onSave: (data: TariffCreateRequest | TariffUpdateRequest) => void onClose: () => void isLoading?: boolean } function TariffModal({ tariff, servers, onSave, onClose, isLoading }: TariffModalProps) { const { t } = useTranslation() const isEdit = !!tariff const [name, setName] = useState(tariff?.name || '') const [description, setDescription] = useState(tariff?.description || '') const [trafficLimitGb, setTrafficLimitGb] = useState(tariff?.traffic_limit_gb || 0) const [deviceLimit, setDeviceLimit] = useState(tariff?.device_limit || 1) const [devicePriceKopeks, setDevicePriceKopeks] = useState(tariff?.device_price_kopeks || 0) const [tierLevel, setTierLevel] = useState(tariff?.tier_level || 1) const [periodPrices, setPeriodPrices] = useState( tariff?.period_prices || DEFAULT_PERIODS.map(d => ({ days: d, price_kopeks: 0 })) ) const [selectedSquads, setSelectedSquads] = useState(tariff?.allowed_squads || []) const [serverTrafficLimits, setServerTrafficLimits] = useState>( tariff?.server_traffic_limits || {} ) // Произвольное количество дней const [customDaysEnabled, setCustomDaysEnabled] = useState(tariff?.custom_days_enabled || false) const [pricePerDayKopeks, setPricePerDayKopeks] = useState(tariff?.price_per_day_kopeks || 0) const [minDays, setMinDays] = useState(tariff?.min_days || 1) const [maxDays, setMaxDays] = useState(tariff?.max_days || 365) // Произвольный трафик const [customTrafficEnabled, setCustomTrafficEnabled] = useState(tariff?.custom_traffic_enabled || false) const [trafficPricePerGbKopeks, setTrafficPricePerGbKopeks] = useState(tariff?.traffic_price_per_gb_kopeks || 0) const [minTrafficGb, setMinTrafficGb] = useState(tariff?.min_traffic_gb || 1) const [maxTrafficGb, setMaxTrafficGb] = useState(tariff?.max_traffic_gb || 1000) // Докупка трафика const [trafficTopupEnabled, setTrafficTopupEnabled] = useState(tariff?.traffic_topup_enabled || false) const [maxTopupTrafficGb, setMaxTopupTrafficGb] = useState(tariff?.max_topup_traffic_gb || 0) const [trafficTopupPackages, setTrafficTopupPackages] = useState>( tariff?.traffic_topup_packages || {} ) // Дневной тариф const [isDaily, setIsDaily] = useState(tariff?.is_daily || false) const [dailyPriceKopeks, setDailyPriceKopeks] = useState(tariff?.daily_price_kopeks || 0) const [activeTab, setActiveTab] = useState<'basic' | 'prices' | 'servers' | 'custom'>('basic') const handleSubmit = () => { // Фильтруем лимиты только для выбранных серверов и только если они заданы (> 0) const filteredLimits: Record = {} for (const uuid of selectedSquads) { if (serverTrafficLimits[uuid] && serverTrafficLimits[uuid].traffic_limit_gb > 0) { filteredLimits[uuid] = serverTrafficLimits[uuid] } } const data: TariffCreateRequest | TariffUpdateRequest = { name, description: description || undefined, traffic_limit_gb: trafficLimitGb, device_limit: deviceLimit, device_price_kopeks: devicePriceKopeks > 0 ? devicePriceKopeks : undefined, tier_level: tierLevel, period_prices: periodPrices.filter(p => p.price_kopeks > 0), allowed_squads: selectedSquads, server_traffic_limits: Object.keys(filteredLimits).length > 0 ? filteredLimits : {}, // Произвольное количество дней custom_days_enabled: customDaysEnabled, price_per_day_kopeks: pricePerDayKopeks, min_days: minDays, max_days: maxDays, // Произвольный трафик custom_traffic_enabled: customTrafficEnabled, traffic_price_per_gb_kopeks: trafficPricePerGbKopeks, min_traffic_gb: minTrafficGb, max_traffic_gb: maxTrafficGb, // Докупка трафика traffic_topup_enabled: trafficTopupEnabled, traffic_topup_packages: trafficTopupPackages, max_topup_traffic_gb: maxTopupTrafficGb, // Дневной тариф is_daily: isDaily, daily_price_kopeks: dailyPriceKopeks, } onSave(data) } const updateServerTrafficLimit = (uuid: string, limitGb: number) => { setServerTrafficLimits(prev => ({ ...prev, [uuid]: { traffic_limit_gb: limitGb } })) } const toggleServer = (uuid: string) => { setSelectedSquads(prev => prev.includes(uuid) ? prev.filter(s => s !== uuid) : [...prev, uuid] ) } const updatePeriodPrice = (days: number, priceKopeks: number) => { setPeriodPrices(prev => { const existing = prev.find(p => p.days === days) if (existing) { return prev.map(p => p.days === days ? { ...p, price_kopeks: priceKopeks } : p) } return [...prev, { days, price_kopeks: priceKopeks }] }) } return (
{/* Header */}

{isEdit ? t('admin.tariffs.edit') : t('admin.tariffs.create')}

{/* Tabs */}
{(['basic', 'prices', 'servers', 'custom'] as const).map(tab => ( ))}
{/* Content */}
{activeTab === 'basic' && (
{/* Name */}
setName(e.target.value)} className="w-full px-3 py-2 bg-dark-700 border border-dark-600 rounded-lg text-dark-100 focus:outline-none focus:border-accent-500" placeholder={t('admin.tariffs.namePlaceholder')} />
{/* Description */}