From f1102d278354ae3225f8b36029590d8c01b74ea0 Mon Sep 17 00:00:00 2001 From: Fringg Date: Sun, 8 Mar 2026 14:17:45 +0300 Subject: [PATCH] fix: add purchase-options cache invalidation on balance changes - WebSocketNotifications: invalidate purchase-options on all 10 balance-affecting events - Dashboard: invalidate purchase-options after trial activation - Balance: invalidate purchase-options after payment return and promocode activation - PromoOffersSection: invalidate purchase-options and balance after promo claim --- src/components/PromoOffersSection.tsx | 2 ++ src/components/WebSocketNotifications.tsx | 10 ++++++++++ src/pages/Balance.tsx | 2 ++ src/pages/Dashboard.tsx | 1 + 4 files changed, 15 insertions(+) diff --git a/src/components/PromoOffersSection.tsx b/src/components/PromoOffersSection.tsx index edc9674..a8accdf 100644 --- a/src/components/PromoOffersSection.tsx +++ b/src/components/PromoOffersSection.tsx @@ -116,6 +116,8 @@ export default function PromoOffersSection({ className = '' }: PromoOffersSectio queryClient.invalidateQueries({ queryKey: ['promo-offers'] }); queryClient.invalidateQueries({ queryKey: ['active-discount'] }); queryClient.invalidateQueries({ queryKey: ['subscription'] }); + queryClient.invalidateQueries({ queryKey: ['purchase-options'] }); + queryClient.invalidateQueries({ queryKey: ['balance'] }); setSuccessMessage(result.message); setClaimingId(null); setTimeout(() => setSuccessMessage(null), 5000); diff --git a/src/components/WebSocketNotifications.tsx b/src/components/WebSocketNotifications.tsx index 5d93cbe..d411263 100644 --- a/src/components/WebSocketNotifications.tsx +++ b/src/components/WebSocketNotifications.tsx @@ -41,6 +41,7 @@ export default function WebSocketNotifications() { }); // Refresh data queryClient.invalidateQueries({ queryKey: ['balance'] }); + queryClient.invalidateQueries({ queryKey: ['purchase-options'] }); queryClient.invalidateQueries({ queryKey: ['transactions'] }); refreshUser(); return; @@ -67,6 +68,7 @@ export default function WebSocketNotifications() { duration: 5000, }); queryClient.invalidateQueries({ queryKey: ['balance'] }); + queryClient.invalidateQueries({ queryKey: ['purchase-options'] }); queryClient.invalidateQueries({ queryKey: ['transactions'] }); refreshUser(); return; @@ -82,6 +84,7 @@ export default function WebSocketNotifications() { }); queryClient.invalidateQueries({ queryKey: ['subscription'] }); queryClient.invalidateQueries({ queryKey: ['balance'] }); + queryClient.invalidateQueries({ queryKey: ['purchase-options'] }); refreshUser(); return; } @@ -95,6 +98,7 @@ export default function WebSocketNotifications() { }); queryClient.invalidateQueries({ queryKey: ['subscription'] }); queryClient.invalidateQueries({ queryKey: ['balance'] }); + queryClient.invalidateQueries({ queryKey: ['purchase-options'] }); refreshUser(); return; } @@ -151,6 +155,7 @@ export default function WebSocketNotifications() { duration: 5000, }); queryClient.invalidateQueries({ queryKey: ['balance'] }); + queryClient.invalidateQueries({ queryKey: ['purchase-options'] }); refreshUser(); return; } @@ -180,6 +185,7 @@ export default function WebSocketNotifications() { }); queryClient.invalidateQueries({ queryKey: ['subscription'] }); queryClient.invalidateQueries({ queryKey: ['balance'] }); + queryClient.invalidateQueries({ queryKey: ['purchase-options'] }); queryClient.invalidateQueries({ queryKey: ['transactions'] }); refreshUser(); return; @@ -195,6 +201,7 @@ export default function WebSocketNotifications() { }); queryClient.invalidateQueries({ queryKey: ['subscription'] }); queryClient.invalidateQueries({ queryKey: ['balance'] }); + queryClient.invalidateQueries({ queryKey: ['purchase-options'] }); queryClient.invalidateQueries({ queryKey: ['transactions'] }); refreshUser(); return; @@ -220,6 +227,7 @@ export default function WebSocketNotifications() { }); queryClient.invalidateQueries({ queryKey: ['subscription'] }); queryClient.invalidateQueries({ queryKey: ['balance'] }); + queryClient.invalidateQueries({ queryKey: ['purchase-options'] }); refreshUser(); return; } @@ -329,6 +337,7 @@ export default function WebSocketNotifications() { duration: 8000, }); queryClient.invalidateQueries({ queryKey: ['balance'] }); + queryClient.invalidateQueries({ queryKey: ['purchase-options'] }); queryClient.invalidateQueries({ queryKey: ['referral-stats'] }); refreshUser(); return; @@ -375,6 +384,7 @@ export default function WebSocketNotifications() { duration: 6000, }); queryClient.invalidateQueries({ queryKey: ['balance'] }); + queryClient.invalidateQueries({ queryKey: ['purchase-options'] }); queryClient.invalidateQueries({ queryKey: ['transactions'] }); refreshUser(); return; diff --git a/src/pages/Balance.tsx b/src/pages/Balance.tsx index f6f9809..f591ccc 100644 --- a/src/pages/Balance.tsx +++ b/src/pages/Balance.tsx @@ -79,6 +79,7 @@ export default function Balance() { refreshUser(); queryClient.invalidateQueries({ queryKey: ['transactions'] }); queryClient.invalidateQueries({ queryKey: ['subscription'] }); + queryClient.invalidateQueries({ queryKey: ['purchase-options'] }); showToast({ type: 'success', @@ -164,6 +165,7 @@ export default function Balance() { await refetchBalance(); await refreshUser(); queryClient.invalidateQueries({ queryKey: ['transactions'] }); + queryClient.invalidateQueries({ queryKey: ['purchase-options'] }); } } catch (error: unknown) { const axiosError = error as { response?: { data?: { detail?: string } } }; diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx index b355b6d..2861117 100644 --- a/src/pages/Dashboard.tsx +++ b/src/pages/Dashboard.tsx @@ -87,6 +87,7 @@ export default function Dashboard() { queryClient.invalidateQueries({ queryKey: ['subscription'] }); queryClient.invalidateQueries({ queryKey: ['trial-info'] }); queryClient.invalidateQueries({ queryKey: ['balance'] }); + queryClient.invalidateQueries({ queryKey: ['purchase-options'] }); refreshUser(); }, onError: (error: { response?: { data?: { detail?: string } } }) => {