import { OfflineManager as MapLibreOfflineManager, OfflinePack, OfflinePackError, OfflinePackStatus } from "@maplibre/maplibre-react-native"; import type { MapParameters } from "../types"; import { deltaToBounds } from "../utils/map"; import { DEFAULT_TILES_STYLE } from "./constants"; import { useNetworkStore } from "../storages/network"; import { queryClient } from "../api"; class OfflineManager { constructor() {} async createPack(mapParameter: MapParameters) { const styleURL = mapParameter.snippet.tilesstyle || DEFAULT_TILES_STYLE; const packName = `tiles-${mapParameter.id}`; const tilesPack = await MapLibreOfflineManager.getPack(packName); if (tilesPack && useNetworkStore.getState().isOnline) { await MapLibreOfflineManager.invalidatePack(packName); return; } else if (tilesPack || !useNetworkStore.getState().isOnline) { return; } const progressListener = (offlineRegion: OfflinePack, status: OfflinePackStatus) => { if (status.percentage === 100) { console.log(`Pack ${packName} is complete`); } }; const errorListener = (offlineRegion: OfflinePack, err: OfflinePackError) => console.log(offlineRegion, err); const bounds = deltaToBounds(mapParameter); await MapLibreOfflineManager.createPack( { name: packName, styleURL: styleURL, minZoom: mapParameter.snippet.minzoom, maxZoom: mapParameter.snippet.maxzoom, bounds: [ [bounds.getSouthWest().lng, bounds.getSouthWest().lat], [bounds.getNorthEast().lng, bounds.getNorthEast().lat], ], }, progressListener, errorListener, ); } async deletePack(packName: string) { return MapLibreOfflineManager.deletePack(packName); } async clearCache() { for (const pack of await MapLibreOfflineManager.getPacks()) { if (pack.name) { await MapLibreOfflineManager.deletePack(pack.name); } } queryClient.removeQueries(); } } export default new OfflineManager();