import { useOnlineStatus, usePendingPostsCount, useSyncPendingPosts } from '@/hooks/useOfflineCache'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; import { Wifi, WifiOff, Cloud, CloudOff, Loader2 } from 'lucide-react'; import { cn } from '@/lib/utils'; import { useTranslation } from '@/contexts/language'; interface OfflineIndicatorProps { className?: string; showWhenOnline?: boolean; } export function OfflineIndicator({ className, showWhenOnline = false }: OfflineIndicatorProps) { const { t } = useTranslation(); const isOnline = useOnlineStatus(); const { data: pendingCount } = usePendingPostsCount(); const { isSyncing } = useSyncPendingPosts(); // Don't show when online (unless explicitly requested or there are pending posts) if (isOnline && !showWhenOnline && !pendingCount && !isSyncing) { return null; } return (
{/* Connection Status */}
{isOnline ? ( ) : ( )}

{isOnline ? t('miscUi.connected') : t('miscUi.offlineMode')}

{isOnline ? t('miscUi.allFeaturesAvailable') : t('miscUi.browsingCachedSpots')}

{/* Pending Posts */} {pendingCount !== undefined && pendingCount > 0 && (
{t('miscUi.queuedActions', { count: pendingCount })} {isSyncing && ( {t('miscUi.syncing')} )}

{isOnline ? t('miscUi.publishingWhenStable') : t('miscUi.willPublishOnline')}

)} {/* Offline Features Info */} {!isOnline && (

{t('miscUi.availableOffline')}

  • {t('miscUi.offlineBrowseSpots')}
  • {t('miscUi.offlineViewDetails')}
  • {t('miscUi.offlineKeepActing')}
)}
); }