costco-grocery-list/frontend/src/lib/uploadQueueStorage.js
Nico 77ae5be445
All checks were successful
Build & Deploy Costco Grocery List / build (push) Successful in 1m10s
Build & Deploy Costco Grocery List / verify-images (push) Successful in 3s
Build & Deploy Costco Grocery List / deploy (push) Successful in 11s
Build & Deploy Costco Grocery List / notify (push) Successful in 1s
refactor
2026-02-22 01:27:03 -08:00

59 lines
1.5 KiB
JavaScript

const DB_NAME = "costco-upload-queue";
const DB_VERSION = 1;
const STORE_NAME = "uploads";
function openUploadQueueDb() {
return new Promise((resolve, reject) => {
if (typeof indexedDB === "undefined") {
reject(new Error("IndexedDB is not available"));
return;
}
const request = indexedDB.open(DB_NAME, DB_VERSION);
request.onupgradeneeded = () => {
const db = request.result;
if (!db.objectStoreNames.contains(STORE_NAME)) {
db.createObjectStore(STORE_NAME, { keyPath: "id" });
}
};
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error || new Error("Failed to open upload DB"));
});
}
function withStore(mode, handler) {
return openUploadQueueDb().then(
(db) =>
new Promise((resolve, reject) => {
const tx = db.transaction(STORE_NAME, mode);
const store = tx.objectStore(STORE_NAME);
const request = handler(store);
tx.oncomplete = () => {
db.close();
resolve(request?.result);
};
tx.onerror = () => {
db.close();
reject(tx.error || new Error("IndexedDB transaction failed"));
};
})
);
}
export function getAllUploadJobs() {
return withStore("readonly", (store) => store.getAll()).then((rows) =>
Array.isArray(rows) ? rows : []
);
}
export function saveUploadJob(job) {
return withStore("readwrite", (store) => store.put(job));
}
export function deleteUploadJob(id) {
return withStore("readwrite", (store) => store.delete(id));
}