Mobile Work
This commit is contained in:
107
frontend/src/core/utils/safe-storage.ts
Normal file
107
frontend/src/core/utils/safe-storage.ts
Normal 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();
|
||||
Reference in New Issue
Block a user