UNPKG

bigblocks

Version:

Complete Bitcoin UI component library - authentication, social, wallet, market, inscriptions, and blockchain interactions for React

84 lines (83 loc) 2.79 kB
/** * Browser localStorage adapter * Persists data in the browser * Only works in browser environments */ export function createLocalStorage(options) { const prefix = options?.prefix ?? "bigblocks:"; // Check if localStorage is available const isAvailable = typeof window !== "undefined" && window.localStorage; if (!isAvailable) { console.warn("localStorage is not available. Using memory storage as fallback."); // Return a memory storage adapter as fallback const fallbackStore = new Map(); return { async get(key) { return fallbackStore.get(prefix + key) ?? null; }, async set(key, value) { fallbackStore.set(prefix + key, value); }, async delete(key) { fallbackStore.delete(prefix + key); }, async clear() { for (const key of fallbackStore.keys()) { if (key.startsWith(prefix)) { fallbackStore.delete(key); } } }, }; } return { async get(key) { try { return localStorage.getItem(prefix + key); } catch (error) { console.error("localStorage.get error:", error); return null; } }, async set(key, value) { try { localStorage.setItem(prefix + key, value); } catch (error) { console.error("localStorage.set error:", error); // Check if it's a quota exceeded error if (error instanceof Error && error.name === "QuotaExceededError") { throw new Error("localStorage quota exceeded"); } throw error; } }, async delete(key) { try { localStorage.removeItem(prefix + key); } catch (error) { console.error("localStorage.delete error:", error); } }, async clear() { try { // Only clear keys with our prefix const keysToRemove = []; for (let i = 0; i < localStorage.length; i++) { const key = localStorage.key(i); if (key?.startsWith(prefix)) { keysToRemove.push(key); } } for (const key of keysToRemove) { localStorage.removeItem(key); } } catch (error) { console.error("localStorage.clear error:", error); } }, }; }