2026-01-11 16:41:37 +00:00
|
|
|
/**
|
|
|
|
|
* Offline Detection Utility
|
|
|
|
|
* Action 3.5.1.2: Add offline detection utility
|
2026-01-13 18:47:57 +00:00
|
|
|
*
|
2026-01-11 16:41:37 +00:00
|
|
|
* Provides utilities to detect online/offline state using navigator.onLine API
|
|
|
|
|
* and network status events
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Check if the browser is currently online
|
|
|
|
|
* @returns True if online, false if offline
|
|
|
|
|
*/
|
|
|
|
|
export function isOnline(): boolean {
|
|
|
|
|
if (typeof navigator === 'undefined') {
|
|
|
|
|
// Server-side rendering - assume online
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return navigator.onLine;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Check if the browser is currently offline
|
|
|
|
|
* @returns True if offline, false if online
|
|
|
|
|
*/
|
|
|
|
|
export function isOffline(): boolean {
|
|
|
|
|
return !isOnline();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Subscribe to online/offline state changes
|
|
|
|
|
* @param callback Function to call when online state changes
|
|
|
|
|
* @returns Cleanup function to unsubscribe
|
|
|
|
|
*/
|
|
|
|
|
export function subscribeToOnlineStatus(
|
|
|
|
|
callback: (isOnline: boolean) => void,
|
|
|
|
|
): () => void {
|
|
|
|
|
if (typeof window === 'undefined') {
|
|
|
|
|
// Server-side rendering - no-op
|
|
|
|
|
return () => {};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const handleOnline = () => callback(true);
|
|
|
|
|
const handleOffline = () => callback(false);
|
|
|
|
|
|
|
|
|
|
window.addEventListener('online', handleOnline);
|
|
|
|
|
window.addEventListener('offline', handleOffline);
|
|
|
|
|
|
|
|
|
|
// Return cleanup function
|
|
|
|
|
return () => {
|
|
|
|
|
window.removeEventListener('online', handleOnline);
|
|
|
|
|
window.removeEventListener('offline', handleOffline);
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get current network connection information (if available)
|
|
|
|
|
* @returns Network information or null if not available
|
|
|
|
|
*/
|
|
|
|
|
export function getNetworkInfo(): {
|
|
|
|
|
effectiveType?: string;
|
|
|
|
|
downlink?: number;
|
|
|
|
|
rtt?: number;
|
|
|
|
|
saveData?: boolean;
|
|
|
|
|
} | null {
|
|
|
|
|
if (typeof navigator === 'undefined') {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-13 18:47:57 +00:00
|
|
|
const connection =
|
|
|
|
|
(navigator as any).connection ||
|
2026-01-11 16:41:37 +00:00
|
|
|
(navigator as any).mozConnection ||
|
|
|
|
|
(navigator as any).webkitConnection;
|
|
|
|
|
|
|
|
|
|
if (!connection) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
effectiveType: connection.effectiveType,
|
|
|
|
|
downlink: connection.downlink,
|
|
|
|
|
rtt: connection.rtt,
|
|
|
|
|
saveData: connection.saveData,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Check if the connection is slow based on effective type
|
|
|
|
|
* @returns True if connection is slow (2g or slower), false otherwise
|
|
|
|
|
*/
|
|
|
|
|
export function isSlowConnection(): boolean {
|
|
|
|
|
const networkInfo = getNetworkInfo();
|
|
|
|
|
if (!networkInfo?.effectiveType) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const slowTypes = ['2g', 'slow-2g'];
|
|
|
|
|
return slowTypes.includes(networkInfo.effectiveType.toLowerCase());
|
|
|
|
|
}
|