fix: improve Toast visibility and allow tariff deletion with subscriptions

- Toast: use solid bg-dark-800 background instead of transparent gradient
- Toast: increase border opacity for better visibility
- Tariffs: allow deletion even with active subscriptions (shows warning)
- Add confirmDeleteWithSubscriptions translation to all locales
This commit is contained in:
c0mrade
2026-02-02 02:34:11 +03:00
parent 6f4d1ef085
commit 36cc01ca7e
6 changed files with 32 additions and 25 deletions

View File

@@ -97,28 +97,32 @@ function ToastItem({ toast, onClose }: { toast: Toast; onClose: () => void }) {
const typeStyles = {
success: {
bg: 'bg-gradient-to-r from-success-500/20 to-success-600/10',
border: 'border-success-500/30',
bg: 'bg-dark-800',
accent: 'bg-gradient-to-r from-success-500/30 to-transparent',
border: 'border-success-500/50',
icon: 'text-success-400',
iconBg: 'bg-success-500/20',
iconBg: 'bg-success-500/30',
},
error: {
bg: 'bg-gradient-to-r from-error-500/20 to-error-600/10',
border: 'border-error-500/30',
bg: 'bg-dark-800',
accent: 'bg-gradient-to-r from-error-500/30 to-transparent',
border: 'border-error-500/50',
icon: 'text-error-400',
iconBg: 'bg-error-500/20',
iconBg: 'bg-error-500/30',
},
warning: {
bg: 'bg-gradient-to-r from-warning-500/20 to-warning-600/10',
border: 'border-warning-500/30',
bg: 'bg-dark-800',
accent: 'bg-gradient-to-r from-warning-500/30 to-transparent',
border: 'border-warning-500/50',
icon: 'text-warning-400',
iconBg: 'bg-warning-500/20',
iconBg: 'bg-warning-500/30',
},
info: {
bg: 'bg-gradient-to-r from-accent-500/20 to-accent-600/10',
border: 'border-accent-500/30',
bg: 'bg-dark-800',
accent: 'bg-gradient-to-r from-accent-500/30 to-transparent',
border: 'border-accent-500/50',
icon: 'text-accent-400',
iconBg: 'bg-accent-500/20',
iconBg: 'bg-accent-500/30',
},
};
@@ -181,11 +185,11 @@ function ToastItem({ toast, onClose }: { toast: Toast; onClose: () => void }) {
return (
<div
className={`pointer-events-auto w-80 sm:w-96 ${style.bg} border backdrop-blur-xl ${style.border} animate-slide-in-right overflow-hidden rounded-2xl shadow-2xl shadow-black/20 ${toast.onClick ? 'cursor-pointer hover:scale-[1.02] active:scale-[0.98]' : ''} transition-transform duration-200`}
className={`pointer-events-auto w-80 sm:w-96 ${style.bg} border ${style.border} animate-slide-in-right overflow-hidden rounded-2xl shadow-2xl shadow-black/40 ${toast.onClick ? 'cursor-pointer hover:scale-[1.02] active:scale-[0.98]' : ''} transition-transform duration-200`}
onClick={handleClick}
>
{/* Glow effect */}
<div className={`absolute inset-0 ${style.bg} opacity-50 blur-xl`} />
{/* Color accent */}
<div className={`absolute inset-0 ${style.accent}`} />
<div className="relative p-4">
<div className="flex gap-3">

View File

@@ -1215,9 +1215,9 @@
"deactivate": "Deactivate",
"toggleTrial": "Toggle Trial",
"delete": "Delete",
"cannotDeleteHasSubscriptions": "Cannot delete: has active subscriptions",
"confirmDelete": "Delete tariff?",
"confirmDeleteText": "This action cannot be undone. The tariff will be permanently deleted.",
"confirmDeleteWithSubscriptions": "This tariff has {{count}} active subscriptions. After deletion, users will need to select a new tariff when renewing.",
"deleteSuccess": "Tariff deleted successfully",
"days": "days",
"days_one": "{{count}} day",

View File

@@ -989,9 +989,9 @@
"deactivate": "غیرفعال‌سازی",
"toggleTrial": "تغییر آزمایشی",
"delete": "حذف",
"cannotDeleteHasSubscriptions": "حذف ممکن نیست: اشتراک‌های فعال وجود دارد",
"confirmDelete": "تعرفه حذف شود؟",
"confirmDeleteText": "این عمل قابل بازگشت نیست. تعرفه برای همیشه حذف می‌شود.",
"confirmDeleteWithSubscriptions": "این تعرفه {{count}} اشتراک فعال دارد. پس از حذف، کاربران هنگام تمدید باید تعرفه جدید انتخاب کنند.",
"deleteSuccess": "تعرفه با موفقیت حذف شد",
"days": "روز",
"days_other": "{{count}} روز",

View File

@@ -1725,9 +1725,9 @@
"deactivate": "Деактивировать",
"toggleTrial": "Переключить триал",
"delete": "Удалить",
"cannotDeleteHasSubscriptions": "Нельзя удалить: есть активные подписки",
"confirmDelete": "Удалить тариф?",
"confirmDeleteText": "Это действие нельзя отменить. Тариф будет удален навсегда.",
"confirmDeleteText": "Это действие нельзя отменить. Тариф будет удалён навсегда.",
"confirmDeleteWithSubscriptions": "У этого тарифа {{count}} активных подписок. При удалении пользователям потребуется выбрать новый тариф при продлении.",
"deleteSuccess": "Тариф успешно удален",
"days": "дней",
"days_one": "{{count}} день",

View File

@@ -1027,9 +1027,9 @@
"deactivate": "停用",
"toggleTrial": "切换试用",
"delete": "删除",
"cannotDeleteHasSubscriptions": "无法删除:有活跃订阅",
"confirmDelete": "删除套餐?",
"confirmDeleteText": "此操作不可撤销。套餐将被永久删除。",
"confirmDeleteWithSubscriptions": "此套餐有 {{count}} 个活跃订阅。删除后,用户续订时需要选择新套餐。",
"deleteSuccess": "套餐删除成功",
"days": "天",
"days_other": "{{count}} 天",

View File

@@ -67,13 +67,16 @@ export default function AdminTariffs() {
});
const handleDelete = async (tariff: TariffListItem) => {
if (tariff.subscriptions_count > 0) {
notify.warning(t('admin.tariffs.cannotDeleteHasSubscriptions'));
return;
}
// 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(
t('admin.tariffs.confirmDeleteText'),
confirmText,
t('common.delete'),
t('admin.tariffs.confirmDelete'),
);