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
59 lines
1.5 KiB
JavaScript
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));
|
|
}
|