From 667c94a4c461b8f507ddc852c9e89d6ad42f5107 Mon Sep 17 00:00:00 2001 From: vcoppe Date: Tue, 30 Apr 2024 20:55:47 +0200 Subject: [PATCH] patches with immer (not working atm) --- website/package-lock.json | 10 + website/package.json | 1 + .../lib/components/ElevationProfile.svelte | 8 +- website/src/lib/components/FileList.svelte | 88 ++++---- .../src/lib/components/FileListItem.svelte | 23 +- website/src/lib/components/GPXData.svelte | 29 +-- website/src/lib/components/Menu.svelte | 27 +-- .../src/lib/components/gpx-layer/GPXLayer.ts | 50 ++--- .../lib/components/gpx-layer/GPXLayers.svelte | 22 +- .../src/lib/components/toolbar/Toolbar.svelte | 7 +- .../toolbar/tools/routing/Routing.svelte | 51 ++--- .../toolbar/tools/routing/RoutingControls.ts | 76 ++++--- website/src/lib/filestore.ts | 159 ++++++++++++++ website/src/lib/stores.ts | 198 +++++++----------- 14 files changed, 428 insertions(+), 321 deletions(-) create mode 100644 website/src/lib/filestore.ts diff --git a/website/package-lock.json b/website/package-lock.json index d3c5b8d2..4a123af3 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -13,6 +13,7 @@ "chart.js": "^4.4.2", "clsx": "^2.1.0", "gpx": "file:../gpx", + "immer": "^10.1.1", "lucide-svelte": "^0.365.0", "mapbox-gl": "^3.2.0", "mode-watcher": "^0.3.0", @@ -3356,6 +3357,15 @@ "node": ">= 4" } }, + "node_modules/immer": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", + "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", diff --git a/website/package.json b/website/package.json index 66b9836a..f5d37cbe 100644 --- a/website/package.json +++ b/website/package.json @@ -46,6 +46,7 @@ "chart.js": "^4.4.2", "clsx": "^2.1.0", "gpx": "file:../gpx", + "immer": "^10.1.1", "lucide-svelte": "^0.365.0", "mapbox-gl": "^3.2.0", "mode-watcher": "^0.3.0", diff --git a/website/src/lib/components/ElevationProfile.svelte b/website/src/lib/components/ElevationProfile.svelte index 7a24097a..000c6f2c 100644 --- a/website/src/lib/components/ElevationProfile.svelte +++ b/website/src/lib/components/ElevationProfile.svelte @@ -6,8 +6,7 @@ import Chart from 'chart.js/auto'; import mapboxgl from 'mapbox-gl'; - import { map, fileOrder, selectedFiles, settings } from '$lib/stores'; - import { get } from 'svelte/store'; + import { map, settings, gpxData } from '$lib/stores'; import { onDestroy, onMount } from 'svelte'; import { @@ -19,7 +18,6 @@ Thermometer, Zap } from 'lucide-svelte'; - import { GPXFiles } from 'gpx'; import { surfaceColors } from '$lib/assets/surfaces'; import { _ } from 'svelte-i18n'; @@ -32,7 +30,6 @@ getConvertedVelocity, getDistanceUnits, getDistanceWithUnits, - getElevationUnits, getElevationWithUnits, getHeartRateUnits, getHeartRateWithUnits, @@ -236,8 +233,7 @@ }); $: if (chart && $settings) { - let gpxFiles = new GPXFiles(get(fileOrder).filter((f) => $selectedFiles.has(f))); - let data = gpxFiles.getTrackPointsAndStatistics(); + let data = $gpxData; // update data chart.data.datasets[0] = { diff --git a/website/src/lib/components/FileList.svelte b/website/src/lib/components/FileList.svelte index fee279a7..0d1fb80b 100644 --- a/website/src/lib/components/FileList.svelte +++ b/website/src/lib/components/FileList.svelte @@ -1,52 +1,50 @@
- {#each $files as file, index} + {#each $filestore as file}
- +
{/each}
diff --git a/website/src/lib/components/FileListItem.svelte b/website/src/lib/components/FileListItem.svelte index b2d6de8e..84b2b0cf 100644 --- a/website/src/lib/components/FileListItem.svelte +++ b/website/src/lib/components/FileListItem.svelte @@ -4,43 +4,38 @@ import Shortcut from './Shortcut.svelte'; import { Copy, Trash2 } from 'lucide-svelte'; - import type { GPXFile } from 'gpx'; - import { get, type Writable } from 'svelte/store'; - import { - duplicateSelectedFiles, - removeSelectedFiles, - selectedFiles, - selectFiles - } from '$lib/stores'; + import { filestore, selectedFiles, selectFiles } from '$lib/stores'; import { _ } from 'svelte-i18n'; + import type { GPXFile } from 'gpx'; + import type { Immutable } from 'immer'; - export let file: Writable; + export let file: Writable> | undefined;
{ - if (!get(selectedFiles).has(get(file))) { - get(selectFiles).select(get(file)); + if (!get(selectedFiles).has($file?._data.id)) { + get(selectFiles).select($file?._data.id); } }} > - + {$_('menu.duplicate')} - {$_('menu.delete')} @@ -28,25 +21,25 @@ - + {$_('quantities.distance')} - + - + {$_('quantities.elevation')} - + / - + {$settings.velocityUnits === 'speed' ? $_('quantities.speed') : $_('quantities.pace')} ({$_( @@ -57,9 +50,9 @@ - + / - + {$_('quantities.time')} ({$_('quantities.total')} / {$_('quantities.moving')}) - + {$_('menu.duplicate')} @@ -80,7 +80,7 @@ {$_('menu.export')} - + {$_('menu.export_all')} @@ -107,15 +107,18 @@ - + {$_('menu.delete')} {$_('menu.delete_all')} @@ -199,7 +202,7 @@ triggerFileInput(); e.preventDefault(); } else if (e.key === 'd' && (e.metaKey || e.ctrlKey)) { - duplicateSelectedFiles(); + filestore.duplicateSelectedFiles(); e.preventDefault(); } else if ((e.key === 's' || e.key == 'S') && (e.metaKey || e.ctrlKey)) { if (e.shiftKey) { @@ -210,9 +213,9 @@ e.preventDefault(); } else if ((e.key === 'Backspace' || e.key === 'Delete') && (e.metaKey || e.ctrlKey)) { if (e.shiftKey) { - removeAllFiles(); + filestore.deleteAllFiles(); } else { - removeSelectedFiles(); + filestore.deleteSelectedFiles(); } e.preventDefault(); } else if (e.key === 'a' && (e.metaKey || e.ctrlKey)) { diff --git a/website/src/lib/components/gpx-layer/GPXLayer.ts b/website/src/lib/components/gpx-layer/GPXLayer.ts index 1f1da064..b11e1dbe 100644 --- a/website/src/lib/components/gpx-layer/GPXLayer.ts +++ b/website/src/lib/components/gpx-layer/GPXLayer.ts @@ -1,13 +1,8 @@ -import type { GPXFile, Waypoint } from "gpx"; +import type { GPXFile } from "gpx"; import { map, selectFiles, currentTool, Tool } from "$lib/stores"; import { get, type Writable } from "svelte/store"; import mapboxgl from "mapbox-gl"; -let id = 0; -function getLayerId() { - return `gpx-${id++}`; -} - let defaultWeight = 6; let defaultOpacity = 1; @@ -44,7 +39,7 @@ function decrementColor(color: string) { export class GPXLayer { map: mapboxgl.Map; file: Writable; - layerId: string; + fileId: string; layerColor: string; popup: mapboxgl.Popup; popupElement: HTMLElement; @@ -57,36 +52,33 @@ export class GPXLayer { constructor(map: mapboxgl.Map, file: Writable, popup: mapboxgl.Popup, popupElement: HTMLElement) { this.map = map; this.file = file; - this.layerId = getLayerId(); + this.fileId = get(file)._data.id; this.layerColor = getColor(); this.popup = popup; this.popupElement = popupElement; this.unsubscribe = file.subscribe(this.updateData.bind(this)); - get(this.file)._data = { - layerId: this.layerId, - layerColor: this.layerColor - }; + get(this.file)._data.layerColor = this.layerColor; this.add(); this.map.on('style.load', this.addBinded); } add() { - if (!this.map.getSource(this.layerId)) { + if (!this.map.getSource(this.fileId)) { let data = this.getGeoJSON(); - this.map.addSource(this.layerId, { + this.map.addSource(this.fileId, { type: 'geojson', data }); } - if (!this.map.getLayer(this.layerId)) { + if (!this.map.getLayer(this.fileId)) { this.map.addLayer({ - id: this.layerId, + id: this.fileId, type: 'line', - source: this.layerId, + source: this.fileId, layout: { 'line-join': 'round', 'line-cap': 'round' @@ -98,14 +90,14 @@ export class GPXLayer { } }); - this.map.on('click', this.layerId, this.selectOnClickBinded); - this.map.on('mouseenter', this.layerId, toPointerCursor); - this.map.on('mouseleave', this.layerId, toDefaultCursor); + this.map.on('click', this.fileId, this.selectOnClickBinded); + this.map.on('mouseenter', this.fileId, toPointerCursor); + this.map.on('mouseleave', this.fileId, toDefaultCursor); } } updateData() { - let source = this.map.getSource(this.layerId); + let source = this.map.getSource(this.fileId); if (source) { source.setData(this.getGeoJSON()); } @@ -137,13 +129,13 @@ export class GPXLayer { } remove() { - this.map.off('click', this.layerId, this.selectOnClickBinded); - this.map.off('mouseenter', this.layerId, toPointerCursor); - this.map.off('mouseleave', this.layerId, toDefaultCursor); + this.map.off('click', this.fileId, this.selectOnClickBinded); + this.map.off('mouseenter', this.fileId, toPointerCursor); + this.map.off('mouseleave', this.fileId, toDefaultCursor); this.map.off('style.load', this.addBinded); - this.map.removeLayer(this.layerId); - this.map.removeSource(this.layerId); + this.map.removeLayer(this.fileId); + this.map.removeSource(this.fileId); this.markers.forEach((marker) => { marker.remove(); @@ -155,7 +147,7 @@ export class GPXLayer { } moveToFront() { - this.map.moveLayer(this.layerId); + this.map.moveLayer(this.fileId); } selectOnClick(e: any) { @@ -163,9 +155,9 @@ export class GPXLayer { return; } if (e.originalEvent.shiftKey) { - get(selectFiles).addSelect(get(this.file)); + get(selectFiles).addSelect(this.fileId); } else { - get(selectFiles).select(get(this.file)); + get(selectFiles).select(this.fileId); } } diff --git a/website/src/lib/components/gpx-layer/GPXLayers.svelte b/website/src/lib/components/gpx-layer/GPXLayers.svelte index e627f531..4269dbfc 100644 --- a/website/src/lib/components/gpx-layer/GPXLayers.svelte +++ b/website/src/lib/components/gpx-layer/GPXLayers.svelte @@ -1,5 +1,5 @@