"use client" import { useNetworkStatus } from "@/lib/api/use-network-status" import { useEffect, useState, useCallback } from "react" import { Icon } from "@iconify/react" import { getPendingCount, flush } from "@/lib/api/offline-queue" import { cn } from "@/lib/utils" type SyncState = "idle" | "offline" | "syncing" export function SyncStatusBar() { const { isOnline } = useNetworkStatus() const [syncState, setSyncState] = useState("idle") const [pendingCount, setPendingCount] = useState(0) const refreshCount = useCallback(async () => { const count = await getPendingCount() setPendingCount(count) return count }, []) useEffect(() => { if (!isOnline) { setSyncState("offline") return } let cancelled = false const syncOnReconnect = async () => { const count = await refreshCount() if (cancelled) return if (count > 0) { setSyncState("syncing") await flush() if (cancelled) return await refreshCount() setSyncState("idle") } else { setSyncState("idle") } } syncOnReconnect() return () => { cancelled = true } }, [isOnline, refreshCount]) useEffect(() => { if (syncState !== "offline") return const interval = setInterval(() => refreshCount(), 2000) return () => clearInterval(interval) }, [syncState, refreshCount]) const visible = syncState !== "idle" return (
{syncState === "offline" && ( <> Offline — changes will sync when reconnected {pendingCount > 0 && ( {pendingCount} pending )} )} {syncState === "syncing" && ( <> Syncing {pendingCount} changes… )}
) }