veza/apps/web/src/utils/offlineDetection.ts

99 lines
2.4 KiB
TypeScript
Raw Normal View History

/**
* Offline Detection Utility
* Action 3.5.1.2: Add offline detection utility
*
* 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;
}
const connection =
(navigator as any).connection ||
(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());
}