import 'dart:developer'; import 'package:flutter/cupertino.dart'; import 'package:hmg_qline/config/dependency_injection.dart'; import 'package:hmg_qline/constants/app_constants.dart'; import 'package:hmg_qline/models/generic_response_model.dart'; import 'package:hmg_qline/models/global_config_model.dart'; import 'package:hmg_qline/models/prayers_widget_model.dart'; import 'package:hmg_qline/models/rss_feed_model.dart'; import 'package:hmg_qline/models/weathers_widget_model.dart'; import 'package:hmg_qline/repositories/screen_details_repo.dart'; import 'package:hmg_qline/services/cache_service.dart'; import 'package:hmg_qline/services/connectivity_service.dart'; import 'package:hmg_qline/utilities/enums.dart'; import 'package:hmg_qline/utilities/extensions.dart'; import 'package:hmg_qline/view_models/queuing_view_model.dart'; class ScreenConfigViewModel extends ChangeNotifier { final ScreenDetailsRepo screenDetailsRepo; final CacheService cacheService; final ConnectivityService connectivityService; ScreenConfigViewModel({ required this.screenDetailsRepo, required this.cacheService, required this.connectivityService, }); Future initializeScreenConfigVM() async { await getGlobalConfigurationsByIP(); await getInfoWidgetsDetailsFromServer(); await getLastTimeUpdatedFromCache(); listenNetworkConnectivity(); getTheWidgetsConfigurationsEveryMidnight(); } Future waitForIPAndInitializeConfigVM() async { while (currentScreenIP == "") { await getCurrentScreenIP(); if (currentScreenIP != "") { initializeScreenConfigVM(); } else { await Future.delayed(const Duration(seconds: 2)); } } } bool isInternetConnected = true; updateIsInternetConnected(bool value) { isInternetConnected = value; notifyListeners(); } bool isHubConnected = true; updateIsHubConnected(bool value) { isHubConnected = value; notifyListeners(); } ViewState state = ViewState.idle; void updateViewState(ViewState viewState) { state = viewState; notifyListeners(); } KioskScreenStateEnums kioskScreenStateEnum = KioskScreenStateEnums.languageState; void updateKioskScreenState(KioskScreenStateEnums state) { kioskScreenStateEnum = state; notifyListeners(); } LanguageEnum currentSelectedKioskLanguage = LanguageEnum.english; void updateCurrentSelectedKioskLanguage(LanguageEnum value) { currentSelectedKioskLanguage = value; notifyListeners(); } updateCurrentScreenRotation(ScreenOrientationEnum value) { globalConfigurationsModel.orientationTypeEnum = value; notifyListeners(); } ScreenTypeEnum currentScreenTypeEnum = ScreenTypeEnum.waitingAreaScreen; updateCurrentScreenTypeEnum(ScreenTypeEnum value) { currentScreenTypeEnum = value; } QTypeEnum currentQTypeEnum = QTypeEnum.lab; updateCurrentQTypeEnum(QTypeEnum value) { currentQTypeEnum = value; } String currentScreenIP = ""; Future getCurrentScreenIP() async { if (useTestIP) { currentScreenIP = AppConstants.testIP; } else { currentScreenIP = await connectivityService.getCurrentScreenIP(); log("currentScreenIP: $currentScreenIP"); } } void listenNetworkConnectivity() { return connectivityService.subscribeToConnectivityChange(onInternetDisConnected: () { updateIsInternetConnected(false); updateIsHubConnected(false); }, onInternetConnected: () { updateIsInternetConnected(true); QueuingViewModel queuingViewModel = getIt.get(); queuingViewModel.startHubConnection(); }); } GlobalConfigurationsModel globalConfigurationsModel = GlobalConfigurationsModel(); Future getGlobalConfigurationsByIP() async { // TODO: TEST ONLY updateCurrentScreenTypeEnum(ScreenTypeEnum.kioskScreen); updateCurrentQTypeEnum(QTypeEnum.general); GlobalConfigurationsModel? response = await screenDetailsRepo.getGlobalScreenConfigurations(ipAddress: currentScreenIP); if (response == null) { log("response; ${response}"); return; } updateGlobalConfigurationsModel(value: response); // updateCurrentScreenTypeEnum(globalConfigurationsModel.screenTypeEnum); // updateCurrentQTypeEnum(globalConfigurationsModel.qTypeEnum); notifyListeners(); } void updateGlobalConfigurationsModel({required var value, bool needNotify = false, bool shouldUpdateNextPrayer = false}) { globalConfigurationsModel = value; if (needNotify) { notifyListeners(); } if (shouldUpdateNextPrayer) { getNextPrayerToShow(); } getInfoWidgetsDetailsFromServer(); } Future getInfoWidgetsDetailsFromServer() async { if (globalConfigurationsModel.isWeatherReq) { await getWeatherDetailsFromServer(); } if (globalConfigurationsModel.isPrayerTimeReq) { await getPrayerDetailsFromServer(); } if (globalConfigurationsModel.isRssFeedReq) { await getRssFeedDetailsFromServer(); } int currentDate = DateTime.now().millisecondsSinceEpoch; await cacheService.setLastTimeUpdatedInCache(lasTimeUpdated: currentDate.toString()); } RssFeedModel rssFeedModel = RssFeedModel(); Future getRssFeedDetailsFromServer() async { RssFeedModel? response = await screenDetailsRepo.getRssFeedDetailsByLanguageID(languageId: 0); if (response == null) { return; } rssFeedModel = response; notifyListeners(); } PrayersWidgetModel prayersWidgetModel = PrayersWidgetModel(); Future getPrayerDetailsFromServer() async { double testLatitude = 24.722136; double testLongitude = 46.774303; PrayersWidgetModel? response = await screenDetailsRepo.getPrayerDetailsByLatLong( latitude: globalConfigurationsModel.projectLatitude == 0.0 ? testLatitude : globalConfigurationsModel.projectLatitude ?? testLatitude, longitude: globalConfigurationsModel.projectLongitude == 0.0 ? testLongitude : globalConfigurationsModel.projectLongitude ?? testLongitude, ); if (response == null) { return; } prayersWidgetModel = response; getNextPrayerToShow(); notifyListeners(); } WeathersWidgetModel weathersWidgetModel = WeathersWidgetModel(); Future getWeatherDetailsFromServer() async { int testCityKey = 297030; WeathersWidgetModel? response = await screenDetailsRepo.getWeatherDetailsByCity( cityId: (globalConfigurationsModel.cityKey == 0 ? testCityKey : globalConfigurationsModel.cityKey).toString(), ); if (response == null) { return; } weathersWidgetModel = response; notifyListeners(); } String nextPrayerToShowWithTime = ''; void getNextPrayerToShow() async { final current = DateTime.now(); log("Checking Namaz time Locally at ${current.toString()} and ${current.timeZoneName} "); if (globalConfigurationsModel.isPrayerTimeReq && prayersWidgetModel.fajr == null) { await getPrayerDetailsFromServer(); } if (prayersWidgetModel.fajr != null && prayersWidgetModel.fajr!.toDateTimeFromInt().isAfter(current)) { final namazTime = prayersWidgetModel.fajr!.toFormattedDateTimeFromInt(); nextPrayerToShowWithTime = "${globalConfigurationsModel.fajarText} at $namazTime"; notifyListeners(); return; } if (prayersWidgetModel.dhuhr != null && prayersWidgetModel.dhuhr!.toDateTimeFromInt().isAfter(current)) { final namazTime = prayersWidgetModel.dhuhr!.toFormattedDateTimeFromInt(); nextPrayerToShowWithTime = "${globalConfigurationsModel.dhuhrText} at $namazTime"; notifyListeners(); return; } if (prayersWidgetModel.asr != null && prayersWidgetModel.asr!.toDateTimeFromInt().isAfter(current)) { final namazTime = prayersWidgetModel.asr!.toFormattedDateTimeFromInt(); nextPrayerToShowWithTime = "${globalConfigurationsModel.asarText} at $namazTime"; notifyListeners(); return; } if (prayersWidgetModel.maghrib != null && prayersWidgetModel.maghrib!.toDateTimeFromInt().isAfter(current)) { final namazTime = prayersWidgetModel.maghrib!.toFormattedDateTimeFromInt(); nextPrayerToShowWithTime = "${globalConfigurationsModel.maghribText} at $namazTime"; notifyListeners(); return; } if (prayersWidgetModel.isha != null && prayersWidgetModel.isha!.toDateTimeFromInt().isAfter(current)) { final namazTime = prayersWidgetModel.isha!.toFormattedDateTimeFromInt(); nextPrayerToShowWithTime = "${globalConfigurationsModel.ishaText} at $namazTime"; notifyListeners(); return; } } int counter = 0; Future getTheWidgetsConfigurationsEveryMidnight() async { if (!(globalConfigurationsModel.isWeatherReq) && !(globalConfigurationsModel.isPrayerTimeReq) && !(globalConfigurationsModel.isRssFeedReq)) { return; } DateTime current = DateTime.now(); Stream timer = Stream.periodic(const Duration(minutes: 1), (i) { current = current.add(const Duration(minutes: 1)); return current; }); timer.listen((data) async { DateTime dateTime = DateTime.parse(data.toString()); counter++; log("counterValue: $counter"); if (counter == 60 && globalConfigurationsModel.isRssFeedReq) { await getRssFeedDetailsFromServer(); } if (globalConfigurationsModel.isWeatherReq) { if (dateTime.day > currentLastTimeUpdated.day) { await getWeatherDetailsFromServer(); } } if (globalConfigurationsModel.isPrayerTimeReq) { if (dateTime.day > currentLastTimeUpdated.day) { await getPrayerDetailsFromServer(); } } if (globalConfigurationsModel.isRssFeedReq) { if (dateTime.day > currentLastTimeUpdated.day) { await getRssFeedDetailsFromServer(); } } getNextPrayerToShow(); }); } DateTime currentLastTimeUpdated = DateTime.now(); Future getLastTimeUpdatedFromCache() async { DateTime? response = await cacheService.getLastTimeUpdatedFromCache(); if (response != null) { currentLastTimeUpdated = response; } } Future createAutoTickets({required int numOfTicketsToCreate}) async { int startTicket = 123457100; for (int i = 0; i < numOfTicketsToCreate; i++) { GenericRespModel? response = await screenDetailsRepo.createNextTickets(ticketNumber: startTicket); startTicket = startTicket + 1; if (response == null || response.messageStatus != 1) { log("response null from createNextTickets"); return; } } log("last ticket is: $startTicket "); } }