Rain/lib/app/api/api.dart

167 lines
8 KiB
Dart
Raw Normal View History

2023-06-17 20:57:57 +03:00
import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:rain/app/api/city.dart';
2023-08-30 19:48:25 +03:00
import 'package:rain/app/api/weather.dart';
2023-06-17 20:57:57 +03:00
import 'package:rain/app/data/weather.dart';
import 'package:rain/main.dart';
class WeatherAPI {
2023-12-03 16:19:42 +03:00
final Dio dio = Dio()
..options.baseUrl = 'https://api.open-meteo.com/v1/forecast?';
2023-06-17 20:57:57 +03:00
final Dio dioLocation = Dio();
Future<MainWeatherCache> getWeatherData(double? lat, double? lon) async {
2023-08-30 19:48:25 +03:00
String url =
'latitude=$lat&longitude=$lon&hourly=temperature_2m,relativehumidity_2m,apparent_temperature,precipitation,rain,weathercode,surface_pressure,visibility,evapotranspiration,windspeed_10m,winddirection_10m,windgusts_10m,cloudcover,uv_index,dewpoint_2m,precipitation_probability,shortwave_radiation&daily=weathercode,temperature_2m_max,temperature_2m_min,apparent_temperature_max,apparent_temperature_min,sunrise,sunset,precipitation_sum,precipitation_probability_max,windspeed_10m_max,windgusts_10m_max,uv_index_max,rain_sum,winddirection_10m_dominant&forecast_days=12&timezone=auto';
2023-08-30 19:48:25 +03:00
String urlWeather;
2023-06-17 20:57:57 +03:00
settings.measurements == 'imperial' && settings.degrees == 'fahrenheit'
2023-12-03 16:19:42 +03:00
? urlWeather =
'$url&temperature_unit=fahrenheit&windspeed_unit=mph&precipitation_unit=inch'
2023-06-17 20:57:57 +03:00
: settings.measurements == 'imperial'
2023-08-30 19:48:25 +03:00
? urlWeather = '$url&windspeed_unit=mph&precipitation_unit=inch'
2023-06-17 20:57:57 +03:00
: settings.degrees == 'fahrenheit'
2023-08-30 19:48:25 +03:00
? urlWeather = '$url&temperature_unit=fahrenheit'
: urlWeather = url;
2023-06-17 20:57:57 +03:00
try {
2023-08-30 19:48:25 +03:00
Response response = await dio.get(urlWeather);
WeatherDataApi weatherData = WeatherDataApi.fromJson(response.data);
2023-06-17 20:57:57 +03:00
return MainWeatherCache(
2023-08-30 19:48:25 +03:00
time: weatherData.hourly.time,
temperature2M: weatherData.hourly.temperature2M,
relativehumidity2M: weatherData.hourly.relativeHumidity2M,
2023-08-30 19:48:25 +03:00
apparentTemperature: weatherData.hourly.apparentTemperature,
precipitation: weatherData.hourly.precipitation,
rain: weatherData.hourly.rain,
weathercode: weatherData.hourly.weatherCode,
2023-08-30 19:48:25 +03:00
surfacePressure: weatherData.hourly.surfacePressure,
visibility: weatherData.hourly.visibility,
evapotranspiration: weatherData.hourly.evapotranspiration,
windspeed10M: weatherData.hourly.windSpeed10M,
winddirection10M: weatherData.hourly.windDirection10M,
windgusts10M: weatherData.hourly.windGusts10M,
cloudcover: weatherData.hourly.cloudCover,
2023-08-30 19:48:25 +03:00
uvIndex: weatherData.hourly.uvIndex,
dewpoint2M: weatherData.hourly.dewpoint2M,
precipitationProbability: weatherData.hourly.precipitationProbability,
shortwaveRadiation: weatherData.hourly.shortwaveRadiation,
2023-08-30 19:48:25 +03:00
timeDaily: weatherData.daily.time,
2023-10-16 12:20:41 +05:30
weathercodeDaily: weatherData.daily.weatherCode,
2023-08-30 19:48:25 +03:00
temperature2MMax: weatherData.daily.temperature2MMax,
temperature2MMin: weatherData.daily.temperature2MMin,
apparentTemperatureMax: weatherData.daily.apparentTemperatureMax,
apparentTemperatureMin: weatherData.daily.apparentTemperatureMin,
sunrise: weatherData.daily.sunrise,
sunset: weatherData.daily.sunset,
precipitationSum: weatherData.daily.precipitationSum,
2023-12-03 16:19:42 +03:00
precipitationProbabilityMax:
weatherData.daily.precipitationProbabilityMax,
2023-10-16 12:20:41 +05:30
windspeed10MMax: weatherData.daily.windSpeed10MMax,
windgusts10MMax: weatherData.daily.windGusts10MMax,
2023-08-30 19:48:25 +03:00
uvIndexMax: weatherData.daily.uvIndexMax,
rainSum: weatherData.daily.rainSum,
2023-10-16 12:20:41 +05:30
winddirection10MDominant: weatherData.daily.windDirection10MDominant,
2023-08-30 19:48:25 +03:00
timezone: weatherData.timezone,
2023-06-17 20:57:57 +03:00
timestamp: DateTime.now(),
);
} on DioException catch (e) {
if (kDebugMode) {
print(e);
}
rethrow;
}
}
2023-12-03 16:19:42 +03:00
Future<WeatherCard> getWeatherCard(double? lat, double? lon, String city,
String district, String timezone) async {
2023-08-30 19:48:25 +03:00
String url =
'latitude=$lat&longitude=$lon&hourly=temperature_2m,relativehumidity_2m,apparent_temperature,precipitation,rain,weathercode,surface_pressure,visibility,evapotranspiration,windspeed_10m,winddirection_10m,windgusts_10m,cloudcover,uv_index,dewpoint_2m,precipitation_probability,shortwave_radiation&daily=weathercode,temperature_2m_max,temperature_2m_min,apparent_temperature_max,apparent_temperature_min,sunrise,sunset,precipitation_sum,precipitation_probability_max,windspeed_10m_max,windgusts_10m_max,uv_index_max,rain_sum,winddirection_10m_dominant&forecast_days=12&timezone=auto';
2023-08-30 19:48:25 +03:00
String urlWeather;
2023-06-17 20:57:57 +03:00
settings.measurements == 'imperial' && settings.degrees == 'fahrenheit'
2023-12-03 16:19:42 +03:00
? urlWeather =
'$url&temperature_unit=fahrenheit&windspeed_unit=mph&precipitation_unit=inch'
2023-06-17 20:57:57 +03:00
: settings.measurements == 'imperial'
2023-08-30 19:48:25 +03:00
? urlWeather = '$url&windspeed_unit=mph&precipitation_unit=inch'
2023-06-17 20:57:57 +03:00
: settings.degrees == 'fahrenheit'
2023-08-30 19:48:25 +03:00
? urlWeather = '$url&temperature_unit=fahrenheit'
: urlWeather = url;
2023-06-17 20:57:57 +03:00
try {
2023-08-30 19:48:25 +03:00
Response response = await dio.get(urlWeather);
WeatherDataApi weatherData = WeatherDataApi.fromJson(response.data);
2023-06-17 20:57:57 +03:00
return WeatherCard(
2023-08-30 19:48:25 +03:00
time: weatherData.hourly.time,
temperature2M: weatherData.hourly.temperature2M,
relativehumidity2M: weatherData.hourly.relativeHumidity2M,
2023-08-30 19:48:25 +03:00
apparentTemperature: weatherData.hourly.apparentTemperature,
precipitation: weatherData.hourly.precipitation,
rain: weatherData.hourly.rain,
weathercode: weatherData.hourly.weatherCode,
2023-08-30 19:48:25 +03:00
surfacePressure: weatherData.hourly.surfacePressure,
visibility: weatherData.hourly.visibility,
evapotranspiration: weatherData.hourly.evapotranspiration,
windspeed10M: weatherData.hourly.windSpeed10M,
winddirection10M: weatherData.hourly.windDirection10M,
windgusts10M: weatherData.hourly.windGusts10M,
cloudcover: weatherData.hourly.cloudCover,
2023-08-30 19:48:25 +03:00
uvIndex: weatherData.hourly.uvIndex,
dewpoint2M: weatherData.hourly.dewpoint2M,
precipitationProbability: weatherData.hourly.precipitationProbability,
shortwaveRadiation: weatherData.hourly.shortwaveRadiation,
2023-08-30 19:48:25 +03:00
timeDaily: weatherData.daily.time,
2023-10-16 12:20:41 +05:30
weathercodeDaily: weatherData.daily.weatherCode,
2023-08-30 19:48:25 +03:00
temperature2MMax: weatherData.daily.temperature2MMax,
temperature2MMin: weatherData.daily.temperature2MMin,
apparentTemperatureMax: weatherData.daily.apparentTemperatureMax,
apparentTemperatureMin: weatherData.daily.apparentTemperatureMin,
sunrise: weatherData.daily.sunrise,
sunset: weatherData.daily.sunset,
precipitationSum: weatherData.daily.precipitationSum,
2023-12-03 16:19:42 +03:00
precipitationProbabilityMax:
weatherData.daily.precipitationProbabilityMax,
2023-10-16 12:20:41 +05:30
windspeed10MMax: weatherData.daily.windSpeed10MMax,
windgusts10MMax: weatherData.daily.windGusts10MMax,
2023-08-30 19:48:25 +03:00
uvIndexMax: weatherData.daily.uvIndexMax,
rainSum: weatherData.daily.rainSum,
2023-10-16 12:20:41 +05:30
winddirection10MDominant: weatherData.daily.windDirection10MDominant,
2023-06-17 20:57:57 +03:00
lat: lat,
lon: lon,
city: city,
district: district,
timezone: timezone,
timestamp: DateTime.now(),
);
} on DioException catch (e) {
if (kDebugMode) {
print(e);
}
rethrow;
}
}
2023-09-09 21:15:47 +03:00
Future<Iterable<Result>> getCity(String query, Locale? locale) async {
final url =
'https://geocoding-api.open-meteo.com/v1/search?name=$query&count=5&language=${locale?.languageCode}&format=json';
try {
Response response = await dioLocation.get(url);
if (response.statusCode == 200) {
CityApi cityData = CityApi.fromJson(response.data);
return cityData.results.map(
(e) => Result(
admin1: e.admin1,
name: e.name,
latitude: e.latitude,
longitude: e.longitude,
),
);
} else {
throw Exception('Failed to load suggestions');
}
} on DioException catch (e) {
if (kDebugMode) {
print(e);
}
rethrow;
}
}
2023-06-17 20:57:57 +03:00
}