A React Native app for the ultimate thinking partner.
at main 91 lines 2.5 kB view raw
1import { Platform } from 'react-native'; 2import AsyncStorage from '@react-native-async-storage/async-storage'; 3 4// Platform-specific imports 5let SecureStore: any = null; 6 7try { 8 // Only import SecureStore on native platforms 9 if (Platform.OS !== 'web') { 10 SecureStore = require('expo-secure-store'); 11 } 12} catch (error) { 13 console.warn('SecureStore not available:', error); 14} 15 16/** 17 * Cross-platform secure storage utility 18 * - Uses expo-secure-store on native platforms for encrypted storage 19 * - Falls back to AsyncStorage on web platform 20 */ 21export class Storage { 22 private static isNative(): boolean { 23 return Platform.OS !== 'web' && SecureStore !== null; 24 } 25 26 static async setItem(key: string, value: string): Promise<void> { 27 try { 28 if (this.isNative()) { 29 await SecureStore.setItemAsync(key, value); 30 } else { 31 await AsyncStorage.setItem(key, value); 32 } 33 } catch (error) { 34 console.error('Storage setItem error:', error); 35 throw new Error(`Failed to store item with key: ${key}`); 36 } 37 } 38 39 static async getItem(key: string): Promise<string | null> { 40 try { 41 if (this.isNative()) { 42 return await SecureStore.getItemAsync(key); 43 } else { 44 return await AsyncStorage.getItem(key); 45 } 46 } catch (error) { 47 console.error('Storage getItem error:', error); 48 return null; 49 } 50 } 51 52 static async removeItem(key: string): Promise<void> { 53 try { 54 if (this.isNative()) { 55 await SecureStore.deleteItemAsync(key); 56 } else { 57 await AsyncStorage.removeItem(key); 58 } 59 } catch (error) { 60 console.error('Storage removeItem error:', error); 61 throw new Error(`Failed to remove item with key: ${key}`); 62 } 63 } 64 65 static async clear(): Promise<void> { 66 try { 67 if (this.isNative()) { 68 // SecureStore doesn't have a clear method, so we can't clear everything 69 console.warn('SecureStore does not support clearing all items'); 70 } else { 71 await AsyncStorage.clear(); 72 } 73 } catch (error) { 74 console.error('Storage clear error:', error); 75 throw new Error('Failed to clear storage'); 76 } 77 } 78 79 static getStorageType(): 'SecureStore' | 'AsyncStorage' { 80 return this.isNative() ? 'SecureStore' : 'AsyncStorage'; 81 } 82} 83 84// Storage keys 85export const STORAGE_KEYS = { 86 API_TOKEN: 'ion_api_token', 87 AGENT_ID: 'ion_agent_id', 88 CO_FOLDER_ID: 'co_folder_id', 89} as const; 90 91export default Storage;