diff --git a/src/components/BikeFilters.vue b/src/components/BikeFilters.vue
index 6c97629..d2e0b65 100644
--- a/src/components/BikeFilters.vue
+++ b/src/components/BikeFilters.vue
@@ -1,21 +1,72 @@
-
+
diff --git a/src/components/BikeMap.vue b/src/components/BikeMap.vue
index 9e3758e..a4dfdee 100644
--- a/src/components/BikeMap.vue
+++ b/src/components/BikeMap.vue
@@ -2,7 +2,7 @@
import 'leaflet/dist/leaflet.css'
import 'vue-leaflet-markercluster/dist/style.css'
-import L from 'leaflet'
+import L, { Map } from 'leaflet'
globalThis.L = L
import { useMap } from '@/stores/map'
@@ -10,13 +10,17 @@ import type { ApiResponse } from '@/types/Api'
import type { BikeParking } from '@/types/Bikes'
import { API_BASE_URL, API_LIMIT, MAP_TILELAYER_URL, SpotAccess, SpotType } from '@/utils/const'
import { useQuery } from '@pinia/colada'
-import { LControlZoom, LMap, LTileLayer } from '@vue-leaflet/vue-leaflet'
+import { LControlZoom, LIcon, LMap, LMarker, LTileLayer } from '@vue-leaflet/vue-leaflet'
import BikeFilters from './BikeFilters.vue'
-import { computed, ref } from 'vue'
+import { computed, ref, useTemplateRef } from 'vue'
import { storeToRefs } from 'pinia'
import BikeClusterLayer from './BikeClusterLayer.vue'
-import { PhCircleNotch } from '@phosphor-icons/vue'
+import { PhCircleNotch, PhMapPin } from '@phosphor-icons/vue'
+// Map setup
+const mapRef = useTemplateRef<{ leafletObject: Map }>('map')
+
+// Data fetching
const fetchedPages = ref(0)
const totalPages = ref(1)
const progress = computed(() => Math.round((fetchedPages.value / totalPages.value) * 100))
@@ -78,13 +82,22 @@ const premiumParkingsSpots = computed(() =>
const { zoom, minZoom, center, maxBounds, maxBoundsViscosity, maxClusterRadius, disableClusteringAtZoom, extraOptions } = useMap()
const { filterUncovered, filterCovered, filterKorrigo } = storeToRefs(useMap())
+
+// Geolocation
+const { userCoords } = storeToRefs(useMap())
+
+function handleClickGeoloc() {
+ if (userCoords.value) {
+ mapRef.value?.leafletObject.flyTo([userCoords.value.latitude, userCoords.value.longitude], 12)
+ }
+}
+ :nb-covered="coveredParkingsSpots" :nb-korrigo="premiumParkingsSpots" @click-geoloc="handleClickGeoloc" />
@@ -103,6 +116,12 @@ const { filterUncovered, filterCovered, filterKorrigo } = storeToRefs(useMap())
+
+
+
+
+
+
{
+ // Map config and options
const zoom = ref(10)
const minZoom = 8
const center = ref([48.11180645878813, -1.6637869497745246])
@@ -18,9 +19,14 @@ export const useMap = defineStore('map', () => {
zoomControl: false,
}
+ // Cluster layers options
const maxClusterRadius = 40
const disableClusteringAtZoom = 17
+ // Geolocation
+ const userCoords = ref | null>(null)
+
+ // Active filters
const filterUncovered = ref(true)
const filterCovered = ref(true)
const filterKorrigo = ref(true)
@@ -36,9 +42,10 @@ export const useMap = defineStore('map', () => {
center,
maxBounds,
maxBoundsViscosity,
+ extraOptions,
maxClusterRadius,
disableClusteringAtZoom,
- extraOptions,
+ userCoords,
filterUncovered,
filterCovered,
filterKorrigo,