40 lines
1.2 KiB
TypeScript
40 lines
1.2 KiB
TypeScript
import { type Project, validateProject } from "../engine/schema.ts";
|
|
function db(): Promise<IDBDatabase> {
|
|
return new Promise((resolve, reject) => {
|
|
const req = indexedDB.open("forma-projects", 1);
|
|
req.onupgradeneeded = () => req.result.createObjectStore("projects");
|
|
req.onsuccess = () => resolve(req.result);
|
|
req.onerror = () => reject(req.error);
|
|
});
|
|
}
|
|
export async function loadDraft(key = "active") {
|
|
const d = await db();
|
|
return new Promise<Project | null>((resolve, reject) => {
|
|
const r = d.transaction("projects").objectStore("projects").get(key);
|
|
r.onsuccess = () => {
|
|
d.close();
|
|
if (r.result) {
|
|
try {
|
|
validateProject(r.result);
|
|
resolve(r.result);
|
|
} catch {
|
|
resolve(null);
|
|
}
|
|
} else resolve(null);
|
|
};
|
|
r.onerror = () => reject(r.error);
|
|
});
|
|
}
|
|
export async function saveDraft(p: Project, key = "active") {
|
|
const d = await db();
|
|
return new Promise<void>((resolve, reject) => {
|
|
const tx = d.transaction("projects", "readwrite");
|
|
tx.objectStore("projects").put(p, key);
|
|
tx.oncomplete = () => {
|
|
d.close();
|
|
resolve();
|
|
};
|
|
tx.onerror = () => reject(tx.error);
|
|
});
|
|
}
|