import { tileLayerOffline, savetiles, SaveStatus } from 'leaflet.offline';
import { Control, Map } from 'leaflet';
import debounce from 'debounce';
import storageLayer from './storageLayer';
import './style.css';
const urlTemplate = 'https://tile.openstreetmap.org/{z}/{x}/{y}.png';
const leafletMap = new Map('map');
// offline baselayer, will use offline source if available
const baseLayer = tileLayerOffline(urlTemplate, {
attribution: 'Map data {attribution.OpenStreetMap}',
subdomains: 'abc',
minZoom: 13,
}).addTo(leafletMap);
// add buttons to save tiles in area viewed
const saveControl = savetiles(baseLayer, {
zoomlevels: [13, 16], // optional zoomlevels to save, default current zoomlevel
alwaysDownload: false,
confirm(status: SaveStatus, successCallback: Function) {
// eslint-disable-next-line no-alert
if (window.confirm(`Save ${status._tilesforSave.length}`)) {
successCallback();
}
},
confirmRemoval(status: SaveStatus, successCallback: Function) {
// eslint-disable-next-line no-alert
if (window.confirm('Remove all the tiles?')) {
successCallback();
}
},
saveText: '',
rmText: '',
});
saveControl.addTo(leafletMap);
leafletMap.setView(
{
lat: 52.09,
lng: 5.118,
},
16,
);
// layer switcher control
const layerswitcher = new Control.Layers(
{
'osm (offline)': baseLayer,
},
undefined,
{ collapsed: false },
).addTo(leafletMap);
// add storage overlay
storageLayer(baseLayer, layerswitcher);
// events while saving a tile layer
let progress: number;
let total: number;
const showProgress = debounce(() => {
document.getElementById('progressbar')!.style.width = `${
(progress / total) * 100
}%`;
document.getElementById('progressbar')!.innerHTML = progress.toString();
if (progress === total) {
setTimeout(
() =>
document.getElementById('progress-wrapper')!.classList.remove('show'),
1000,
);
}
}, 10);
baseLayer.on('savestart', (e) => {
progress = 0;
// @ts-ignore
total = e._tilesforSave.length;
document.getElementById('progress-wrapper')!.classList.add('show');
document.getElementById('progressbar')!.style.width = '0%';
});
baseLayer.on('loadtileend', () => {
progress += 1;
showProgress();
});