const DB_NAME = "tym-offline"; const STORE = "queue"; function openDb() { return new Promise((resolve, reject) => { const req = indexedDB.open(DB_NAME, 1); req.onupgradeneeded = () => req.result.createObjectStore(STORE, { keyPath: "id", autoIncrement: true }); req.onsuccess = () => resolve(req.result); req.onerror = () => reject(req.error); }); } export async function enqueue(entry) { const db = await openDb(); return new Promise((resolve, reject) => { const tx = db.transaction(STORE, "readwrite"); tx.objectStore(STORE).add({ ...entry, queued_at: Date.now() }); tx.oncomplete = () => { db.close(); resolve(); }; tx.onerror = () => reject(tx.error); }); } export async function flushQueue(apiLog) { const db = await openDb(); const entries = await new Promise((resolve, reject) => { const tx = db.transaction(STORE, "readonly"); const req = tx.objectStore(STORE).getAll(); req.onsuccess = () => resolve(req.result || []); req.onerror = () => reject(req.error); }); for (const entry of entries) { try { await apiLog({ slot_id: entry.slot_id, status: entry.status, source: "offline" }); await new Promise((resolve, reject) => { const tx = db.transaction(STORE, "readwrite"); tx.objectStore(STORE).delete(entry.id); tx.oncomplete = resolve; tx.onerror = () => reject(tx.error); }); } catch { break; } } db.close(); }