"use client" import { useState, useEffect, useCallback } from "react" import { WifiOff, RefreshCw } from "lucide-react" import { cn } from "@/lib/utils" import { useDesktop } from "@/hooks/use-desktop" import { useSyncStatus, useTriggerSync } from "@/hooks/use-sync-status" import { Button } from "@/components/ui/button" interface OfflineBannerProps { readonly className?: string } // Desktop-specific offline banner that shows pending mutation count. // Different from the native offline banner which uses Capacitor Network. export function DesktopOfflineBanner({ className }: OfflineBannerProps) { const isDesktop = useDesktop() const { status, pendingCount } = useSyncStatus() const triggerSync = useTriggerSync() const [dismissed, setDismissed] = useState(false) const handleRetry = useCallback(() => { triggerSync() }, [triggerSync]) const handleDismiss = useCallback(() => { setDismissed(true) }, []) // Reset dismissed state when coming back online useEffect(() => { if (status !== "offline") { setDismissed(false) } }, [status]) // Don't render on non-desktop or when online if (!isDesktop || status !== "offline") return null // Don't show if dismissed and no new pending items if (dismissed && pendingCount === 0) return null return (
You're offline. {pendingCount > 0 && ( {pendingCount} change{pendingCount !== 1 ? "s" : ""} queued for sync. )}
) } // Minimal version showing just a status bar export function OfflineStatusBar({ className }: OfflineBannerProps) { const isDesktop = useDesktop() const { status, pendingCount } = useSyncStatus() if (!isDesktop || status !== "offline") return null return (
Offline {pendingCount > 0 && ( {pendingCount} )}
) }