From fe75fa45f02485bae3c9eed0852e4858aeac5144 Mon Sep 17 00:00:00 2001 From: c0mrade Date: Tue, 24 Mar 2026 15:31:10 +0300 Subject: [PATCH] feat: delete expired subscriptions with confirmation dialog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - API: deleteSubscription() calls DELETE /subscriptions/:id - Subscription detail: "Удалить подписку" button for expired subs in multi-tariff mode - Radix Dialog confirmation with warning text, cancel/confirm buttons - Navigates to /subscriptions after successful deletion --- src/api/subscription.ts | 5 +++ src/pages/Subscription.tsx | 76 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/src/api/subscription.ts b/src/api/subscription.ts index ef8dc7e..3e2162b 100644 --- a/src/api/subscription.ts +++ b/src/api/subscription.ts @@ -48,6 +48,11 @@ export const subscriptionApi = { return response.data; }, + deleteSubscription: async (subscriptionId: number): Promise<{ message: string }> => { + const response = await apiClient.delete(`/cabinet/subscriptions/${subscriptionId}`); + return response.data; + }, + // ── Legacy single-subscription status ─────────────────────────────── getSubscription: async (subscriptionId?: number): Promise => { diff --git a/src/pages/Subscription.tsx b/src/pages/Subscription.tsx index bf32f9f..55c6642 100644 --- a/src/pages/Subscription.tsx +++ b/src/pages/Subscription.tsx @@ -4,6 +4,14 @@ import { useTranslation } from 'react-i18next'; import { useNavigate, useParams } from 'react-router'; import { subscriptionApi } from '../api/subscription'; import { WebBackButton } from '../components/WebBackButton'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from '../components/primitives/Dialog'; import TrafficProgressBar from '../components/dashboard/TrafficProgressBar'; import { HoverBorderGradient } from '../components/ui/hover-border-gradient'; import { useTrafficZone } from '../hooks/useTrafficZone'; @@ -175,6 +183,8 @@ export default function Subscription() { const g = getGlassColors(isDark); const haptic = useHaptic(); const [copied, setCopied] = useState(false); + const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); + const [deleteLoading, setDeleteLoading] = useState(false); // Helper to format price from kopeks const formatPrice = (kopeks: number) => `${formatAmount(kopeks / 100)} ${currencySymbol}`; @@ -1264,6 +1274,72 @@ export default function Subscription() { {/* Purchase / Renewal CTA */} + {/* Delete expired subscription */} + {isMultiTariff && subscription && !subscription.is_active && !subscription.is_trial && ( + <> + + + + + + {t('subscription.deleteTitle', 'Удалить подписку?')} + + {t( + 'subscription.deleteWarning', + 'Подписка будет удалена безвозвратно. Все данные, устройства и настройки будут потеряны. Это действие нельзя отменить.', + )} + + + + + + + + + + )} + {/* Additional Options (Buy Devices) */} {subscription && (subscription.is_active || subscription.is_limited) &&