/ services / mangaMappingService.ts
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  }