diff --git a/src/App.jsx b/src/App.jsx index ebdf57d..7471a41 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,4 +1,4 @@ -import { useState, useEffect, useCallback, useContext } from "react"; +import { useState, useEffect, useCallback, useContext, useRef } from "react"; import { AuthContext } from "./AuthContext"; import Login from "./Login"; import Register from "./Register"; @@ -763,21 +763,27 @@ export default function CoffeeLogbook() { const [isOnline, setIsOnline] = useState(navigator.onLine); const [syncing, setSyncing] = useState(false); + const [showSyncedStatus, setShowSyncedStatus] = useState(false); // Load local data on mount useEffect(() => { loadData().then(setData); }, []); + const dataRef = useRef(data); + dataRef.current = data; + // Sync logic - const syncData = useCallback(async (currentData = data) => { + const syncData = useCallback(async (currentData = dataRef.current) => { if (!token || !currentData) return; if (!navigator.onLine) { setIsOnline(false); + setShowSyncedStatus(true); return; } setIsOnline(true); setSyncing(true); + setShowSyncedStatus(true); try { const { beans = [], brewLogs = [], lastSyncedAt = null } = currentData; @@ -846,8 +852,15 @@ export default function CoffeeLogbook() { console.error('Failed to sync data:', err); } finally { setSyncing(false); + if (navigator.onLine) { + setTimeout(() => { + setShowSyncedStatus(false); + }, 2500); + } else { + setShowSyncedStatus(true); + } } - }, [token, data]); + }, [token]); // Periodic and connectivity event-driven sync triggers useEffect(() => { @@ -857,6 +870,7 @@ export default function CoffeeLogbook() { }; const handleOffline = () => { setIsOnline(false); + setShowSyncedStatus(true); }; window.addEventListener('online', handleOnline); @@ -996,24 +1010,26 @@ export default function CoffeeLogbook() {

Brew Journal

-
- - {isOnline ? (syncing ? "Syncing..." : "Synced") : "Offline"} -
+ {showSyncedStatus && ( +
+ + {isOnline ? (syncing ? "Syncing..." : "Synced") : "Offline"} +
+ )} {user?.username}