forked from zhouruizhe/gmTouringMiniApp
49 lines
1.3 KiB
TypeScript
49 lines
1.3 KiB
TypeScript
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 }
|
||
|
|
},
|
||
|
|
},
|
||
|
|
})
|