fix: complete is_limited status handling across all views

- SubscriptionListCard: show traffic progress bar for limited subs
  in multi-tariff list (was hidden because isActive excluded limited)
- SubscriptionListCard: amber border/background for limited status
  cards (was using default neutral style, inconsistent with rest of UI)
- Subscription page: hide delete button for limited subs in
  multi-tariff mode (limited subs still have valid days remaining)
- SubscriptionPurchase: allow tariff switch for limited subs
  (was blocked by is_active-only gate in canSwitch formula)
- AdminUserDetail: include limited status in "already purchased"
  tariff filter to prevent duplicate subscription creation
This commit is contained in:
Fringg
2026-04-23 04:04:11 +03:00
parent f68b46699c
commit 1d5ce2d4ea
4 changed files with 111 additions and 97 deletions

View File

@@ -82,7 +82,10 @@ export default function SubscriptionListCard({
}; };
const isTrial = subscription.is_trial; const isTrial = subscription.is_trial;
const isActive = subscription.status === 'active' || subscription.status === 'trial'; const isActive =
subscription.status === 'active' ||
subscription.status === 'trial' ||
subscription.status === 'limited';
const isExpired = subscription.status === 'expired' || subscription.status === 'disabled'; const isExpired = subscription.status === 'expired' || subscription.status === 'disabled';
const trafficLimit = subscription.traffic_limit_gb; const trafficLimit = subscription.traffic_limit_gb;
const trafficUsed = subscription.traffic_used_gb; const trafficUsed = subscription.traffic_used_gb;
@@ -95,13 +98,17 @@ export default function SubscriptionListCard({
const trafficColor = const trafficColor =
trafficPercent >= 90 ? 'bg-red-400' : trafficPercent >= 70 ? 'bg-amber-400' : 'bg-emerald-400'; trafficPercent >= 90 ? 'bg-red-400' : trafficPercent >= 70 ? 'bg-amber-400' : 'bg-emerald-400';
const borderColor = isTrial const isLimitedStatus = subscription.status === 'limited';
const borderColor =
isTrial || isLimitedStatus
? 'rgba(251,191,36,0.2)' ? 'rgba(251,191,36,0.2)'
: isExpired : isExpired
? 'rgba(255,59,92,0.15)' ? 'rgba(255,59,92,0.15)'
: g.cardBorder; : g.cardBorder;
const bgColor = isTrial const bgColor =
isTrial || isLimitedStatus
? isDark ? isDark
? 'rgba(251,191,36,0.04)' ? 'rgba(251,191,36,0.04)'
: 'rgba(251,191,36,0.03)' : 'rgba(251,191,36,0.03)'

View File

@@ -1658,7 +1658,10 @@ export default function AdminUserDetail() {
.filter((tariffItem) => { .filter((tariffItem) => {
const purchasedIds = new Set( const purchasedIds = new Set(
userSubscriptions userSubscriptions
.filter((s) => s.is_active || s.status === 'trial') .filter(
(s) =>
s.is_active || s.status === 'trial' || s.status === 'limited',
)
.map((s) => s.tariff_id), .map((s) => s.tariff_id),
); );
return !purchasedIds.has(tariffItem.id); return !purchasedIds.has(tariffItem.id);

View File

@@ -1316,7 +1316,11 @@ export default function Subscription() {
<PurchaseCTAButton subscription={subscription} isMultiTariff={isMultiTariff} /> <PurchaseCTAButton subscription={subscription} isMultiTariff={isMultiTariff} />
{/* Delete expired subscription */} {/* Delete expired subscription */}
{isMultiTariff && subscription && !subscription.is_active && !subscription.is_trial && ( {isMultiTariff &&
subscription &&
!subscription.is_active &&
!subscription.is_trial &&
!subscription.is_limited && (
<div className="space-y-3"> <div className="space-y-3">
{!showDeleteSheet ? ( {!showDeleteSheet ? (
<button <button

View File

@@ -781,7 +781,7 @@ export default function SubscriptionPurchase() {
!isCurrentTariff && !isCurrentTariff &&
!subscription.is_trial && !subscription.is_trial &&
!isSubscriptionExpired && !isSubscriptionExpired &&
subscription.is_active; (subscription.is_active || subscription.is_limited);
const isLegacySubscription = const isLegacySubscription =
subscription && !subscription.is_trial && !subscription.tariff_id; subscription && !subscription.is_trial && !subscription.tariff_id;