"use client"; import { openDB, type IDBPDatabase } from "idb"; const DB_NAME = "app-cache"; const DB_VERSION = 1; export interface CachedDoc { id: string; payload: unknown; cachedAt: number; } export interface PendingWrite { id: string; op: "create" | "update" | "delete"; endpoint: string; body: unknown; createdAt: number; } let dbPromise: Promise | null = null; function getDB(): Promise { if (!dbPromise) { dbPromise = openDB(DB_NAME, DB_VERSION, { upgrade(db) { if (!db.objectStoreNames.contains("docs")) { db.createObjectStore("docs", { keyPath: "id" }); } if (!db.objectStoreNames.contains("pending")) { db.createObjectStore("pending", { keyPath: "id" }); } }, }); } return dbPromise; } export async function getCached(id: string): Promise { return (await getDB()).get("docs", id) as Promise; } export async function setCached(doc: CachedDoc): Promise { await (await getDB()).put("docs", doc); } export async function deleteCached(id: string): Promise { await (await getDB()).delete("docs", id); } export async function getAllCached(): Promise { return (await getDB()).getAll("docs") as Promise; } export async function enqueueWrite(w: PendingWrite): Promise { await (await getDB()).put("pending", w); } export async function getPendingWrites(): Promise { return (await getDB()).getAll("pending") as Promise; } export async function clearPendingWrite(id: string): Promise { await (await getDB()).delete("pending", id); } // Optimistic write helper — update cache and enqueue remote sync. export async function optimisticWrite( doc: T, endpoint: string, op: PendingWrite["op"] = "update", ): Promise { await setCached({ id: doc.id, payload: doc, cachedAt: Date.now() }); await enqueueWrite({ id: `${doc.id}-${Date.now()}`, op, endpoint, body: doc, createdAt: Date.now(), }); }