63 lines
2.6 KiB
TypeScript
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}
|
|
});
|
|
});
|
|
}
|
|
}
|