File size: 2,010 Bytes
102e23b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | 'use client';
/**
* Offline cache management for PWA.
* Manages the medical FAQ cache for offline access.
*/
const CACHE_KEY = 'medos-offline-faq';
const CACHE_VERSION = 1;
interface CachedData {
version: number;
timestamp: number;
faqs: Array<{ question: string; answer: string }>;
}
export function saveFAQToCache(
faqs: Array<{ question: string; answer: string }>
): void {
if (typeof localStorage === 'undefined') return;
const data: CachedData = {
version: CACHE_VERSION,
timestamp: Date.now(),
faqs,
};
try {
localStorage.setItem(CACHE_KEY, JSON.stringify(data));
} catch {
// Storage full — clear old data and retry
try {
localStorage.removeItem(CACHE_KEY);
localStorage.setItem(CACHE_KEY, JSON.stringify(data));
} catch {
// Silently fail if storage is completely full
}
}
}
export function loadFAQFromCache(): Array<{
question: string;
answer: string;
}> | null {
if (typeof localStorage === 'undefined') return null;
try {
const raw = localStorage.getItem(CACHE_KEY);
if (!raw) return null;
const data: CachedData = JSON.parse(raw);
if (data.version !== CACHE_VERSION) return null;
// Cache is valid for 30 days
const thirtyDays = 30 * 24 * 60 * 60 * 1000;
if (Date.now() - data.timestamp > thirtyDays) return null;
return data.faqs;
} catch {
return null;
}
}
export function isOnline(): boolean {
if (typeof navigator === 'undefined') return true;
return navigator.onLine;
}
export function onConnectivityChange(
callback: (online: boolean) => void
): () => void {
if (typeof window === 'undefined') return () => {};
const handleOnline = () => callback(true);
const handleOffline = () => callback(false);
window.addEventListener('online', handleOnline);
window.addEventListener('offline', handleOffline);
return () => {
window.removeEventListener('online', handleOnline);
window.removeEventListener('offline', handleOffline);
};
}
|