A React Native app for the ultimate thinking partner.
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;