Add basic location store for getting geoposition

This commit is contained in:
Eli Ribble 2026-04-04 02:32:09 +00:00
parent beb6d9d066
commit 332e64c9ab
No known key found for this signature in database
3 changed files with 64 additions and 1 deletions

View file

@ -499,10 +499,11 @@ select.tall {
</template>
<script setup lang="ts">
import { computed, ref } from "vue";
import { computed, onMounted, ref } from "vue";
import AddressSuggestion from "@/components/AddressSuggestion.vue";
import ImageUpload, { Image } from "@/components/ImageUpload.vue";
import MapLocator from "@/components/MapLocator.vue";
import { useLocationStore } from "@/store/location";
import type { Location, Marker } from "@/types";
import type { Camera } from "@/type/map";
import type { Address } from "@/type/stadia";
@ -516,6 +517,7 @@ const marker = ref<Marker | null>(null);
const showMore = ref<boolean>(false);
const selectedAddress = ref<Address | null>(null);
const locationStore = useLocationStore();
const markers = computed((): Marker[] => {
if (marker.value) {
return [marker.value];
@ -626,4 +628,14 @@ async function doSubmit() {
isSubmitting.value = false;
}
}
onMounted(() => {
locationStore
.get()
.then((loc: GeolocationPosition) => {
console.log("got location");
})
.catch((e) => {
console.log("failed to get location", e);
});
});
</script>

35
ts/store/location.ts Normal file
View file

@ -0,0 +1,35 @@
import { defineStore } from "pinia";
interface GeolocationOptions {
maximumAge?: number;
timeout?: number;
enableHighAccuracy?: boolean;
}
export const useLocationStore = defineStore("location", () => {
function get(options?: GeolocationOptions): Promise<GeolocationPosition> {
return new Promise((resolve, reject) => {
// Check if geolocation is supported by the browser
if (!navigator.geolocation) {
reject(new Error("Geolocation is not supported by your browser"));
return;
}
// Default options if none provided
const geolocationOptions = options || {
enableHighAccuracy: true,
timeout: 5000,
maximumAge: 0,
};
// Call the geolocation API
navigator.geolocation.getCurrentPosition(
(position) => resolve(position),
(error) => reject(error),
geolocationOptions,
);
});
}
return {
get,
};
});

16
ts/type/map.ts Normal file
View file

@ -0,0 +1,16 @@
import maplibregl from "maplibre-gl";
import type { Location } from "@/types";
export interface Camera {
location: Location;
zoom: number;
}
export type MoveEndEventInternal = maplibregl.MapLibreEvent<
| maplibregl.MapMouseEvent
| maplibregl.MapTouchEvent
| maplibregl.MapWheelEvent
| undefined
> & {
isInternalUpdate: boolean;
};