import { ContactData, Documento, Pagamento, Reserva, ReservaData, SocialMedia } from "../types"; import AsyncStorage from "@react-native-async-storage/async-storage"; const STORAGE_KEYS = { RESERVAS: "@cruiseLovers:reservas", RESERVA_DETAIL: "@cruiseLovers:reserva:", RESERVA_FULL: "@cruiseLovers:reservaFull:", CONTACTS: "@cruiseLovers:contacts", SOCIALS: "@cruiseLovers:socials", USER_INFO: "@cruiseLovers:userInfo", LAST_SYNC: "@cruiseLovers:lastSync", CACHE_VERSION: "@cruiseLovers:cacheVersion", } as const; export interface CachedReservaFull { reservaData: ReservaData; pagamentos: Pagamento[]; documentos: Documento[]; cachedAt: string; } const CACHE_VERSION = "1.0.0"; /** * Armazena a lista de reservas no cache */ export const cacheReservas = async (reservas: Reserva[]): Promise => { try { await AsyncStorage.setItem(STORAGE_KEYS.RESERVAS, JSON.stringify(reservas)); await AsyncStorage.setItem(STORAGE_KEYS.LAST_SYNC, new Date().toISOString()); } catch (error) { console.error("Erro ao armazenar reservas no cache:", error); } }; /** * Obtém a lista de reservas do cache */ export const getCachedReservas = async (): Promise => { try { const cached = await AsyncStorage.getItem(STORAGE_KEYS.RESERVAS); if (cached) { return JSON.parse(cached); } return null; } catch (error) { console.error("Erro ao obter reservas do cache:", error); return null; } }; /** * Armazena os detalhes de uma reserva no cache */ export const cacheReservaDetail = async (id: string, reservaData: ReservaData): Promise => { try { const key = `${STORAGE_KEYS.RESERVA_DETAIL}${id}`; await AsyncStorage.setItem(key, JSON.stringify(reservaData)); } catch (error) { console.error(`Erro ao armazenar detalhes da reserva ${id} no cache:`, error); } }; /** * Obtém os detalhes de uma reserva do cache */ export const getCachedReservaDetail = async (id: string): Promise => { try { const key = `${STORAGE_KEYS.RESERVA_DETAIL}${id}`; const cached = await AsyncStorage.getItem(key); if (cached) { return JSON.parse(cached); } return null; } catch (error) { console.error(`Erro ao obter detalhes da reserva ${id} do cache:`, error); return null; } }; /** * Armazena os dados completos de uma reserva (reserva + pagamentos + documentos) no cache */ export const cacheReservaFull = async (referencia: string, data: CachedReservaFull): Promise => { try { const key = `${STORAGE_KEYS.RESERVA_FULL}${referencia}`; await AsyncStorage.setItem(key, JSON.stringify(data)); } catch (error) { console.error(`Erro ao armazenar dados completos da reserva ${referencia} no cache:`, error); } }; /** * Obtém os dados completos de uma reserva do cache */ export const getCachedReservaFull = async (referencia: string): Promise => { try { const key = `${STORAGE_KEYS.RESERVA_FULL}${referencia}`; const cached = await AsyncStorage.getItem(key); return cached ? (JSON.parse(cached) as CachedReservaFull) : null; } catch (error) { console.error(`Erro ao obter dados completos da reserva ${referencia} do cache:`, error); return null; } }; /** * Armazena os contactos no cache */ export const cacheContacts = async (contactData: ContactData, socials: SocialMedia[]): Promise => { try { await AsyncStorage.setItem(STORAGE_KEYS.CONTACTS, JSON.stringify(contactData)); await AsyncStorage.setItem(STORAGE_KEYS.SOCIALS, JSON.stringify(socials)); await AsyncStorage.setItem(STORAGE_KEYS.LAST_SYNC, new Date().toISOString()); } catch (error) { console.error("Erro ao armazenar contactos no cache:", error); } }; /** * Obtém os contactos do cache */ export const getCachedContacts = async (): Promise<{ contactData: ContactData | null; socials: SocialMedia[] }> => { try { const cachedContact = await AsyncStorage.getItem(STORAGE_KEYS.CONTACTS); const cachedSocials = await AsyncStorage.getItem(STORAGE_KEYS.SOCIALS); return { contactData: cachedContact ? JSON.parse(cachedContact) : null, socials: cachedSocials ? JSON.parse(cachedSocials) : [], }; } catch (error) { console.error("Erro ao obter contactos do cache:", error); return { contactData: null, socials: [] }; } }; /** * Obtém a data da última sincronização */ export const getLastSyncDate = async (): Promise => { try { const lastSync = await AsyncStorage.getItem(STORAGE_KEYS.LAST_SYNC); return lastSync ? new Date(lastSync) : null; } catch { return null; } }; /** * Limpa todo o cache */ export const clearCache = async (): Promise => { try { const keys = await AsyncStorage.getAllKeys(); const appKeys = keys.filter(key => key.startsWith("@cruiseLovers:")); await AsyncStorage.multiRemove(appKeys); } catch (error) { console.error("Erro ao limpar cache:", error); } }; /** * Limpa apenas o cache de reservas */ export const clearReservasCache = async (): Promise => { try { const keys = await AsyncStorage.getAllKeys(); const reservaKeys = keys.filter(key => key === STORAGE_KEYS.RESERVAS || key.startsWith(STORAGE_KEYS.RESERVA_DETAIL) ); await AsyncStorage.multiRemove(reservaKeys); } catch (error) { console.error("Erro ao limpar cache de reservas:", error); } }; /** * Armazena informações do perfil no cache */ export const cacheUserInfo = async (userInfo: any): Promise => { try { await AsyncStorage.setItem(STORAGE_KEYS.USER_INFO, JSON.stringify(userInfo)); } catch (error) { console.error("Erro ao armazenar perfil no cache:", error); } }; /** * Obtém informações do perfil do cache */ export const getCachedUserInfo = async (): Promise => { try { const cached = await AsyncStorage.getItem(STORAGE_KEYS.USER_INFO); return cached ? JSON.parse(cached) : null; } catch (error) { console.error("Erro ao obter perfil do cache:", error); return null; } }; /** * Obtém informações sobre o tamanho do cache */ export const getCacheInfo = async (): Promise<{ size: number; lastSync: Date | null }> => { try { const keys = await AsyncStorage.getAllKeys(); const appKeys = keys.filter(key => key.startsWith("@cruiseLovers:")); const items = await AsyncStorage.multiGet(appKeys); let totalSize = 0; items.forEach(([_, value]) => { if (value) { totalSize += value.length; } }); const lastSync = await getLastSyncDate(); return { size: totalSize, lastSync, }; } catch (error) { console.error("Erro ao obter informações do cache:", error); return { size: 0, lastSync: null }; } };