bigblocks
Version:
Complete Bitcoin UI component library - authentication, social, wallet, market, inscriptions, and blockchain interactions for React
84 lines (83 loc) • 2.79 kB
JavaScript
/**
* 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);
}
},
};
}