Files
gmTouringMiniApp/src/stores/modules/map.ts
T

49 lines
1.3 KiB
TypeScript
Raw Normal View History

2026-07-30 16:04:34 +08:00
import type { GeoPoint, MapViewport } from '@/domain/poi'
import { defineStore } from 'pinia'
export const DEFAULT_GUANGMING_VIEWPORT: MapViewport = {
longitude: 113.935,
latitude: 22.748,
scale: 11,
}
interface MapSessionState {
categoryCode: string | null
selectedPoiId: string | null
viewport: MapViewport
}
function isFinitePoint(point: GeoPoint): boolean {
return Number.isFinite(point.longitude) && Number.isFinite(point.latitude)
}
export const useMapStore = defineStore('map-session', {
state: (): MapSessionState => ({
categoryCode: null,
selectedPoiId: null,
viewport: { ...DEFAULT_GUANGMING_VIEWPORT },
}),
actions: {
setCategory(categoryCode: string | null) {
this.categoryCode = categoryCode
},
selectPoi(poiId: string | null) {
this.selectedPoiId = poiId
},
updateViewport(viewport: MapViewport) {
if (!isFinitePoint(viewport) || !Number.isFinite(viewport.scale) || viewport.scale <= 0)
return
this.viewport = { ...viewport }
},
resetViewport(viewport: MapViewport = DEFAULT_GUANGMING_VIEWPORT) {
this.viewport = { ...viewport }
},
resetSession(viewport: MapViewport = DEFAULT_GUANGMING_VIEWPORT) {
this.categoryCode = null
this.selectedPoiId = null
this.viewport = { ...viewport }
},
},
})