From 839e1f814eaa65b9a032fac69eb7ffe13c36c51b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Faleiros?= Date: Tue, 30 Jun 2026 12:49:39 -0300 Subject: [PATCH] Show RFV loading state in clients table --- src/pages/Clients.tsx | 49 +++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/src/pages/Clients.tsx b/src/pages/Clients.tsx index 67119d7..5f341a1 100644 --- a/src/pages/Clients.tsx +++ b/src/pages/Clients.tsx @@ -188,6 +188,7 @@ const Clients = () => { const [rfmAnalytics, setRfmAnalytics] = useState(initialRfmAnalytics || null); const [clientAnalytics, setClientAnalytics] = useState(initialClientAnalytics || []); const [isLoading, setIsLoading] = useState(!initialClientAnalytics); + const [isRfmLoading, setIsRfmLoading] = useState(!initialRfmAnalytics && Boolean(initialClientAnalytics)); // Pagination state const [currentPage, setCurrentPage] = useState(1); @@ -207,6 +208,7 @@ const Clients = () => { if (cachedClients) setClientAnalytics(cachedClients); setRfmAnalytics(cachedRfm || null); setIsLoading(!hasCachedClients); + setIsRfmLoading(!cachedRfm && hasCachedClients); } const filterOptionsPromise = fetchClientFilterOptions(dateRange, { force: true }); @@ -218,11 +220,13 @@ const Clients = () => { setFilterOptions(options); setClientAnalytics(clientsData); setIsLoading(false); + setIsRfmLoading(!cachedRfm); } const rfmData = await rfmPromise; if (isMounted) { setRfmAnalytics(rfmData); + setIsRfmLoading(false); } }; @@ -441,6 +445,7 @@ const Clients = () => { (sortBy === 'recent' ? 0 : 1); const hasActiveFilters = activeFilterCount > 0; const isRefreshing = isLoading && clientAnalytics.length > 0; + const shouldShowRfmLoading = isRfmLoading && clientAnalytics.length > 0; return (
@@ -672,24 +677,36 @@ const Clients = () => { {client.name} - - {client.clientType} - + {shouldShowRfmLoading ? ( + + ) : ( + + {client.clientType} + + )} -
- {client.rfmScore.split('').map((score, scoreIndex) => ( - - {score} - - ))} -
+ {shouldShowRfmLoading ? ( +
+ {[0, 1, 2].map(item => ( + + ))} +
+ ) : ( +
+ {client.rfmScore.split('').map((score, scoreIndex) => ( + + {score} + + ))} +
+ )} {formatCurrency(client.totalSpent)} {formatCurrency(client.averageTicket)}