-
Notifications
You must be signed in to change notification settings - Fork 0
/
Map.ts
77 lines (66 loc) · 1.67 KB
/
Map.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/**
* @project MyGPService v4
* @author Žan Kafol on 7.1.2019
*/
import Vue from 'vue'
import Component from 'vue-class-component'
import {GoogleMap} from './model/GoogleMap'
import {MapInterface, MapPosition} from './model/MapInterface'
import {Emit, Prop, Provide, Watch} from 'vue-property-decorator'
@Component
export default class Map extends Vue {
public map: MapInterface<any>
public ready = false
@Prop({default: false})
public fitBounds: MapPosition[]
@Prop({default: 'roadmap'})
public mapType: string
@Prop({default: () => {return {lat: 45, lon: 15, zoom: 8}}})
public center: MapPosition
@Watch('mapType')
public onLayerChanged(newLayer: string) {
this.map.setMapType(newLayer)
}
@Watch('center', {deep: true})
@Emit('centerChanged')
public onCenterChanged(newCenter: MapPosition) {
if(this.ready && newCenter) {
this.map.panTo(newCenter)
if(newCenter.zoom) {
this.map.setZoom(newCenter.zoom)
}
return newCenter
}
}
@Watch('fitBounds')
public onBoundsChanged(bounds: MapPosition[]) {
if(this.ready && bounds) {
this.map.fitBounds(bounds)
}
}
@Provide()
public getMap(): MapInterface<any> {
if(this.ready) {
return this.map
} else {
console.error('Map not ready')
}
}
@Emit('drag')
public onDrag () {
return this.center
}
@Emit('load')
public mounted () {
// @ts-ignore
this.map = new GoogleMap(process.env.GOOGLE_API_KEY)
this.map.onDrag(this.onDrag)
return this.map.init(this.$refs.map, {
lat: this.center.lat,
lon: this.center.lon, zoom:
this.center.zoom
}).then(() => {
this.ready = true
})
}
}