diff --git a/assets/icons/mosque.png b/assets/icons/mosque.png deleted file mode 100644 index 6d736d7..0000000 Binary files a/assets/icons/mosque.png and /dev/null differ diff --git a/assets/icons/mosque.svg b/assets/icons/mosque.svg new file mode 100644 index 0000000..2eded13 --- /dev/null +++ b/assets/icons/mosque.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/core/api.dart b/lib/core/api.dart index 9e66b0b..8df4e3b 100644 --- a/lib/core/api.dart +++ b/lib/core/api.dart @@ -102,7 +102,7 @@ class API { return widgetsConfigModel; } - static Future getWeatherDetailsFromServer(String cityId, {required Function(dynamic) onFailure}) async { + static Future getWeatherDetailsFromServer(String cityId, {required Function(dynamic) onFailure}) async { final body = {"cityID": cityId}; WeathersWidgetModel weathersWidgetModel = WeathersWidgetModel(); await BaseAppClient.post(_weatherForecastGetBy5Days, @@ -116,21 +116,23 @@ class API { return weathersWidgetModel; } - static Future> getPrayerDetailsFromServer({ + static Future getPrayerDetailsFromServer({ required double latitude, required double longitude, required Function(dynamic) onFailure, }) async { final body = {"latitude": latitude, "longitude": longitude}; + + PrayersWidgetModel currentPrayersWidgetModel = PrayersWidgetModel(); await BaseAppClient.post(_prayerTimeToday, body: body, onSuccess: (response, status) { if (status == 200 && response["data"] != null) { - List prayersWidgetModel = (response["data"] as List).map((e) => PrayersWidgetModel.fromJson(e)).toList(); - return prayersWidgetModel; + final prayersWidgetModel = (response["data"] as List).map((e) => PrayersWidgetModel.fromJson(e)).toList().first; + currentPrayersWidgetModel = prayersWidgetModel; } }, onFailure: (error, status) => log("error: ${error.toString()}")); - return []; + return currentPrayersWidgetModel; } } diff --git a/lib/core/config/config.dart b/lib/core/config/config.dart index 6556230..55addbe 100644 --- a/lib/core/config/config.dart +++ b/lib/core/config/config.dart @@ -37,7 +37,7 @@ class AppGlobal { static String vaccinationIcon = "assets/images/vaccination_icon.svg"; //Widgets - static String mosqueIcon = "assets/icons/mosque.png"; + static String mosqueIcon = "assets/icons/mosque.svg"; static String weatherIcon = "assets/icons/weather.svg"; static String cloudIcon = "assets/icons/cloudy.svg"; diff --git a/lib/core/response_models/prayers_widget_model.dart b/lib/core/response_models/prayers_widget_model.dart index c985644..84f8a70 100644 --- a/lib/core/response_models/prayers_widget_model.dart +++ b/lib/core/response_models/prayers_widget_model.dart @@ -1,11 +1,13 @@ +import 'package:intl/intl.dart'; + class PrayersWidgetModel { - String? fajr; + int? fajr; String? sunrise; - String? dhuhr; - String? asr; + int? dhuhr; + int? asr; String? sunset; - String? maghrib; - String? isha; + int? maghrib; + int? isha; String? imsak; String? midnight; String? firstthird; @@ -15,13 +17,13 @@ class PrayersWidgetModel { PrayersWidgetModel({this.fajr, this.sunrise, this.dhuhr, this.asr, this.sunset, this.maghrib, this.isha, this.imsak, this.midnight, this.firstthird, this.lastthird, this.dateFor}); PrayersWidgetModel.fromJson(Map json) { - fajr = json['fajr']; + fajr = dateTimeConversion(json['dateFor'], json['fajr']); sunrise = json['sunrise']; - dhuhr = json['dhuhr']; - asr = json['asr']; + dhuhr = dateTimeConversion(json['dateFor'], json['dhuhr']); + asr = dateTimeConversion(json['dateFor'], json['asr']); sunset = json['sunset']; - maghrib = json['maghrib']; - isha = json['isha']; + maghrib = dateTimeConversion(json['dateFor'], json['maghrib']); + isha = dateTimeConversion(json['dateFor'], json['isha']); imsak = json['imsak']; midnight = json['midnight']; firstthird = json['firstthird']; @@ -29,6 +31,10 @@ class PrayersWidgetModel { dateFor = json['dateFor']; } + static dateTimeConversion(String date, String time) { + return DateFormat('DD MMM yyyy hh:mm').parse("$date $time").millisecondsSinceEpoch; + } + Map toJson() { final Map data = {}; data['fajr'] = fajr; @@ -45,4 +51,9 @@ class PrayersWidgetModel { data['dateFor'] = dateFor; return data; } + + @override + String toString() { + return 'PrayersWidgetModel{fajr: $fajr, sunrise: $sunrise, dhuhr: $dhuhr, asr: $asr, sunset: $sunset, maghrib: $maghrib, isha: $isha, imsak: $imsak, midnight: $midnight, firstthird: $firstthird, lastthird: $lastthird, dateFor: $dateFor}'; + } } diff --git a/lib/header/app_header.dart b/lib/header/app_header.dart index 0ba8bcd..b2f1518 100644 --- a/lib/header/app_header.dart +++ b/lib/header/app_header.dart @@ -10,49 +10,58 @@ import 'package:queuing_system/widget/data_display/app_texts_widget.dart'; class AppHeader extends StatelessWidget with PreferredSizeWidget { const AppHeader({Key? key}) : super(key: key); - Widget getWeatherWidget(AppProvider appProvider) { - if (appProvider.currentWeathersWidgetModel.maxTemp == null || appProvider.currentWeathersWidgetModel.minTemp == null || appProvider.currentWeathersWidgetModel.iconPhrase == null) { - return const SizedBox.shrink(); - } - return Row( - children: [ - SvgPicture.asset( - AppGlobal.weatherIcon, - height: SizeConfig.getHeightMultiplier() * 2.5, - color: Colors.white, - ), - const SizedBox(width: 10), - Padding( - padding: const EdgeInsets.only(top: 15), - child: AppText( - "Max: ${appProvider.currentWeathersWidgetModel.maxTemp}°C , Min: ${appProvider.currentWeathersWidgetModel.minTemp}°C", + getWeatherIcon() {} + + Widget getWeatherWidget() { + return Consumer(builder: (BuildContext context, AppProvider appProvider, Widget? child) { + if (appProvider.currentWeathersWidgetModel.maxTemp == null || appProvider.currentWeathersWidgetModel.minTemp == null || appProvider.currentWeathersWidgetModel.iconPhrase == null) { + return const SizedBox.shrink(); + } + return Row( + children: [ + SvgPicture.asset( + AppGlobal.weatherIcon, + height: SizeConfig.getHeightMultiplier() * 2.5, color: Colors.white, - fontSize: SizeConfig.getHeightMultiplier() * 1.3, ), - ), - ], - ); + const SizedBox(width: 10), + Padding( + padding: const EdgeInsets.only(top: 15), + child: AppText( + "Max: ${appProvider.currentWeathersWidgetModel.maxTemp}°C , Min: ${appProvider.currentWeathersWidgetModel.minTemp}°C", + color: Colors.white, + fontSize: SizeConfig.getHeightMultiplier() * 1.3, + ), + ), + ], + ); + }); } - Widget getPrayerWidget(AppProvider appProvider) { - return Row( - children: [ - Image.asset( - AppGlobal.mosqueIcon, - height: SizeConfig.getHeightMultiplier() * 2.5, - color: Colors.white, - ), - const SizedBox(width: 10), - Padding( - padding: const EdgeInsets.only(top: 15), - child: AppText( - "Next Prayer: Dhuhr (11:49am)", + Widget getPrayerWidget() { + return Consumer(builder: (BuildContext context, AppProvider appProvider, Widget? child) { + if (appProvider.nextPrayerToShowWithTime.isEmpty) { + return const SizedBox.shrink(); + } + return Row( + children: [ + SvgPicture.asset( + AppGlobal.mosqueIcon, + height: SizeConfig.getHeightMultiplier() * 2.5, color: Colors.white, - fontSize: SizeConfig.getHeightMultiplier() * 1.3, ), - ), - ], - ); + const SizedBox(width: 10), + Padding( + padding: const EdgeInsets.only(top: 15), + child: AppText( + "Next Prayer: ${appProvider.nextPrayerToShowWithTime}", + color: Colors.white, + fontSize: SizeConfig.getHeightMultiplier() * 1.3, + ), + ), + ], + ); + }); } @override @@ -84,8 +93,8 @@ class AppHeader extends StatelessWidget with PreferredSizeWidget { color: Colors.white, ), ), - getPrayerWidget(appProvider), - getWeatherWidget(appProvider), + getPrayerWidget(), + getWeatherWidget(), SvgPicture.asset( "assets/images/hmglogo.svg", height: Utils.getHeight() * 0.5, diff --git a/lib/home/app_provider.dart b/lib/home/app_provider.dart index 7606cf5..ac3a8a4 100644 --- a/lib/home/app_provider.dart +++ b/lib/home/app_provider.dart @@ -5,6 +5,7 @@ import 'dart:io'; import 'package:connectivity/connectivity.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_tts/flutter_tts.dart'; +import 'package:intl/intl.dart'; import 'package:just_audio/just_audio.dart'; import 'package:queuing_system/core/api.dart'; import 'package:queuing_system/core/response_models/call_config_model.dart'; @@ -99,23 +100,55 @@ class AppProvider extends ChangeNotifier { } } - PrayersWidgetModel nextPrayerToShow = PrayersWidgetModel(); - - Future getTheNextPrayerToShow() async { + String nextPrayerToShowWithTime = ''; + void getNextPrayerToShow() { + log("Checking Namaz time!"); + final current = DateTime.now(); + if (DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.fajr!).isAfter(current)) { + final namazTime = DateFormat('hh:mm a').format(DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.fajr!)); + nextPrayerToShowWithTime = "Fajr ($namazTime)"; + notifyListeners(); + return; + } + if (DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.dhuhr!).isAfter(current)) { + final namazTime = DateFormat('hh:mm a').format(DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.dhuhr!)); + nextPrayerToShowWithTime = "Dhuhr ($namazTime)"; + notifyListeners(); + return; + } + if (DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.asr!).isAfter(current)) { + final namazTime = DateFormat('hh:mm a').format(DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.asr!)); + nextPrayerToShowWithTime = "Asar ($namazTime)"; + notifyListeners(); + return; + } + if (DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.maghrib!).isAfter(current)) { + final namazTime = DateFormat('hh:mm a').format(DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.maghrib!)); + nextPrayerToShowWithTime = "Maghrib ($namazTime)"; + notifyListeners(); + return; + } + if (DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.isha!).isAfter(current)) { + final namazTime = DateFormat('hh:mm a').format(DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.isha!)); + nextPrayerToShowWithTime = "Isha ($namazTime)"; + notifyListeners(); + return; + } } - List currentPrayersWidgetModel = []; + PrayersWidgetModel currentPrayersWidgetModel = PrayersWidgetModel(); Future getPrayerDetailsFromServer() async { - List prayersWidgetModel = await API.getPrayerDetailsFromServer( + PrayersWidgetModel? prayersWidgetModel = await API.getPrayerDetailsFromServer( latitude: currentWidgetsConfigModel!.projectLatitude ?? 0, longitude: currentWidgetsConfigModel!.projectLongitude ?? 0, onFailure: (error) => log("Api call failed with this error: ${error.toString()}")); - if (prayersWidgetModel.isNotEmpty) { + if (prayersWidgetModel != null) { currentPrayersWidgetModel = prayersWidgetModel; - log("I got this data: ${prayersWidgetModel.toString()}"); + log("I got this data from Prayers: ${prayersWidgetModel.toString()}"); + getNextPrayerToShow(); notifyListeners(); } } @@ -143,8 +176,8 @@ class AppProvider extends ChangeNotifier { } DateTime current = DateTime.now(); - Stream timer = Stream.periodic(const Duration(hours: 1), (i) { - current = current.add(const Duration(hours: 1)); + Stream timer = Stream.periodic(const Duration(minutes: 1), (i) { + current = current.add(const Duration(minutes: 1)); return current; }); @@ -162,6 +195,7 @@ class AppProvider extends ChangeNotifier { await getPrayerDetailsFromServer(); } } + getNextPrayerToShow(); }); } diff --git a/lib/home/home_screen.dart b/lib/home/home_screen.dart index b39fb28..6b936d3 100644 --- a/lib/home/home_screen.dart +++ b/lib/home/home_screen.dart @@ -1,4 +1,3 @@ - import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:queuing_system/core/base/app_scaffold_widget.dart'; @@ -15,6 +14,7 @@ class MyHomePage extends StatelessWidget { @override Widget build(BuildContext context) { final appProvider = context.watch(); + return AppScaffold( appProvider: appProvider, appBar: AppHeader(), diff --git a/pubspec.lock b/pubspec.lock index f396328..ffbeefe 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -200,6 +200,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.2" + intl: + dependency: "direct main" + description: + name: intl + sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + url: "https://pub.dev" + source: hosted + version: "0.18.1" js: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 3d20df2..a7e65a1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -45,6 +45,7 @@ dependencies: shared_preferences: ^2.2.1 #signalr core signalr_core: ^1.1.1 + intl: ^0.18.1