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
JavaScript
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,
};
};