feat(users): кнопка удаления подписки в карточке пользователя

В мультитарифном режиме у пользователя несколько подписок, и убрать
лишнюю — например, отработавший триал — можно было только через экран
«Массовые действия». Во вкладке «Подписка» карточки подписки видны и
открываются, но удалить выбранную нечем.

Кнопка живёт в детальном виде подписки и требует подтверждения тем же
inline-механизмом, что и отмена автоплатежа; ключ подтверждения включает
id подписки, чтобы взведённое согласие не пережило переключение на
соседнюю. Активная платная подписка на сервере защищена от случайного
удаления, поэтому для неё запрос идёт с явным force — намерение админ
уже подтвердил.
This commit is contained in:
Case211
2026-08-04 23:38:20 +05:00
parent b866bebeeb
commit eafc563128
7 changed files with 89 additions and 4 deletions

View File

@@ -662,6 +662,24 @@ export default function AdminUserDetail() {
}
};
const handleDeleteSubscription = async () => {
if (!userId || !selectedSub) return;
setActionLoading(true);
try {
// Активную платную подписку сервер по умолчанию бережёт — админ уже
// подтвердил намерение кнопкой, поэтому просим удалить именно её.
const force = Boolean(selectedSub.is_active) && !selectedSub.is_trial;
await adminUsersApi.deleteSubscription(userId, selectedSub.id, force);
notify.success(t('admin.users.detail.subscription.deleted'), t('common.success'));
setSubscriptionDetailView(false);
await loadUser();
} catch {
notify.error(t('admin.users.userActions.error'), t('common.error'));
} finally {
setActionLoading(false);
}
};
const handleDisableUser = async () => {
if (!userId) return;
setActionLoading(true);
@@ -874,6 +892,7 @@ export default function AdminUserDetail() {
userSubscriptions={userSubscriptions}
selectedSub={selectedSub}
onCancelSbpRecurring={handleCancelSbpRecurring}
onDeleteSubscription={handleDeleteSubscription}
activeSubscriptionId={activeSubscriptionId}
onActiveSubscriptionChange={setActiveSubscriptionId}
subscriptionDetailView={subscriptionDetailView}