commit b957dfbf7ba7750ab47133fe149aa609a01571c0
parent dc6b859314396ac1a86a136ace06bf4dd5bb93a7
Author: Sergej Orlov <wladimirych@gmail.com>
Date: Sat, 3 Dec 2016 03:30:40 +0300
[track list] store tracks in localStorage
Diffstat:
2 files changed, 102 insertions(+), 3 deletions(-)
diff --git a/src/App.js b/src/App.js
@@ -15,8 +15,10 @@ import './adaptive.css';
import 'lib/leaflet.control.panoramas/panoramas';
import 'lib/leaflet.control.track-list/track-list';
import 'lib/leaflet.control.track-list/track-list.hash-state';
+import 'lib/leaflet.control.track-list/track-list.localstorage';
import enableLayersControlAdaptiveHeight from 'lib/leaflet.control.layers.adaptive-height/adaptive-height';
import enableLayersMinimize from 'lib/leaflet.control.layers.minimize/minimize';
+import hashState from 'lib/leaflet.hashState/hashState';
function raiseControlsOnMouse(controls) {
@@ -82,11 +84,15 @@ function setUp() {
/////////// controls bottom-right corner
- new L.Control.TrackList()
- .addTo(map)
- .enableHashState('nktk');
+ const tracklist = new L.Control.TrackList()
+ .addTo(map);
+ if (!hashState.getState('nktk')) {
+ tracklist.loadTracksFromStorage();
+ }
+ tracklist.enableHashState('nktk');
raiseControlsOnMouse();
+ L.DomEvent.on(window, 'beforeunload', () => tracklist.saveTracksToStorage());
}
export default {setUp};
diff --git a/src/lib/leaflet.control.track-list/track-list.localstorage.js b/src/lib/leaflet.control.track-list/track-list.localstorage.js
@@ -0,0 +1,92 @@
+import './track-list'
+import L from 'leaflet';
+import {parseGeoFile} from './lib/geo_file_formats';
+
+L.Control.TrackList.include({
+ maxLocalStorageSessions: 5,
+
+ saveTracksToStorage: function() {
+ if (!(window.localStorage)) {
+ return;
+ }
+ var tracks = this.tracks(),
+ serialized = [],
+ maxKey = -1,
+ i, track, s, key, m, keys = [];
+
+ for (i = 0; i < localStorage.length; i++) {
+ key = localStorage.key(i);
+ m = key.match(/^trackList_(\d+)$/);
+ if (m && m[1] !== undefined) {
+ if (+m[1] > maxKey) {
+ maxKey = +m[1];
+ }
+ }
+ }
+ key = 'trackList_' + (maxKey + 1);
+
+ if (tracks.length === 0) {
+ localStorage.setItem(key, '');
+ return;
+ }
+ for (i = 0; i < tracks.length; i++) {
+ track = tracks[i];
+ s = this.trackToString(track);
+ serialized.push(s);
+ }
+ if (serialized.length === 0) {
+ return;
+ }
+ s = '#nktk=' + serialized.join('/');
+
+ localStorage.setItem(key, s);
+
+ //cleanup stale records
+ for (i = 0; i < localStorage.length; i++) {
+ key = localStorage.key(i);
+ m = key.match(/^trackList_(\d+)$/);
+ if (m && m[1] !== undefined) {
+ keys.push(+m[1]);
+ }
+ }
+ if (keys.length > this.maxLocalStorageSessions) {
+ keys.sort(function(a, b) {
+ return a - b
+ }
+ );
+ for (i = 0; i < keys.length - this.maxLocalStorageSessions; i++) {
+ key = 'trackList_' + keys[i];
+ localStorage.removeItem(key);
+ }
+ }
+ },
+
+ loadTracksFromStorage: function() {
+ if (!(window.localStorage)) {
+ return;
+ }
+ var i, key, m, s,
+ geodata,
+ maxKey = -1;
+
+ for (i = 0; i < localStorage.length; i++) {
+ key = localStorage.key(i);
+ m = key.match(/^trackList_(\d+)$/);
+ if (m && m[1] !== undefined) {
+ if (+m[1] > maxKey) {
+ maxKey = +m[1];
+ }
+ }
+ }
+ if (maxKey > -1) {
+ key = 'trackList_' + maxKey;
+ s = localStorage.getItem(key);
+ localStorage.removeItem(key);
+ if (s) {
+ geodata = parseGeoFile('', s);
+ this.addTracksFromGeodataArray(geodata);
+ }
+ }
+ }
+ }
+);
+\ No newline at end of file