homefront/src/app/weather/weather.service.ts

63 lines
2.6 KiB
TypeScript

import {Injectable} from '@angular/core';
import {HttpClient} from '@angular/common/http';
import {Subscription, timer} from 'rxjs';
import {environment} from '../../environments/environment';
import {Weather} from './weather';
import {WeatherIcons} from './weatherIcons';
@Injectable({
providedIn: 'root'
})
export class WeatherService {
locationKey: string;
metric = true;
sub: Subscription;
weather: Weather[] = [];
get icon() {
if(!this.weather.length) return '';
return this.weather[0].icon;
}
constructor(private http: HttpClient) {
this.search('London ON');
}
async search(text: string) {
this.locationKey = (await this.http.get(`https://dataservice.accuweather.com/locations/v1/search?apikey=${environment.accuWeather}&q=${text}`).toPromise())[0].Key;
this.update();
}
async update() {
if(this.sub) {
this.sub.unsubscribe();
this.sub = null;
}
this.sub = timer(0, 1800000).subscribe(async () => {
let temp: any = await this.http.get(`https://dataservice.accuweather.com/forecasts/v1/daily/5day/${this.locationKey}?apikey=${environment.accuWeather}&metric=${this.metric}&details=true`).toPromise();
this.weather = temp['DailyForecasts'].map(forecast => ({
cloudCover: forecast.Day.CloudCover / 100,
date: new Date(forecast.Date),
high: forecast.Temperature.Maximum.Value,
icon: WeatherIcons[forecast.Day.Icon],
low: forecast.Temperature.Minimum.Value,
phrase: forecast.Day.ShortPhrase,
pop: forecast.Day.PrecipitationProbability / 100,
sunrise: new Date(forecast.Sun.Rise),
sunset: new Date(forecast.Sun.Set),
}));
temp = (await this.http.get(`https://dataservice.accuweather.com/currentconditions/v1/${this.locationKey}?apikey=${environment.accuWeather}&details=true`).toPromise())[0];
Object.assign(this.weather[0], {
cloudCover: temp.CloudCover / 100,
current: temp.Temperature[this.metric ? 'Metric' : 'Imperial'].Value,
feelsLike: temp.RealFeelTemperature[this.metric ? 'Metric' : 'Imperial'].Value,
humidity: temp.RelativeHumidity,
icon: WeatherIcons[temp.WeatherIcon],
UVIndex: temp.UVIndex,
wind: {direction: temp.Wind.Direction.Degrees, speed: temp.Wind.Speed[this.metric ? 'Metric' : 'Imperial'].Value, gusts: temp.WindGust.Speed[this.metric ? 'Metric' : 'Imperial'].Value}
});
});
}
}