mangaMappingService.ts
1 import AsyncStorage from '@react-native-async-storage/async-storage'; 2 3 interface MangaMapping { 4 internalId: string; 5 anilistId: number; 6 title: string; 7 lastUpdated: number; 8 } 9 10 const MAPPING_PREFIX = 'manga_mapping_'; 11 12 export async function getMangaMappings(): Promise< 13 Record<string, MangaMapping> 14 > { 15 try { 16 const keys = await AsyncStorage.getAllKeys(); 17 const mappingKeys = keys.filter((key) => key.startsWith(MAPPING_PREFIX)); 18 const mappings = await AsyncStorage.multiGet(mappingKeys); 19 20 return mappings.reduce( 21 (acc, [key, value]) => { 22 if (value) { 23 const internalId = key.replace(MAPPING_PREFIX, ''); 24 acc[internalId] = JSON.parse(value); 25 } 26 return acc; 27 }, 28 {} as Record<string, MangaMapping> 29 ); 30 } catch (error) { 31 console.error('Error getting manga mappings:', error); 32 return {}; 33 } 34 } 35 36 export async function saveMangaMapping( 37 internalId: string, 38 anilistId: number, 39 title: string 40 ): Promise<void> { 41 try { 42 const mapping: MangaMapping = { 43 internalId, 44 anilistId, 45 title, 46 lastUpdated: Date.now(), 47 }; 48 await AsyncStorage.setItem( 49 `${MAPPING_PREFIX}${internalId}`, 50 JSON.stringify(mapping) 51 ); 52 } catch (error) { 53 console.error('Error saving manga mapping:', error); 54 } 55 } 56 57 export async function getMangaMapping( 58 internalId: string 59 ): Promise<MangaMapping | null> { 60 try { 61 const mapping = await AsyncStorage.getItem( 62 `${MAPPING_PREFIX}${internalId}` 63 ); 64 return mapping ? JSON.parse(mapping) : null; 65 } catch (error) { 66 console.error('Error getting manga mapping:', error); 67 return null; 68 } 69 } 70 71 export async function getAnilistIdFromInternalId( 72 internalId: string 73 ): Promise<number | null> { 74 const mapping = await getMangaMapping(internalId); 75 return mapping ? mapping.anilistId : null; 76 } 77 78 export async function removeMangaMapping(internalId: string): Promise<void> { 79 try { 80 await AsyncStorage.removeItem(`${MAPPING_PREFIX}${internalId}`); 81 } catch (error) { 82 console.error('Error removing manga mapping:', error); 83 } 84 } 85 86 export async function clearAllMappings(): Promise<void> { 87 try { 88 const keys = await AsyncStorage.getAllKeys(); 89 const mappingKeys = keys.filter((key) => key.startsWith(MAPPING_PREFIX)); 90 await AsyncStorage.multiRemove(mappingKeys); 91 } catch (error) { 92 console.error('Error clearing manga mappings:', error); 93 } 94 }