home.page.ts 11 KB
Newer Older
1
import { Component, OnInit, ViewChild, ElementRef, OnDestroy } from '@angular/core';
Rron Jahja's avatar
Rron Jahja committed
2
import { Geolocation } from '@ionic-native/geolocation/ngx';
3
4
5
import { RestService } from '../rest.service';
import { Observable } from 'rxjs';
import { HttpClient, HttpHeaders } from '@angular/common/http';
6
import { Storage } from '@ionic/storage';
7
import { ToastService } from '../services/toast.service';
8
import { Router } from '@angular/router';
9
10
import { LocationService } from '../services/location.service';
import { LoadingService } from '../services/loading.service';
11
12
import { DistanceService } from '../services/distance.service';

13

Rron Jahja's avatar
Rron Jahja committed
14
declare var H: any;
15

Rron Jahja's avatar
Rron Jahja committed
16
17
18
19
20
@Component({
  selector: 'app-home',
  templateUrl: 'home.page.html',
  styleUrls: ['home.page.scss'],
})
21

22
export class HomePage implements OnInit, OnDestroy {
Rron Jahja's avatar
Rron Jahja committed
23
  private platform: any;
24
  private map: any;
25
  private defaultLayers: any;
26
  private locationsGroup: any;
27
  private currentUserPosition = { lat: 48.783480, lng: 9.180319 };
28

29
30
31
  bikes = [];
  bikeApi: Observable<any>;

32
  public isDetailsVisible = false;
33
  public selectedBike:any = { id: 0 };
34
  public distance="";
35
  public isBikeReserved = false;
36

37
38
  public currentLocationMarker: any;

39
40
  @ViewChild("mapElement", { static: false })
  public mapElement: ElementRef;
41

42
  constructor(private geolocation: Geolocation,
43
    private router: Router,
44
    public restService: RestService,
45
    public httpClient: HttpClient,
46
    private storage: Storage,
47
    private toastService: ToastService,
48
    public distanceService: DistanceService,
49
50
    public locationService: LocationService,
    public loadingService: LoadingService) {
51

Rron Jahja's avatar
Rron Jahja committed
52
    this.platform = new H.service.Platform({
53
54
      // Api key for HereMaps JS version 
      'apikey': ''
Rron Jahja's avatar
Rron Jahja committed
55
56
    });
  }
57

58
  ngOnInit() {
59
    
60
  }
61

62
  ngAfterViewInit() {
63
    window.addEventListener('resize', () => this.map.getViewPort().resize());
64
65
66
67
68
69
70
71
72
73
74
  }

  ionViewWillEnter() {
    this.currentUserPosition.lat = this.locationService.currentUserPosition.lat;
    this.currentUserPosition.lng = this.locationService.currentUserPosition.lng;
    this.initializeMap();
    if (this.currentLocationMarker) {
      this.currentLocationMarker.setGeometry({ lat: this.currentUserPosition.lat, lng: this.currentUserPosition.lng })
    } else {
      this.showUserLocationOnMap(this.currentUserPosition.lat, this.currentUserPosition.lng);
    }
75
    this.getBikesList();
76
77

    this.locationService.liveLocationSubject.subscribe((position) => {
78
      //console.log('got location inside home subscription');
79
80
81
82
83
84
85
86
      this.currentUserPosition.lat = position.lat;
      this.currentUserPosition.lng = position.lng;
      if (this.currentLocationMarker) {
        this.currentLocationMarker.setGeometry({ lat: this.currentUserPosition.lat, lng: this.currentUserPosition.lng })
      } else {
        this.showUserLocationOnMap(this.currentUserPosition.lat, this.currentUserPosition.lng);
      }
    });
87
88
  }

89
  initializeMap() {
90
    // Obtain the default map types from the platform object
91
    this.defaultLayers = this.platform.createDefaultLayers();
92
    this.map = new H.Map(
93
94
      this.mapElement.nativeElement,
      this.defaultLayers.raster.normal.map,
95
      {
96
        center: { lat: this.locationService.preiousUserPosition.lat, lng: this.locationService.preiousUserPosition.lng },
97
        zoom: 17,
98
99
100
        pixelRatio: window.devicePixelRatio || 1
      }
    );
101

102
    var behavior = new H.mapevents.Behavior(new H.mapevents.MapEvents(this.map));
103
    var ui = H.ui.UI.createDefault(this.map, this.defaultLayers);
104
    ui.removeControl("mapsettings");
105
106
    // create custom map settings (icons on map)
    var customMapSettings = new H.ui.MapSettingsControl({
107
108
109
110
111
112
113
114
115
116
      baseLayers: [
        {
          label: "3D", layer: this.defaultLayers.vector.normal.map
        }, {
          label: "Normal", layer: this.defaultLayers.raster.normal.map
        }, {
          label: "Satellite", layer: this.defaultLayers.raster.satellite.map
        }, {
          label: "Terrain", layer: this.defaultLayers.raster.terrain.map
        }
117
      ],
118
119
120
121
122
123
124
      layers: [
        {
          label: "layer.traffic", layer: this.defaultLayers.vector.normal.traffic
        },
        {
          label: "layer.incidents", layer: this.defaultLayers.vector.normal.trafficincidents
        }
125
126
      ]
    });
127
128
129
    ui.addControl("custom-mapsettings", customMapSettings);
    var mapSettings = ui.getControl('custom-mapsettings');
    var zoom = ui.getControl('zoom');
130
    mapSettings.setAlignment('top-right');
131
    zoom.setAlignment('right-top');
132

133
134
135
136
    this.map.getViewPort().setPadding(30, 30, 30, 30);

    // Listen for base layer change event (eg. from satellite to 3D)
    this.map.addEventListener('baselayerchange', (evt) => {
137
138
139
140
141
142
      let mapConfig = this.map.getBaseLayer().getProvider().getStyleInternal().getConfig();
      if (mapConfig === null || (mapConfig && mapConfig.sources && mapConfig.sources.omv)) {
        this.map.getViewModel().setLookAtData({ tilt: 60 });
      } else {
        this.map.getViewModel().setLookAtData({ tilt: 0 });
      }
143
    });
144

145
    // listen for map click event
146
    this.map.addEventListener('tap', (event) => {
147
      //console.log(event.type, event.currentPointer.type);
148
149
150
151
152
153
    });

    this.locationsGroup = new H.map.Group();
  }

  getBikesList() {
154
    this.loadingService.showLoader();
155
156
157
158
159
    this.storage.get('token').then((token) => {
      let url = 'http://193.196.52.237:8081/bikes' + '?lat=' + this.currentUserPosition.lat + '&lng=' + this.currentUserPosition.lng;
      const headers = new HttpHeaders().set("Authorization", "Bearer " + token);
      this.bikeApi = this.httpClient.get(url, { headers });
      this.bikeApi.subscribe((resp) => {
160
        //console.log("bikes response", resp);
161
162
163
164
165
166
        this.bikes = resp;
        for (let i = 0; i < this.bikes.length; i++) {
          this.bikes[i].distance = this.bikes[i].distance.toFixed(2);;
          this.reverseGeocode(this.platform, this.bikes[i].lat, this.bikes[i].lon, i);
        }
        this.showBikesOnMap();
167
        this.loadingService.hideLoader();
168
      }, (error) => {console.log(error)
169
        this.loadingService.hideLoader();
170
      });
171
172
173
174
    });
  }

  showBikesOnMap() {
175
    var img = ['../../../assets/images/100_percent.png', '../../../assets/images/75_percent.png', '../../../assets/images/50_percent.png', '../../../assets/images/25_percent.png', '../../../assets/images/0_percent.png'];
176
    for (let i = 0; i < this.bikes.length; i++) {
177
      if (this.bikes[i].batteryPercentage < 100 && this.bikes[i].batteryPercentage >= 75) {
178
179
        this.addMarker(Number(this.bikes[i].lat), Number(this.bikes[i].lon), img[0]);
      }
180
      else if (this.bikes[i].batteryPercentage < 75 && this.bikes[i].batteryPercentage >= 50) {
181
182
        this.addMarker(Number(this.bikes[i].lat), Number(this.bikes[i].lon), img[1]);
      }
183
      else if (this.bikes[i].batteryPercentage < 50 && this.bikes[i].batteryPercentage >= 25) {
184
        this.addMarker(Number(this.bikes[i].lat), Number(this.bikes[i].lon), img[2]);
185
      } else if (this.bikes[i].batteryPercentage < 25 && this.bikes[i].batteryPercentage >= 0) {
186
187
        this.addMarker(Number(this.bikes[i].lat), Number(this.bikes[i].lon), img[3]);
      }
188
    }
189

190
    //this.map.addObject(this.locationsGroup);
191
    this.setZoomLevelToPointersGroup();
Rron Jahja's avatar
Rron Jahja committed
192
  }
193

194
  //TODO change this logic
195
  getCurrentPosition() {
196
197
    this.map.setZoom(17);
    this.map.setCenter({ lat: this.currentUserPosition.lat, lng: this.currentUserPosition.lng });
198
  }
199

200
201
202
203
204
205
206
207
  setZoomLevelToPointersGroup() {
    this.map.getViewModel().setLookAtData({
      bounds: this.locationsGroup.getBoundingBox()
    });
  }

  showUserLocationOnMap(lat, lng) {
    let svgMarkup = '<svg width="24" height="24" ' +
208
209
      'xmlns="http://www.w3.org/2000/svg">' +
      '<circle cx="10" cy="10" r="10" ' +
210
      'fill="#007cff" stroke="white" stroke-width="2"  />' +
211
      '</svg>';
212
213
    let icon = new H.map.Icon(svgMarkup);
    //let icon = new H.map.Icon('../../../assets/images/current_location.png');
214
    // Create a marker using the previously instantiated icon:
215
    this.currentLocationMarker = new H.map.Marker({ lat: lat, lng: lng }, { icon: icon });
216
    // Add the marker to the map:
217
    this.locationsGroup.addObjects([this.currentLocationMarker]);
218
    this.map.addObject(this.locationsGroup);
219
220
221
222
    this.setZoomLevelToPointersGroup();

    //this.map.addObject(marker);
    //this.map.setCenter({ lat: lat, lng: lng });
Rron Jahja's avatar
Rron Jahja committed
223
  }
224

225
  addMarker(lat, lng, img) {
226
227
228
229
    var icon = new H.map.Icon(img);
    // Create a marker using the previously instantiated icon:
    var marker = new H.map.Marker({ lat: lat, lng: lng }, { icon: icon });
    // Add the marker to the map:
230
231
232
    //this.map.addObject(marker);

    this.locationsGroup.addObjects([marker]);
233
  }
234
235
  navigatetoBikeList() {
    this.isDetailsVisible = false;
236
    //this.ionViewWillEnter();
237
  }
238
239

  enable3DMaps() {
240
    this.map.setBaseLayer(this.defaultLayers.vector.normal.map);
241
  }
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256

  reverseGeocode(platform, lat, lng, index) {
    var prox = lat + ',' + lng + ',56';
    var geocoder = platform.getGeocodingService(),
      parameters = {
        prox: prox,
        mode: 'retrieveAddresses',
        maxresults: '1',
        gen: '9'
      };

    geocoder.reverseGeocode(parameters, result => {
      var streets = result.Response.View[0].Result[0].Location.Address.Street;
      var houseNumber = result.Response.View[0].Result[0].Location.Address.HouseNumber;
      var zipcode = result.Response.View[0].Result[0].Location.Address.PostalCode;
257

258
259
260
261
262
263
264
265
266
      this.bikes[index].address = streets;
      this.bikes[index].HouseNumber = houseNumber;
      this.bikes[index].PostalCode = zipcode;

    }, (error) => {
      alert(error);
    });
  }

267
  showBikeDetails(bike) {
268
    //console.log(bike);
269
    this.selectedBike = bike;
270
271
    this.distance= bike.distance;
    this.distanceService.setDistance(this.distance);
272
    this.isDetailsVisible = true;
273
274
    this.map.setCenter({ lat: bike.lat, lng: bike.lon });
    this.map.setZoom(17);
275
  }
276

277
  reserveBike() {
278
    //this.selectedBike=bikeS;
279
    this.loadingService.showLoader();
280
281
282
283
284
    this.storage.get('token').then((token) => {
      let url = 'http://193.196.52.237:8081/reservation' + '?bikeId=' + this.selectedBike.id;
      const headers = new HttpHeaders().set("Authorization", "Bearer " + token);
      this.bikeApi = this.httpClient.get(url, { headers });
      this.bikeApi.subscribe((resp) => {
285
        //console.log('my data: ', resp);
286
        this.isBikeReserved = true;
287
        this.toastService.showToast("Reservation Successful!");
288
        this.router.navigateByUrl('/myreservation');
289
        this.loadingService.hideLoader();
290
        this.isDetailsVisible = false;
291
      }, (error) => {
292
        //console.log(error);
293
        this.loadingService.hideLoader();
294
        this.toastService.showToast("Only one bike may be reserved or rented at a time");
295
        this.isDetailsVisible = false;
296
      });
297
298
    });
  }
299

300
  ngOnDestroy(){
301
    //this.locationService.liveLocationSubject.unsubscribe();
302
303
  }

304
305
  ionViewDidLeave(){
    if(this.mapElement) {
306
      //this.mapElement.nativeElement.remove();
307
308
309
310
311
    }
    // if(this.locationService.liveLocationSubject) {
    //   this.locationService.liveLocationSubject.unsubscribe();
    // }
  }
312
  
313

Rron Jahja's avatar
Rron Jahja committed
314
}