Mobile Work

This commit is contained in:
Eric Gullickson
2025-09-19 11:33:31 -05:00
parent 040da4c759
commit 3588372cef
7 changed files with 189 additions and 13 deletions

View File

@@ -0,0 +1,107 @@
/**
* @ai-summary Safe localStorage wrapper for mobile browsers
* @ai-context Prevents errors when localStorage is blocked in mobile browsers
*/
// Safe localStorage wrapper that won't crash on mobile browsers
const createSafeStorage = () => {
let isAvailable = false;
// Test localStorage availability
try {
const testKey = '__motovaultpro_storage_test__';
localStorage.setItem(testKey, 'test');
localStorage.removeItem(testKey);
isAvailable = true;
} catch (error) {
console.warn('[Storage] localStorage not available, using memory fallback:', error);
isAvailable = false;
}
// Memory fallback when localStorage is blocked
const memoryStorage = new Map<string, string>();
return {
getItem: (key: string): string | null => {
try {
if (isAvailable) {
return localStorage.getItem(key);
} else {
return memoryStorage.get(key) || null;
}
} catch (error) {
console.warn('[Storage] getItem failed, using memory fallback:', error);
return memoryStorage.get(key) || null;
}
},
setItem: (key: string, value: string): void => {
try {
if (isAvailable) {
localStorage.setItem(key, value);
} else {
memoryStorage.set(key, value);
}
} catch (error) {
console.warn('[Storage] setItem failed, using memory fallback:', error);
memoryStorage.set(key, value);
}
},
removeItem: (key: string): void => {
try {
if (isAvailable) {
localStorage.removeItem(key);
} else {
memoryStorage.delete(key);
}
} catch (error) {
console.warn('[Storage] removeItem failed, using memory fallback:', error);
memoryStorage.delete(key);
}
},
// For zustand createJSONStorage compatibility
key: (index: number): string | null => {
try {
if (isAvailable) {
return localStorage.key(index);
} else {
const keys = Array.from(memoryStorage.keys());
return keys[index] || null;
}
} catch (error) {
console.warn('[Storage] key access failed:', error);
return null;
}
},
get length(): number {
try {
if (isAvailable) {
return localStorage.length;
} else {
return memoryStorage.size;
}
} catch (error) {
console.warn('[Storage] length access failed:', error);
return 0;
}
},
clear: (): void => {
try {
if (isAvailable) {
localStorage.clear();
} else {
memoryStorage.clear();
}
} catch (error) {
console.warn('[Storage] clear failed:', error);
memoryStorage.clear();
}
}
};
};
export const safeStorage = createSafeStorage();