import { useState } from 'react'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { subscriptionApi } from '@/api/subscription'; import { DevicesIcon, PlusIcon, TrashIcon, WarningIcon } from '@/components/icons'; import { ResponsiveSheet } from '@/components/ui/ResponsiveSheet'; import { getApiErrorMessage } from '@/utils/api-error'; interface DeviceLimitSheetProps { isOpen: boolean; onClose: () => void; subscriptionId: number; subscriptionName: string; deviceLimit: number; isTrial: boolean; devices: Array<{ hwid: string; platform: string; device_model: string; local_name?: string | null; }>; /** Уводит на страницу подписки, где живёт докупка слотов. */ onOpenSubscription: () => void; } /** * Почему нельзя подключить ещё одно устройство и что с этим делать. * * Открывается из подвала карточки, когда слоты кончились. Заблокировать * кнопку было бы проще, но человек остался бы без выхода: реальных действий * тут два — освободить слот или добавить ещё. */ export function DeviceLimitSheet({ isOpen, onClose, subscriptionId, subscriptionName, deviceLimit, isTrial, devices, onOpenSubscription, }: DeviceLimitSheetProps) { const { t } = useTranslation(); const queryClient = useQueryClient(); const [error, setError] = useState(null); // Докупка слотов недоступна на тестовой подписке и при безлимите — ровно // те же условия, что у блока докупки на странице подписки. const canAddSlots = !isTrial && deviceLimit !== 0; const disconnect = useMutation({ mutationFn: (hwid: string) => subscriptionApi.deleteDevice(hwid, subscriptionId), onSuccess: () => { setError(null); queryClient.invalidateQueries({ queryKey: ['devices', subscriptionId] }); onClose(); }, onError: (err) => setError(getApiErrorMessage(err, t('common.error', 'Не удалось выполнить действие'))), }); return (

{canAddSlots ? t('subscription.connectFooter.limitExplained', { defaultValue: 'Тариф «{{name}}» даёт {{count}} слота, и все заняты. Освободите слот или добавьте ещё.', name: subscriptionName, count: deviceLimit, }) : t('subscription.connectFooter.limitExplainedNoTopup', { defaultValue: 'Тариф «{{name}}» даёт {{count}} слота, и все заняты. Освободите занятый слот.', name: subscriptionName, count: deviceLimit, })}

{t('subscription.connectFooter.connectedDevices', 'Подключённые устройства')}
{devices.map((device) => (
{device.local_name || device.device_model || device.platform}
{device.platform}
))}
{error && (

{error}

)} {canAddSlots ? ( ) : (

{t( 'subscription.connectFooter.noTopupHint', 'На тестовой подписке слоты докупить нельзя — освободите занятый или оформите платный тариф.', )}

)}
); }