MediBot / lib /mobile /offline-cache.ts
github-actions[bot]
Deploy MedOS Global from 0b9218f6
102e23b
'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);
};
}