UNPKG

use-fs-access

Version:

A React hook that builds on top of the File System Access API to enable easy file and directory operations in modern browsers.

73 lines (72 loc) 2.77 kB
const DEFAULT_DB_NAME = "default-db"; const DEFAULT_STORE_NAME = "default-filehandles-store"; const DEFAULT_DB_VERSION = 1; export const indexedDBDirectoryStore = (props) => { const { dbName = DEFAULT_DB_NAME, dbVersion = DEFAULT_DB_VERSION, storeName: dbStoreName = props?.storeName ?? DEFAULT_STORE_NAME, } = props || {}; function openDB(storeName) { return new Promise((resolve, reject) => { const request = indexedDB.open(dbName, dbVersion); request.onupgradeneeded = () => { const db = request.result; if (!db.objectStoreNames.contains(storeName)) { db.createObjectStore(storeName); } }; request.onsuccess = () => resolve(request.result); request.onerror = () => reject(request.error); }); } async function saveDirectory(key, value, options) { if (!value || !key) return; const { storeName = dbStoreName } = options || {}; const db = await openDB(storeName); const tx = db.transaction(storeName, "readwrite"); const store = tx.objectStore(storeName); store.put(value, key); tx.commit(); } async function getDirectories(options) { const { storeName = dbStoreName } = options || {}; const db = await openDB(storeName); const tx = db.transaction(storeName, "readonly"); const store = tx.objectStore(storeName); const result = new Map(); return new Promise((resolve, reject) => { const request = store.openCursor(); request.onsuccess = () => { const cursor = request.result; if (cursor) { result.set(cursor.key.toString(), cursor.value); cursor.continue(); } else { resolve(result); } }; request.onerror = () => reject(request.error); }); } async function clearDirectories(options) { const { storeName = dbStoreName } = options || {}; const db = await openDB(storeName); const tx = db.transaction(storeName, "readwrite"); const store = tx.objectStore(storeName); store.clear(); tx.commit(); } async function removeDirectory(key, options) { const { storeName = dbStoreName } = options || {}; const db = await openDB(storeName); const tx = db.transaction(storeName, "readwrite"); const store = tx.objectStore(storeName); store.delete(key); tx.commit(); } return { saveDirectory, getDirectories, clearDirectories, removeDirectory, }; };