UNPKG

3.05 kBPlain TextView Raw
1import {Injectable, NgZone} from '@angular/core';
2import {Observable} from 'rxjs/Observable';
3import {Observer} from 'rxjs/Observer';
4
5import {SebmGoogleMapMarker} from './../../directives/google-map-marker';
6
7import {GoogleMapsAPIWrapper} from './../google-maps-api-wrapper';
8import {Marker} from './../google-maps-types';
9
10@Injectable()
11export class MarkerManager {
12 private _markers: Map<SebmGoogleMapMarker, Promise<Marker>> =
13 new Map<SebmGoogleMapMarker, Promise<Marker>>();
14
15 constructor(private _mapsWrapper: GoogleMapsAPIWrapper, private _zone: NgZone) {}
16
17 deleteMarker(marker: SebmGoogleMapMarker): Promise<void> {
18 const m = this._markers.get(marker);
19 if (m == null) {
20 // marker already deleted
21 return Promise.resolve();
22 }
23 return m.then((m: Marker) => {
24 return this._zone.run(() => {
25 m.setMap(null);
26 this._markers.delete(marker);
27 });
28 });
29 }
30
31 updateMarkerPosition(marker: SebmGoogleMapMarker): Promise<void> {
32 return this._markers.get(marker).then(
33 (m: Marker) => m.setPosition({lat: marker.latitude, lng: marker.longitude}));
34 }
35
36 updateTitle(marker: SebmGoogleMapMarker): Promise<void> {
37 return this._markers.get(marker).then((m: Marker) => m.setTitle(marker.title));
38 }
39
40 updateLabel(marker: SebmGoogleMapMarker): Promise<void> {
41 return this._markers.get(marker).then((m: Marker) => { m.setLabel(marker.label); });
42 }
43
44 updateDraggable(marker: SebmGoogleMapMarker): Promise<void> {
45 return this._markers.get(marker).then((m: Marker) => m.setDraggable(marker.draggable));
46 }
47
48 updateIcon(marker: SebmGoogleMapMarker): Promise<void> {
49 return this._markers.get(marker).then((m: Marker) => m.setIcon(marker.iconUrl));
50 }
51
52 updateOpacity(marker: SebmGoogleMapMarker): Promise<void> {
53 return this._markers.get(marker).then((m: Marker) => m.setOpacity(marker.opacity));
54 }
55
56 updateVisible(marker: SebmGoogleMapMarker): Promise<void> {
57 return this._markers.get(marker).then((m: Marker) => m.setVisible(marker.visible));
58 }
59
60 updateZIndex(marker: SebmGoogleMapMarker): Promise<void> {
61 return this._markers.get(marker).then((m: Marker) => m.setZIndex(marker.zIndex));
62 }
63
64 addMarker(marker: SebmGoogleMapMarker) {
65 const markerPromise = this._mapsWrapper.createMarker({
66 position: {lat: marker.latitude, lng: marker.longitude},
67 label: marker.label,
68 draggable: marker.draggable,
69 icon: marker.iconUrl,
70 opacity: marker.opacity,
71 visible: marker.visible,
72 zIndex: marker.zIndex,
73 title: marker.title
74 });
75 this._markers.set(marker, markerPromise);
76 }
77
78 getNativeMarker(marker: SebmGoogleMapMarker): Promise<Marker> {
79 return this._markers.get(marker);
80 }
81
82 createEventObservable<T>(eventName: string, marker: SebmGoogleMapMarker): Observable<T> {
83 return Observable.create((observer: Observer<T>) => {
84 this._markers.get(marker).then((m: Marker) => {
85 m.addListener(eventName, (e: T) => this._zone.run(() => observer.next(e)));
86 });
87 });
88 }
89}