From fd06d7b243e75bdceced6a3aa780dee45d4238fb Mon Sep 17 00:00:00 2001 From: pradeepkumar Date: Mon, 23 Mar 2026 21:27:34 +0530 Subject: [PATCH] feat: Implement client-side caching for conversations in `useMessaging` to reduce re-fetching and improve performance. --- src/hooks/useMessaging.ts | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/hooks/useMessaging.ts b/src/hooks/useMessaging.ts index a926d39..c9bf62d 100644 --- a/src/hooks/useMessaging.ts +++ b/src/hooks/useMessaging.ts @@ -49,16 +49,22 @@ interface UseMessagingReturn { hasMoreMessages: boolean; } +// Module-level cache to avoid re-fetching on tab switch +let _cachedConversations: Conversation[] | null = null; +let _cachedTimestamp = 0; +const CACHE_TTL = 30000; // 30 seconds + export function useMessaging(options: UseMessagingOptions = {}): UseMessagingReturn { const { autoConnect = true } = options; const { data: session } = useSession(); - // State - const [conversations, setConversations] = useState([]); + // State — initialize from cache if available and fresh + const hasFreshCache = _cachedConversations && (Date.now() - _cachedTimestamp < CACHE_TTL); + const [conversations, setConversations] = useState(hasFreshCache ? _cachedConversations! : []); const [currentConversation, setCurrentConversation] = useState(null); const [messages, setMessages] = useState([]); const [isConnected, setIsConnected] = useState(false); - const [isLoading, setIsLoading] = useState(false); + const [isLoading, setIsLoading] = useState(!hasFreshCache); const [isLoadingMessages, setIsLoadingMessages] = useState(false); const [typingUsers, setTypingUsers] = useState>(new Set()); const [unreadCount, setUnreadCount] = useState(0); @@ -109,6 +115,9 @@ export function useMessaging(options: UseMessagingOptions = {}): UseMessagingRet try { const data = await messagesService.getConversations(); setConversations(data); + // Update module-level cache + _cachedConversations = data; + _cachedTimestamp = Date.now(); } catch (error) { console.error('Failed to load conversations:', error); } finally { @@ -557,7 +566,13 @@ export function useMessaging(options: UseMessagingOptions = {}): UseMessagingRet if (autoConnect && isAuthenticated && !isInitializedRef.current) { isInitializedRef.current = true; connect(); - loadConversations(); + + // Only fetch conversations if cache is stale or empty + if (!_cachedConversations || Date.now() - _cachedTimestamp >= CACHE_TTL) { + loadConversations(); + } else { + setIsLoading(false); + } // Get initial unread count messagesService.getUnreadCount().then(setUnreadCount).catch(console.error);