diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 94ffedc2..73047d12 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -3,6 +3,7 @@ import { Routes, Route, NavLink, Navigate, useLocation } from 'react-router-dom' import { userSession, authenticate, disconnect } from './utils/stacks'; import Header from './components/Header'; import SendTip from './components/SendTip'; +import OfflineBanner from './components/OfflineBanner'; import { AnimatedHero } from './components/ui/animated-hero'; import { ToastContainer, useToast } from './components/ui/toast'; @@ -59,6 +60,7 @@ function App() { return (
+
diff --git a/frontend/src/components/OfflineBanner.jsx b/frontend/src/components/OfflineBanner.jsx new file mode 100644 index 00000000..9bfced7f --- /dev/null +++ b/frontend/src/components/OfflineBanner.jsx @@ -0,0 +1,18 @@ +import { useOnlineStatus } from '../hooks/useOnlineStatus'; + +export default function OfflineBanner() { + const isOnline = useOnlineStatus(); + + if (isOnline) return null; + + return ( +
+
+ + + + You are offline. Some features may not work until your connection is restored. +
+
+ ); +} diff --git a/frontend/src/hooks/useOnlineStatus.js b/frontend/src/hooks/useOnlineStatus.js new file mode 100644 index 00000000..611b76aa --- /dev/null +++ b/frontend/src/hooks/useOnlineStatus.js @@ -0,0 +1,20 @@ +import { useState, useEffect } from 'react'; + +export function useOnlineStatus() { + const [isOnline, setIsOnline] = useState(navigator.onLine); + + useEffect(() => { + const handleOnline = () => setIsOnline(true); + const handleOffline = () => setIsOnline(false); + + window.addEventListener('online', handleOnline); + window.addEventListener('offline', handleOffline); + + return () => { + window.removeEventListener('online', handleOnline); + window.removeEventListener('offline', handleOffline); + }; + }, []); + + return isOnline; +}