import React, { useEffect, useMemo, useState } from 'react' import { getEcho } from '../../bootstrap' export default function MessageInboxBadge({ initialUnreadCount = 0, userId = null, href = '/messages' }) { const [unreadCount, setUnreadCount] = useState(Math.max(0, Number(initialUnreadCount || 0))) useEffect(() => { let cancelled = false const loadUnreadState = async () => { try { const response = await fetch('/api/messages/conversations', { headers: { Accept: 'application/json' }, credentials: 'same-origin', }) if (!response.ok) { throw new Error('Failed to load unread conversations') } const payload = await response.json() if (cancelled) { return } if (cancelled) { return } const nextUnreadTotal = Number(payload?.summary?.unread_total) if (Number.isFinite(nextUnreadTotal)) { setUnreadCount(Math.max(0, nextUnreadTotal)) } } catch { // Keep server-rendered count if bootstrap fetch fails. } } loadUnreadState() return () => { cancelled = true } }, []) useEffect(() => { if (!userId) { return undefined } const echo = getEcho() if (!echo) { return undefined } const channel = echo.private(`user.${userId}`) const handleConversationUpdated = (payload) => { const nextUnreadTotal = Number(payload?.summary?.unread_total) if (Number.isFinite(nextUnreadTotal)) { setUnreadCount(Math.max(0, nextUnreadTotal)) } } channel.listen('.conversation.updated', handleConversationUpdated) return () => { channel.stopListening('.conversation.updated', handleConversationUpdated) echo.leaveChannel(`private-user.${userId}`) } }, [userId]) return ( {unreadCount > 0 ? ( {unreadCount > 99 ? '99+' : unreadCount} ) : null} ) }