diff --git a/assets/images/hmglogo_pharmacy.svg b/assets/images/hmglogo_pharmacy.svg new file mode 100644 index 0000000..24a79de --- /dev/null +++ b/assets/images/hmglogo_pharmacy.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/kiosk_queue_icon.svg b/assets/images/kiosk_queue_icon.svg new file mode 100644 index 0000000..14627f9 --- /dev/null +++ b/assets/images/kiosk_queue_icon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/images/language_icon.svg b/assets/images/language_icon.svg new file mode 100644 index 0000000..c740a6a --- /dev/null +++ b/assets/images/language_icon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 6ba96cd..65c8073 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -1,15 +1,18 @@ import 'package:flutter/cupertino.dart'; import 'package:hmg_qline/views/main_queue_screen/main_queue_screen.dart'; import 'package:hmg_qline/views/splash_screen/splash_screen.dart'; +import 'package:hmg_qline/views/kiosk_screens/kiosk_main_screen.dart'; class AppRoutes { //User static const String splash = "/splash"; static const String mainQueueScreen = "/mainQueueScreen"; + static const String kioskMainScreen = "/kioskMainScreen"; static const String initialRoute = splash; static final Map routes = { splash: (context) => const SplashScreen(), + kioskMainScreen: (context) => const KioskMainScreen(), mainQueueScreen: (context) => const MainQueueScreen(), }; } diff --git a/lib/constants/app_constants.dart b/lib/constants/app_constants.dart index dcabba5..9124977 100644 --- a/lib/constants/app_constants.dart +++ b/lib/constants/app_constants.dart @@ -16,6 +16,8 @@ class AppStrings { static String fontNameCairo = "Cairo"; static String noInternetConnection = "No Internet Connection"; static String awaitingArrivalEng = "Awaiting Patients Arrival"; + static String awaitingQueueNumberEng = "Awaiting Queue Number"; + static String awaitingQueueNumberAr = "في انتظار رقم قائمة الانتظار"; static String counterNo = "Counter Number: "; static String awaitingArrivalAr = "في انتظار وصول المرضى"; } @@ -52,9 +54,14 @@ class AppColors { } class AppAssets { + static String poppinsMedium = "assets/fonts/Poppins/Poppins-Medium.ttf"; + static String hmgLogo = "assets/images/hmglogo.svg"; + static String hmgLogoPharmacy = "assets/images/hmglogo_pharmacy.svg"; static String noInternetImage = "assets/images/undraw_connected_world_wuay.png"; static String cloudLogo = "assets/images/cloud_logo.png"; + static String languageIcon = "assets/images/language_icon.svg"; + static String kioskQueueIcon = "assets/images/kiosk_queue_icon.svg"; //IconPaths static String vitalSignIcon = "assets/images/vitalsign_icon.svg"; @@ -75,7 +82,6 @@ class AppAssets { static String windIcon = "assets/icons/windy.svg"; //Tones - static String callTone = "assets/tones/call_tone.mp3"; } @@ -85,14 +91,16 @@ class AppConstants { static String onlyLetters = "[a-zA-Z &'\"]"; static String onlyDate = "[0-9/]"; static String apiKey = 'EE17D21C7943485D9780223CCE55DCE5'; - static String testIP = '10.20.10.30'; + static String testIP = '12.4.5.1'; // projectID.QlineType.ScreenType.AnyNumber (1 to 10) static int thresholdForListUI = 3; } class ApiConstants { - static String baseUrl = 'https://ms.hmg.com/nscapi'; + static String baseUrl = 'https://ms.hmg.com/nscapi2'; static String baseUrlHub = '$baseUrl/PatientCallingHub'; static String baseUrlApi = '$baseUrl/api'; + static String baseUrlApiGen = '$baseUrl/api/Gen'; + static String baseUrlApiPatientCall = '$baseUrlApi/PatientCall'; static String createTicket = '$baseUrlApiPatientCall/LAB_PatientCallNo_Get'; static String commonConfigGet = '$baseUrlApiPatientCall/Common_Config_GetByIP'; @@ -102,6 +110,10 @@ class ApiConstants { static String prayerTimeToday = "$baseUrlApiPatientCall/PrayerTime_Today"; static String ticketCallRequestUpdate = "$baseUrlApiPatientCall/CallRequest_QueueUpdate"; + //Generic + static String createTicketForKiosk = '$baseUrlApiGen/GEN_PatientCallNo_Get'; + static String ticketCallRequestUpdateForKiosk = '$baseUrlApiGen/GEN_TicketQueueAck_Insert'; + // Signal R Constants static String sendQLinePatientCall = "SendQLinePatientCall"; @@ -111,3 +123,14 @@ class ApiConstants { class CacheConstants { static String lastTimeUpdated = "lastTimeUpdated"; } + +// calling for pharmacy + +// { +// "projectID": 12, +// "counterNo": 1, +// "queueID": 11, +// "isVidaPlus": false, +// "editedBy": 102, +// "apiKey": "EE17D21C7943485D9780223CCE55DCE5" +// } diff --git a/lib/main.dart b/lib/main.dart index 1214523..56f536a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -25,7 +25,7 @@ class MyApp extends StatelessWidget { builder: (context, constraints) { return OrientationBuilder(builder: (context, orientation) { SizeConfig().init(constraints, orientation); - SystemChrome.setPreferredOrientations([DeviceOrientation.landscapeLeft]); + // SystemChrome.setPreferredOrientations([DeviceOrientation.portraitDown]); SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []); return MultiProvider( providers: [ diff --git a/lib/models/global_config_model.dart b/lib/models/global_config_model.dart index c14a0ec..de9fa46 100644 --- a/lib/models/global_config_model.dart +++ b/lib/models/global_config_model.dart @@ -1,5 +1,5 @@ -import 'dart:developer'; import 'dart:ui'; +import 'package:hmg_qline/models/kiosk_queue_model.dart'; import 'package:hmg_qline/utilities/enums.dart'; import 'package:hmg_qline/utilities/extensions.dart'; @@ -26,6 +26,7 @@ class GlobalConfigurationsModel { String postVoiceText = "Please Visit Counter"; String? roomText; int? roomNo; + bool? isRoomNoRequired; String? counterText; String? queueNoText; String? callForText; @@ -59,6 +60,7 @@ class GlobalConfigurationsModel { double? projectLatitude; double? projectLongitude; int? cityKey; + List? kioskQueueList; GlobalConfigurationsModel({ this.id, @@ -83,6 +85,7 @@ class GlobalConfigurationsModel { this.postVoiceText = "Please Visit Counter", this.roomText, this.roomNo, + this.isRoomNoRequired = true, this.counterText, this.queueNoText, this.callForText, @@ -116,6 +119,7 @@ class GlobalConfigurationsModel { this.projectLatitude, this.projectLongitude, this.cityKey, + this.kioskQueueList, }); GlobalConfigurationsModel.fromJson(Map json) { @@ -142,6 +146,7 @@ class GlobalConfigurationsModel { counterText = json['counterText']; roomText = json['roomText']; roomNo = json['roomNo']; + isRoomNoRequired = json['isRoomNoRequired'] ?? true; queueNoText = json['queueNoText']; callForText = json['callForText']; currentServeText = json['currentServeText']; @@ -176,6 +181,9 @@ class GlobalConfigurationsModel { projectLatitude = json['projectLatitude'] == 0 ? 0.0 : json['projectLatitude']; projectLongitude = json['projectLongitude'] == 0 ? 0.0 : json['projectLongitude']; cityKey = json['cityKey']; + if (json['kioskQueue'] != null) { + kioskQueueList = List.from(json['kioskQueue'].map((kioskQueueJson) => KioskQueueModel.fromJson(kioskQueueJson))); + } } } diff --git a/lib/models/kiosk_queue_model.dart b/lib/models/kiosk_queue_model.dart new file mode 100644 index 0000000..21dabee --- /dev/null +++ b/lib/models/kiosk_queue_model.dart @@ -0,0 +1,56 @@ +class KioskQueueModel { + int? id; + int? projectID; + String? projectName; + String? projectNameN; + int? queueID; + String? queueName; + String? queueNameN; + int? kioskID; + String? kioskName; + String? kioskNameN; + String? ipAddress; + bool? isActive; + int? createdBy; + String? createdOn; + dynamic editedBy; + dynamic editedOn; + + KioskQueueModel({ + this.id, + this.projectID, + this.projectName, + this.projectNameN, + this.queueID, + this.queueName, + this.queueNameN, + this.kioskID, + this.kioskName, + this.kioskNameN, + this.ipAddress, + this.isActive, + this.createdBy, + this.createdOn, + this.editedBy, + this.editedOn, + }); + + KioskQueueModel.fromJson(Map json) { + id = json['id']; + projectID = json['projectID']; + projectName = json['projectName']; + projectNameN = json['projectNameN']; + queueID = json['queueID']; + queueName = json['queueName']; + queueNameN = json['queueNameN']; + kioskID = json['kioskID']; + kioskName = json['kioskName']; + kioskNameN = json['kioskNameN']; + ipAddress = json['ipAddress']; + isActive = json['isActive']; + createdBy = json['createdBy']; + createdOn = json['createdOn']; + editedBy = json['editedBy']; + editedOn = json['editedOn']; + } +} diff --git a/lib/models/kiosk_ticket_model.dart b/lib/models/kiosk_ticket_model.dart new file mode 100644 index 0000000..77df29d --- /dev/null +++ b/lib/models/kiosk_ticket_model.dart @@ -0,0 +1,22 @@ +class KioskPatientTicket { + String? patientCallNo; + int? projectID; + int? ticketQueueID; + int? result; + + KioskPatientTicket({ + this.patientCallNo, + this.projectID, + this.ticketQueueID, + this.result, + }); + + factory KioskPatientTicket.fromJson(Map json) { + return KioskPatientTicket( + patientCallNo: json['patientCallNo'], + projectID: json['projectID'], + ticketQueueID: json['ticketQueueID'], + result: json['result'], + ); + } +} diff --git a/lib/models/ticket_model.dart b/lib/models/ticket_model.dart index 145f10c..99b972d 100644 --- a/lib/models/ticket_model.dart +++ b/lib/models/ticket_model.dart @@ -16,7 +16,12 @@ class TicketDetailsModel { qTypeEnum = json['qType'] != null ? (json['qType'] as int).toQTypeEnum() : null; screenTypeEnum = json['screenType'] != null ? (json['screenType'] as int).toScreenTypeEnum() : null; connectionID = json['connectionID']; - ticketModel = json['data'] != null ? TicketData.fromJson(json['data']) : null; + ticketModel = json['data'] != null + ? TicketData.fromJson( + json['data'], + qTypeEnum: json['qType'] != null ? (json['qType'] as int).toQTypeEnum() : null, + ) + : null; } } @@ -69,7 +74,7 @@ class TicketData { this.editedOn, }); - TicketData.fromJson(Map json) { + TicketData.fromJson(Map json, {QTypeEnum? qTypeEnum}) { id = json['id']; patientID = json['patientID']; laBQGroupID = json['laB_QGroupID']; @@ -87,6 +92,9 @@ class TicketData { postVoiceText = json['pleaseVisitCounterText'] ?? "Please Visit Counter"; patientGender = json['patientGender'] ?? 1; roomNo = json['roomNo'].toString(); + if (qTypeEnum != null && qTypeEnum == QTypeEnum.general) { + roomNo = json['counterNo'].toString(); + } isActive = json['isActive']; createdBy = json['createdBy']; editedBy = json['editedBy']; diff --git a/lib/repositories/screen_details_repo.dart b/lib/repositories/screen_details_repo.dart index 4aa0c16..0a13a8b 100644 --- a/lib/repositories/screen_details_repo.dart +++ b/lib/repositories/screen_details_repo.dart @@ -2,6 +2,7 @@ import 'package:hmg_qline/api/api_client.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/kiosk_ticket_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'; @@ -13,6 +14,8 @@ abstract class ScreenDetailsRepo { Future createNextTickets({required int ticketNumber}); + Future createTicketFromKiosk({required int projectId, required int queueId}); + Future getScreenConfigurationsByIP({required String ipAddress}); Future getWeatherDetailsByCity({required String cityId}); @@ -77,6 +80,31 @@ class ScreenDetailsRepoImp implements ScreenDetailsRepo { } } + @override + Future createTicketFromKiosk({required int projectId, required int queueId}) async { + try { + var params = { + "projectID": "$projectId", + "queueID": "$queueId", + "isVidaPlus": false, + "createdBy": "101", + "apiKey": AppConstants.apiKey, + }; + GenericRespModel genericRespModel = await apiClientInstance.postJsonForObject( + (json) => GenericRespModel.fromJson(json), + ApiConstants.createTicketForKiosk, + params, + ); + + genericRespModel.data = KioskPatientTicket.fromJson(genericRespModel.data); + return genericRespModel; + } catch (e) { + logger.e(e.toString()); + InfoComponents.showToast(e.toString()); + return null; + } + } + @override Future getScreenConfigurationsByIP({required String ipAddress}) async { try { diff --git a/lib/services/text_to_speech_service.dart b/lib/services/text_to_speech_service.dart index 83b6bdd..1b363cc 100644 --- a/lib/services/text_to_speech_service.dart +++ b/lib/services/text_to_speech_service.dart @@ -28,9 +28,18 @@ class TextToSpeechServiceImp implements TextToSpeechService { @override Future speechTextTest(String test) async { - await textToSpeechInstance.setLanguage(LanguageEnum.arabic.enumToString()); - textToSpeechInstance.setSpeechRate(0.45); - textToSpeechInstance.setPitch(0.9); + log("lang: ${await textToSpeechInstance.areLanguagesInstalled(["en", "ar"])}"); + log("getDefaultEngine: ${await textToSpeechInstance.getDefaultEngine}"); + log("getEngines: ${await textToSpeechInstance.getEngines}"); + + // await textToSpeechInstance.setLanguage(LanguageEnum.arabic.enumToString()); + // textToSpeechInstance.setSpeechRate(0.45); + // textToSpeechInstance.setPitch(0.9); + + await textToSpeechInstance.setLanguage(LanguageEnum.english.enumToString()); + textToSpeechInstance.setSpeechRate(0.37); + textToSpeechInstance.setPitch(0.85); + await textToSpeechInstance.speak(test); } @@ -94,6 +103,8 @@ class TextToSpeechServiceImp implements TextToSpeechService { patientNumeric = queueNoArray[1]; } + patientAlpha = patientAlpha.split('').join(' .. '); + if (langEnum == LanguageEnum.english) { await textToSpeechInstance.speak("$preVoice $patientAlpha .. $patientNumeric .. $postVoice $roomNo"); return; diff --git a/lib/utilities/enums.dart b/lib/utilities/enums.dart index 7f9900e..8d0154e 100644 --- a/lib/utilities/enums.dart +++ b/lib/utilities/enums.dart @@ -15,7 +15,7 @@ enum QTypeEnum { appointment, // 1 lab, // 2 rad, // 3 - pharmacy, // 4 + general, // 4 } enum ScreenTypeEnum { @@ -23,6 +23,7 @@ enum ScreenTypeEnum { roomLevelScreen, // 2 receptionScreen, // 3 dashboardScreen, // 4 + kioskScreen, // 5 } enum LanguageEnum { @@ -30,3 +31,9 @@ enum LanguageEnum { arabic, } +enum KioskScreenStateEnums { + languageState, + queueSelectionState, + ticketNoState, + busyState, +} diff --git a/lib/utilities/extensions.dart b/lib/utilities/extensions.dart index 9637459..37856ca 100644 --- a/lib/utilities/extensions.dart +++ b/lib/utilities/extensions.dart @@ -63,7 +63,7 @@ extension QTypeEnumExtension on int { case 3: return QTypeEnum.rad; case 4: - return QTypeEnum.pharmacy; + return QTypeEnum.general; default: return QTypeEnum.lab; } @@ -89,6 +89,8 @@ extension ScreenTypeExtension on int { return ScreenTypeEnum.receptionScreen; case 4: return ScreenTypeEnum.dashboardScreen; + case 5: + return ScreenTypeEnum.kioskScreen; default: return ScreenTypeEnum.waitingAreaScreen; } diff --git a/lib/view_models/queuing_view_model.dart b/lib/view_models/queuing_view_model.dart index ca6f933..91bf174 100644 --- a/lib/view_models/queuing_view_model.dart +++ b/lib/view_models/queuing_view_model.dart @@ -146,7 +146,7 @@ class QueuingViewModel extends ChangeNotifier { } Future testSpeech() async { - textToSpeechService.speechTextTest("يرجى التوجه .. إلى العداد ..رقم .. 12"); + textToSpeechService.speechTextTest("Ticket Number ... ABC One Tow Three.. Please visit Doctor."); } Future voiceCallTicket({required TicketData? ticketData}) async { diff --git a/lib/view_models/screen_config_view_model.dart b/lib/view_models/screen_config_view_model.dart index a812953..efa3ede 100644 --- a/lib/view_models/screen_config_view_model.dart +++ b/lib/view_models/screen_config_view_model.dart @@ -5,6 +5,8 @@ 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/kiosk_queue_model.dart'; +import 'package:hmg_qline/models/kiosk_ticket_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'; @@ -14,6 +16,7 @@ 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'; +import 'package:hmg_qline/views/view_helpers/info_components.dart'; class ScreenConfigViewModel extends ChangeNotifier { final ScreenDetailsRepo screenDetailsRepo; @@ -66,6 +69,27 @@ class ScreenConfigViewModel extends ChangeNotifier { notifyListeners(); } + KioskScreenStateEnums kioskScreenStateEnum = KioskScreenStateEnums.languageState; + + void updateKioskScreenState(KioskScreenStateEnums state) { + kioskScreenStateEnum = state; + notifyListeners(); + } + + KioskPatientTicket? kioskPatientTicket = KioskPatientTicket(); + + void updateTicketGeneratedFromKiosk(KioskPatientTicket? value) { + kioskPatientTicket = value; + notifyListeners(); + } + + LanguageEnum currentSelectedKioskLanguage = LanguageEnum.english; + + void updateCurrentSelectedKioskLanguage(LanguageEnum value) { + currentSelectedKioskLanguage = value; + notifyListeners(); + } + updateCurrentScreenRotation(ScreenOrientationEnum value) { globalConfigurationsModel.orientationTypeEnum = value; notifyListeners(); @@ -108,13 +132,19 @@ class ScreenConfigViewModel extends ChangeNotifier { 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(); } @@ -302,4 +332,19 @@ class ScreenConfigViewModel extends ChangeNotifier { log("last ticket is: $startTicket "); } + + Future createTicketFromKiosk({required int projectId, required int queueId}) async { + try { + GenericRespModel? response = await screenDetailsRepo.createTicketFromKiosk(projectId: projectId, queueId: queueId); + if (response == null || response.messageStatus != 1) { + logger.e("response null from createTicketFromKiosk"); + return null; + } + return response.data; + } catch (e) { + InfoComponents.showToast(e.toString()); + logger.i(e.toString()); + return null; + } + } } diff --git a/lib/views/common_widgets/app_general_widgets.dart b/lib/views/common_widgets/app_general_widgets.dart new file mode 100644 index 0000000..61acca0 --- /dev/null +++ b/lib/views/common_widgets/app_general_widgets.dart @@ -0,0 +1,191 @@ +import 'dart:developer'; + +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:hmg_qline/constants/app_constants.dart'; +import 'package:hmg_qline/utilities/enums.dart'; +import 'package:hmg_qline/view_models/screen_config_view_model.dart'; +import 'package:hmg_qline/views/common_widgets/app_texts_widget.dart'; +import 'package:hmg_qline/views/view_helpers/size_config.dart'; + +Widget getWeatherWidget(ScreenConfigViewModel screenConfigViewModel) { + if (screenConfigViewModel.weathersWidgetModel.maxTemp == null || screenConfigViewModel.weathersWidgetModel.minTemp == null || screenConfigViewModel.weathersWidgetModel.iconPhrase == null) { + return const SizedBox.shrink(); + } + return Container( + height: (screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitUp || + screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitDown) + ? SizeConfig.getHeightMultiplier() * 2 + : SizeConfig.getHeightMultiplier() * 0.9, + padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), + margin: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), + decoration: AppColors.configWidgetDecoration, + child: Directionality( + textDirection: screenConfigViewModel.globalConfigurationsModel.textDirection, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + AppText( + screenConfigViewModel.globalConfigurationsModel.weatherText, + color: Colors.grey, + fontSize: SizeConfig.getWidthMultiplier() * 2, + fontFamily: screenConfigViewModel.globalConfigurationsModel.screenLanguageEnum == LanguageEnum.arabic ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins, + ), + AppText( + "${screenConfigViewModel.globalConfigurationsModel.maxText}: ${screenConfigViewModel.weathersWidgetModel.maxTemp}°C , ${screenConfigViewModel.globalConfigurationsModel.minText}: ${screenConfigViewModel.weathersWidgetModel.minTemp}°C", + fontSize: SizeConfig.getWidthMultiplier() * 3, + fontHeight: 1, + fontFamily: screenConfigViewModel.globalConfigurationsModel.screenLanguageEnum == LanguageEnum.arabic ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins, + ), + ], + ), + const SizedBox(width: 15), + SvgPicture.asset( + screenConfigViewModel.weathersWidgetModel.weatherIconPath ?? AppAssets.weatherIcon, + height: SizeConfig.getHeightMultiplier() * 0.5, + ), + ], + ), + ), + ); +} + +Widget getPrayerWidget(ScreenConfigViewModel screenConfigViewModel) { + if (screenConfigViewModel.nextPrayerToShowWithTime.isEmpty) { + return const SizedBox.shrink(); + } + return SizedBox( + child: Container( + height: (screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitUp || + screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitDown) + ? SizeConfig.getHeightMultiplier() * 2 + : SizeConfig.getHeightMultiplier() * 0.9, + padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), + margin: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), + decoration: AppColors.configWidgetDecoration, + child: Directionality( + textDirection: screenConfigViewModel.globalConfigurationsModel.textDirection, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + AppText( + screenConfigViewModel.globalConfigurationsModel.nextPrayerText, + color: Colors.grey, + fontSize: SizeConfig.getWidthMultiplier() * 1.5, + fontFamily: screenConfigViewModel.globalConfigurationsModel.screenLanguageEnum == LanguageEnum.arabic ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins, + ), + AppText( + screenConfigViewModel.nextPrayerToShowWithTime, + fontSize: SizeConfig.getWidthMultiplier() * 3, + fontHeight: 1, + fontFamily: screenConfigViewModel.globalConfigurationsModel.screenLanguageEnum == LanguageEnum.arabic ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins, + ), + ], + ), + const SizedBox(width: 15), + SvgPicture.asset( + AppAssets.mosqueIcon, + height: SizeConfig.getWidthMultiplier() * 7, + ), + ], + ), + ), + ), + ); +} + +int getFlexForScreenTypes(ScreenConfigViewModel screenConfigVM) { + int flex = 1; + if (screenConfigVM.currentScreenTypeEnum == ScreenTypeEnum.roomLevelScreen) { + if (screenConfigVM.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitUp || + screenConfigVM.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitDown) { + flex = 2; + } else { + flex = 3; + } + } else { + if (screenConfigVM.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitUp || + screenConfigVM.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitDown) { + flex = 2; + } else { + flex = 1; + } + } + return flex; +} + +Widget counterNoText({required int counterNo, required bool isRoomNoRequired, required String roomText}) { + return AppText( + "$roomText $counterNo", + fontFamily: AppStrings.fontNamePoppins, + textAlign: TextAlign.center, + fontWeight: FontWeight.bold, + color: isRoomNoRequired ? Colors.black : Colors.transparent, + fontSize: SizeConfig.getWidthMultiplier() * 8, + ); +} + +Widget noPatientInQueue({required String text, required String fontName, required String roomText, required bool isRoomNoRequired, required bool isForRoomLevel, required int counterNo}) { + Widget noPatientText = Center( + child: AppText( + text, + fontFamily: fontName, + textAlign: TextAlign.center, + fontSize: SizeConfig.getWidthMultiplier() * 9, + ), + ); + if (isForRoomLevel) { + return Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + counterNoText( + counterNo: counterNo, + roomText: roomText, + isRoomNoRequired: isRoomNoRequired, + ), + noPatientText, + const SizedBox.shrink() + ], + ); + } else { + return noPatientText; + } +} + +Widget commonSelectionCardKiosk({required ScreenConfigViewModel screenConfigViewModel, required String title, required String icon, required VoidCallback onTap}) { + return InkWell( + onTap: onTap, + child: SizedBox( + child: Container( + constraints: BoxConstraints(minWidth: SizeConfig.getWidthMultiplier() * 40), + padding: const EdgeInsets.all(30), + margin: const EdgeInsets.all(10), + decoration: AppColors.configWidgetDecoration, + child: Directionality( + textDirection: screenConfigViewModel.globalConfigurationsModel.textDirection, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset(icon, height: SizeConfig.getWidthMultiplier() * 12), + const SizedBox(height: 15), + AppText( + title, + fontSize: SizeConfig.getWidthMultiplier() * 6, + fontHeight: 1, + fontFamily: screenConfigViewModel.globalConfigurationsModel.screenLanguageEnum == LanguageEnum.arabic ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins, + ), + ], + ), + ), + ), + ), + ); +} diff --git a/lib/views/common_widgets/app_header.dart b/lib/views/common_widgets/app_header.dart index 329d566..cb2a28a 100644 --- a/lib/views/common_widgets/app_header.dart +++ b/lib/views/common_widgets/app_header.dart @@ -24,11 +24,11 @@ class AppHeader extends StatelessWidget implements PreferredSizeWidget { children: [ AppText( "Network Status :", - fontSize: SizeConfig.getWidthMultiplier() * 2.6, + fontSize: SizeConfig.getWidthMultiplier() * 2, ), AppText( " ${screenConfigVM.isInternetConnected ? "Connected" : "Disconnected"}", - fontSize: SizeConfig.getWidthMultiplier() * 3, + fontSize: SizeConfig.getWidthMultiplier() * 2.5, color: screenConfigVM.isInternetConnected ? AppColors.greenColor : AppColors.redColor, ), ], @@ -39,11 +39,11 @@ class AppHeader extends StatelessWidget implements PreferredSizeWidget { children: [ AppText( "Hub Status :", - fontSize: SizeConfig.getWidthMultiplier() * 2.6, + fontSize: SizeConfig.getWidthMultiplier() * 2, ), AppText( " ${screenConfigVM.isHubConnected ? "Connected" : "Disconnected"}", - fontSize: SizeConfig.getWidthMultiplier() * 3, + fontSize: SizeConfig.getWidthMultiplier() * 2.5, color: screenConfigVM.isHubConnected ? AppColors.greenColor : AppColors.redColor, ), ], @@ -65,9 +65,9 @@ class AppHeader extends StatelessWidget implements PreferredSizeWidget { children: [ Container( alignment: Alignment.center, - height: SizeConfig.getHeightMultiplier() * 0.65, - padding: const EdgeInsets.only(left: 20, right: 20), - decoration: BoxDecoration(color: AppColors.redColor), + height: SizeConfig.getHeightMultiplier() * 0.6, + padding: const EdgeInsets.symmetric(horizontal: 20), + decoration: BoxDecoration(color: AppColors.greenColor), child: Directionality( textDirection: globalConfigurationsModel.textDirection, child: Row( @@ -77,10 +77,11 @@ class AppHeader extends StatelessWidget implements PreferredSizeWidget { AppText( globalConfigurationsModel.currentServeText ?? "", color: Colors.white, + fontSize: SizeConfig.getHeightMultiplier() * 0.1, fontFamily: globalConfigurationsModel.screenLanguageEnum == LanguageEnum.arabic ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins, ), SvgPicture.asset( - AppAssets.hmgLogo, + AppAssets.hmgLogoPharmacy, height: SizeConfig.getHeightMultiplier() * 0.5, ), ], diff --git a/lib/views/kiosk_screens/kiosk_main_screen.dart b/lib/views/kiosk_screens/kiosk_main_screen.dart new file mode 100644 index 0000000..c93740e --- /dev/null +++ b/lib/views/kiosk_screens/kiosk_main_screen.dart @@ -0,0 +1,227 @@ +import 'dart:developer'; + +import 'package:flutter/material.dart'; +import 'package:hmg_qline/constants/app_constants.dart'; +import 'package:hmg_qline/models/generic_response_model.dart'; +import 'package:hmg_qline/models/kiosk_queue_model.dart'; +import 'package:hmg_qline/models/kiosk_ticket_model.dart'; +import 'package:hmg_qline/utilities/enums.dart'; +import 'package:hmg_qline/utilities/extensions.dart'; +import 'package:hmg_qline/view_models/screen_config_view_model.dart'; +import 'package:hmg_qline/views/common_widgets/app_footer.dart'; +import 'package:hmg_qline/views/common_widgets/app_general_widgets.dart'; +import 'package:hmg_qline/views/common_widgets/app_header.dart'; +import 'package:hmg_qline/views/common_widgets/app_scaffold.dart'; +import 'package:hmg_qline/views/common_widgets/app_texts_widget.dart'; +import 'package:hmg_qline/views/view_helpers/size_config.dart'; +import 'package:provider/provider.dart'; + +class KioskMainScreen extends StatelessWidget { + const KioskMainScreen({super.key}); + + Widget getBody({required BuildContext context}) { + return Consumer( + builder: (BuildContext context, ScreenConfigViewModel screenConfigVM, Widget? child) { + return Column( + children: [ + if (screenConfigVM.globalConfigurationsModel.screenTypeEnum != ScreenTypeEnum.roomLevelScreen) ...[ + Expanded( + flex: getFlexForScreenTypes(screenConfigVM), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Row( + children: [ + if (screenConfigVM.globalConfigurationsModel.isWeatherReq) ...[ + getWeatherWidget(screenConfigVM), + ], + const SizedBox(width: 20), + if (screenConfigVM.globalConfigurationsModel.isPrayerTimeReq) ...[ + getPrayerWidget(screenConfigVM), + ], + ], + ), + ), + ) + ], + const SizedBox(height: 12), + Expanded(flex: 10, child: dataContentKiosk(context: context)), + if (!screenConfigVM.globalConfigurationsModel.isWeatherReq && !screenConfigVM.globalConfigurationsModel.isPrayerTimeReq) ...[ + const SizedBox(height: 100), + ], + ], + ); + }, + ); + } + + Widget kioskLanguageStateWidget(ScreenConfigViewModel screenConfigViewModel) { + return GridView.builder( + itemCount: 2, + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2), + itemBuilder: (BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.all(20), + child: commonSelectionCardKiosk( + screenConfigViewModel: screenConfigViewModel, + title: index == 0 ? "English" : "عربي", + icon: AppAssets.languageIcon, + onTap: () async { + if (index == 0) { + if (screenConfigViewModel.globalConfigurationsModel.kioskQueueList != null && screenConfigViewModel.globalConfigurationsModel.kioskQueueList!.length == 1) { + await generateTicketForQueue( + screenConfigViewModel: screenConfigViewModel, + kioskQueueModel: screenConfigViewModel.globalConfigurationsModel.kioskQueueList![0], + ); + } else { + screenConfigViewModel.updateCurrentSelectedKioskLanguage(LanguageEnum.english); + screenConfigViewModel.updateKioskScreenState(KioskScreenStateEnums.queueSelectionState); + } + } else { + if (screenConfigViewModel.globalConfigurationsModel.kioskQueueList != null && screenConfigViewModel.globalConfigurationsModel.kioskQueueList!.length == 1) { + await generateTicketForQueue( + screenConfigViewModel: screenConfigViewModel, + kioskQueueModel: screenConfigViewModel.globalConfigurationsModel.kioskQueueList![0], + ); + } else { + screenConfigViewModel.updateCurrentSelectedKioskLanguage(LanguageEnum.arabic); + screenConfigViewModel.updateKioskScreenState(KioskScreenStateEnums.queueSelectionState); + } + } + }, + ), + ); + }, + ); + } + + Widget kioskQueueSelectionStateWidget(ScreenConfigViewModel screenConfigViewModel) { + bool isEnglish = screenConfigViewModel.currentSelectedKioskLanguage == LanguageEnum.english; + + return Directionality( + textDirection: isEnglish ? TextDirection.ltr : TextDirection.rtl, + child: GridView.builder( + itemCount: screenConfigViewModel.globalConfigurationsModel.kioskQueueList!.length, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: (screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitUp || + screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitDown) + ? 2 + : 3, + ), + itemBuilder: (BuildContext context, int index) { + KioskQueueModel kioskQueueModel = screenConfigViewModel.globalConfigurationsModel.kioskQueueList![index]; + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + commonSelectionCardKiosk( + screenConfigViewModel: screenConfigViewModel, + title: screenConfigViewModel.currentSelectedKioskLanguage == LanguageEnum.english ? "${kioskQueueModel.queueName}" : "${kioskQueueModel.queueNameN}", + icon: AppAssets.kioskQueueIcon, + onTap: () async { + await generateTicketForQueue(screenConfigViewModel: screenConfigViewModel, kioskQueueModel: kioskQueueModel); + }, + ), + ], + ); + }), + ); + } + + Widget kioskTicketNumberStateWidget(ScreenConfigViewModel screenConfigViewModel) { + bool isEnglish = screenConfigViewModel.currentSelectedKioskLanguage == LanguageEnum.english; + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + AppText( + isEnglish ? "Your Ticket Number is: " : "رقم تذكرتك هو:", + fontSize: SizeConfig.getWidthMultiplier() * 6, + textDirection: isEnglish ? TextDirection.ltr : TextDirection.rtl, + fontHeight: 1, + fontFamily: isEnglish ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins, + ), + const SizedBox(height: 20), + AppText( + screenConfigViewModel.kioskPatientTicket!.patientCallNo ?? "", + fontSize: SizeConfig.getWidthMultiplier() * 10, + fontHeight: 1, + fontWeight: FontWeight.bold, + textDirection: isEnglish ? TextDirection.ltr : TextDirection.rtl, + fontFamily: isEnglish ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins, + ), + const SizedBox(height: 20), + AppText( + isEnglish ? "Please take the receipt and wait for your turn. \nThank you 😊" : "يرجى أخذ الإيصال وانتظار دورك.\n شكرًا لك 😊", + fontSize: SizeConfig.getWidthMultiplier() * 3, + textAlign: TextAlign.center, + textDirection: isEnglish ? TextDirection.ltr : TextDirection.rtl, + fontHeight: 1, + fontFamily: isEnglish ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins, + ), + const SizedBox(height: 100), + InkWell( + onTap: () { + screenConfigViewModel.updateKioskScreenState(KioskScreenStateEnums.languageState); + }, + child: AppText( + isEnglish ? "Go to Main Page" : "اذهب إلى الصفحة الرئيسية", + fontSize: SizeConfig.getWidthMultiplier() * 3, + textAlign: TextAlign.center, + textDecoration: TextDecoration.underline, + textDirection: isEnglish ? TextDirection.ltr : TextDirection.rtl, + fontHeight: 1, + fontFamily: isEnglish ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins, + ), + ), + ], + ); + } + + Future generateTicketForQueue({ + required ScreenConfigViewModel screenConfigViewModel, + required KioskQueueModel kioskQueueModel, + }) async { + screenConfigViewModel.updateKioskScreenState(KioskScreenStateEnums.busyState); + KioskPatientTicket? kioskPatientTicket = await screenConfigViewModel.createTicketFromKiosk( + projectId: kioskQueueModel.projectID ?? 0, + queueId: kioskQueueModel.queueID ?? 0, + ); + if (kioskPatientTicket == null) { + screenConfigViewModel.updateKioskScreenState(KioskScreenStateEnums.languageState); + return; + } + screenConfigViewModel.updateTicketGeneratedFromKiosk(kioskPatientTicket); + screenConfigViewModel.updateKioskScreenState(KioskScreenStateEnums.ticketNoState); + } + + Widget dataContentKiosk({required BuildContext context}) { + return Padding( + padding: const EdgeInsets.all(10), + child: Consumer( + builder: (BuildContext context, ScreenConfigViewModel screenConfigViewModel, Widget? child) { + return switch (screenConfigViewModel.kioskScreenStateEnum) { + KioskScreenStateEnums.languageState => kioskLanguageStateWidget(screenConfigViewModel), + KioskScreenStateEnums.queueSelectionState => kioskQueueSelectionStateWidget(screenConfigViewModel), + KioskScreenStateEnums.ticketNoState => kioskTicketNumberStateWidget(screenConfigViewModel), + KioskScreenStateEnums.busyState => const Center(child: CircularProgressIndicator()), + }; + }, + ), + ); + } + + @override + Widget build(BuildContext context) { + return Selector( + selector: (context, screenConfigViewModel) => screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum, + builder: (BuildContext context, ScreenOrientationEnum screenOrientationEnum, Widget? child) { + return RotatedBox( + quarterTurns: screenOrientationEnum.getTurnsByOrientation(), + child: AppScaffold( + appBar: const AppHeader(), + body: getBody(context: context), + bottomNavigationBar: const AppFooter(), + ), + ); + }, + ); + } +} diff --git a/lib/views/main_queue_screen/main_queue_screen.dart b/lib/views/main_queue_screen/main_queue_screen.dart index a335647..3464a3c 100644 --- a/lib/views/main_queue_screen/main_queue_screen.dart +++ b/lib/views/main_queue_screen/main_queue_screen.dart @@ -1,184 +1,47 @@ -import 'dart:developer'; - import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:hmg_qline/constants/app_constants.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'; import 'package:hmg_qline/view_models/screen_config_view_model.dart'; import 'package:hmg_qline/views/common_widgets/app_footer.dart'; +import 'package:hmg_qline/views/common_widgets/app_general_widgets.dart'; import 'package:hmg_qline/views/common_widgets/app_header.dart'; import 'package:hmg_qline/views/common_widgets/app_scaffold.dart'; -import 'package:hmg_qline/views/common_widgets/app_texts_widget.dart'; import 'package:hmg_qline/views/main_queue_screen/components/priority_tickets.dart'; import 'package:hmg_qline/views/main_queue_screen/components/priority_tickets_sidelist.dart'; -import 'package:hmg_qline/views/view_helpers/size_config.dart'; import 'package:provider/provider.dart'; class MainQueueScreen extends StatelessWidget { const MainQueueScreen({super.key}); - Widget getWeatherWidget(ScreenConfigViewModel screenConfigViewModel) { - if (screenConfigViewModel.weathersWidgetModel.maxTemp == null || screenConfigViewModel.weathersWidgetModel.minTemp == null || screenConfigViewModel.weathersWidgetModel.iconPhrase == null) { - return const SizedBox.shrink(); - } - return Container( - height: (screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitUp || - screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitDown) - ? SizeConfig.getHeightMultiplier() * 2 - : SizeConfig.getHeightMultiplier() * 0.9, - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), - margin: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), - decoration: AppColors.configWidgetDecoration, - child: Directionality( - textDirection: screenConfigViewModel.globalConfigurationsModel.textDirection, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - AppText( - screenConfigViewModel.globalConfigurationsModel.weatherText, - color: Colors.grey, - fontSize: SizeConfig.getWidthMultiplier() * 2, - fontFamily: screenConfigViewModel.globalConfigurationsModel.screenLanguageEnum == LanguageEnum.arabic ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins, - ), - AppText( - "${screenConfigViewModel.globalConfigurationsModel.maxText}: ${screenConfigViewModel.weathersWidgetModel.maxTemp}°C , ${screenConfigViewModel.globalConfigurationsModel.minText}: ${screenConfigViewModel.weathersWidgetModel.minTemp}°C", - fontSize: SizeConfig.getWidthMultiplier() * 3, - fontHeight: 1, - fontFamily: screenConfigViewModel.globalConfigurationsModel.screenLanguageEnum == LanguageEnum.arabic ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins, - ), - ], - ), - const SizedBox(width: 15), - SvgPicture.asset( - screenConfigViewModel.weathersWidgetModel.weatherIconPath ?? AppAssets.weatherIcon, - height: SizeConfig.getHeightMultiplier() * 0.5, - ), - ], - ), - ), - ); - } - - Widget getPrayerWidget(ScreenConfigViewModel screenConfigViewModel) { - if (screenConfigViewModel.nextPrayerToShowWithTime.isEmpty) { - return const SizedBox.shrink(); - } - return SizedBox( - child: Container( - height: (screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitUp || - screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitDown) - ? SizeConfig.getHeightMultiplier() * 2 - : SizeConfig.getHeightMultiplier() * 0.9, - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), - margin: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), - decoration: AppColors.configWidgetDecoration, - child: Directionality( - textDirection: screenConfigViewModel.globalConfigurationsModel.textDirection, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - AppText( - screenConfigViewModel.globalConfigurationsModel.nextPrayerText, - color: Colors.grey, - fontSize: SizeConfig.getWidthMultiplier() * 1.5, - fontFamily: screenConfigViewModel.globalConfigurationsModel.screenLanguageEnum == LanguageEnum.arabic ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins, - ), - AppText( - screenConfigViewModel.nextPrayerToShowWithTime, - fontSize: SizeConfig.getWidthMultiplier() * 3, - fontHeight: 1, - fontFamily: screenConfigViewModel.globalConfigurationsModel.screenLanguageEnum == LanguageEnum.arabic ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins, - ), - ], - ), - const SizedBox(width: 15), - SvgPicture.asset( - AppAssets.mosqueIcon, - height: SizeConfig.getWidthMultiplier() * 7, - ), - ], - ), - ), - ), - ); - } - - Widget counterNoText(int counterNo) { - return AppText( - "${AppStrings.counterNo}$counterNo", - fontFamily: AppStrings.fontNamePoppins, - textAlign: TextAlign.center, - fontWeight: FontWeight.bold, - color: Colors.transparent, - fontSize: SizeConfig.getWidthMultiplier() * 8, - ); - } - - Widget noPatientInQueue({required String text, required String fontName, required bool isForRoomLevel, required int counterNo}) { - Widget noPatientText = Center( - child: AppText( - text, - fontFamily: fontName, - textAlign: TextAlign.center, - fontSize: SizeConfig.getWidthMultiplier() * 9, - ), - ); - if (isForRoomLevel) { - return Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [counterNoText(counterNo), noPatientText, const SizedBox.shrink()], - ); - } else { - return noPatientText; - } - } - - Widget qamarsBirthdayWidget() { - return Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - AppText("Good Bye", fontFamily: 'Poppins-SemiBold.ttf', fontSize: SizeConfig.getWidthMultiplier() * 15), - Center( - child: AppText("Syed Qamar :(", fontFamily: 'Poppins-SemiBold.ttf', fontSize: SizeConfig.getWidthMultiplier() * 11), - ), - ], - ); - } - - // if (globalConfigurationsModel.screenTypeEnum == ScreenTypeEnum.roomLevelScreen) ...[ - // SizedBox(height: 20,), - // AppText( - // AppStrings.counterNo, - // fontFamily: AppStrings.fontNamePoppins, - // textAlign: TextAlign.center, - // fontWeight: FontWeight.bold, - // fontSize: SizeConfig.getWidthMultiplier() * 10, - // ), - // ] - Widget dataContent({required BuildContext context}) { return Consumer2( builder: (BuildContext context, ScreenConfigViewModel screenConfigViewModel, QueuingViewModel queuingViewModel, Widget? child) { Widget widget = const SizedBox(); String text = AppStrings.awaitingArrivalEng; String fontFamily = AppStrings.fontNamePoppins; + + if (screenConfigViewModel.currentQTypeEnum == QTypeEnum.general) { + text = AppStrings.awaitingQueueNumberEng; + } if (screenConfigViewModel.globalConfigurationsModel.screenLanguageEnum == LanguageEnum.arabic) { + if (screenConfigViewModel.currentQTypeEnum == QTypeEnum.general) { + text = AppStrings.awaitingQueueNumberAr; + } text = AppStrings.awaitingArrivalAr; fontFamily = AppStrings.fontNameCairo; } if (queuingViewModel.currentTickets.isEmpty) { bool isForRoomLevel = screenConfigViewModel.globalConfigurationsModel.screenTypeEnum == ScreenTypeEnum.roomLevelScreen; - widget = noPatientInQueue(text: text, fontName: fontFamily, isForRoomLevel: isForRoomLevel, counterNo: screenConfigViewModel.globalConfigurationsModel.roomNo ?? 0); + widget = noPatientInQueue( + text: text, + fontName: fontFamily, + isForRoomLevel: isForRoomLevel, + isRoomNoRequired: screenConfigViewModel.globalConfigurationsModel.isRoomNoRequired ?? true, + counterNo: screenConfigViewModel.globalConfigurationsModel.roomNo ?? 0, + roomText: screenConfigViewModel.globalConfigurationsModel.roomText ?? AppStrings.counterNo, + ); } else if (screenConfigViewModel.globalConfigurationsModel.screenTypeEnum == ScreenTypeEnum.roomLevelScreen) { widget = Row( mainAxisAlignment: MainAxisAlignment.center, @@ -187,7 +50,11 @@ class MainQueueScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ - counterNoText(screenConfigViewModel.globalConfigurationsModel.roomNo ?? 0), + counterNoText( + counterNo: screenConfigViewModel.globalConfigurationsModel.roomNo ?? 0, + roomText: screenConfigViewModel.globalConfigurationsModel.roomText ?? AppStrings.counterNo, + isRoomNoRequired: screenConfigViewModel.globalConfigurationsModel.isRoomNoRequired ?? true, + ), PriorityTickets( tickets: [queuingViewModel.currentTickets.first], globalConfigurationsModel: screenConfigViewModel.globalConfigurationsModel, @@ -215,27 +82,6 @@ class MainQueueScreen extends StatelessWidget { ); } - int getFlexForScreenTypes(ScreenConfigViewModel screenConfigVM) { - int flex = 1; - - if (screenConfigVM.currentScreenTypeEnum == ScreenTypeEnum.roomLevelScreen) { - if (screenConfigVM.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitUp || - screenConfigVM.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitDown) { - flex = 2; - } else { - flex = 3; - } - } else { - if (screenConfigVM.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitUp || - screenConfigVM.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitDown) { - flex = 2; - } else { - flex = 1; - } - } - return flex; - } - Widget getBody({required BuildContext context}) { return Consumer( builder: (BuildContext context, ScreenConfigViewModel screenConfigVM, Widget? child) { diff --git a/lib/views/splash_screen/splash_screen.dart b/lib/views/splash_screen/splash_screen.dart index c0a8d97..22bf113 100644 --- a/lib/views/splash_screen/splash_screen.dart +++ b/lib/views/splash_screen/splash_screen.dart @@ -4,6 +4,8 @@ import 'package:hmg_qline/utilities/extensions.dart'; import 'package:hmg_qline/view_models/queuing_view_model.dart'; import 'package:hmg_qline/view_models/screen_config_view_model.dart'; import 'package:provider/provider.dart'; +import 'package:hmg_qline/utilities/enums.dart'; +import 'dart:developer'; class SplashScreen extends StatelessWidget { const SplashScreen({super.key}); @@ -44,7 +46,13 @@ class SplashScreen extends StatelessWidget { // If the data is loaded successfully if (snapshot.connectionState == ConnectionState.done) { - Future.delayed(const Duration(seconds: 1)).whenComplete(() => context.navigateReplaceTo(AppRoutes.mainQueueScreen)); + Future.delayed(const Duration(seconds: 1)).whenComplete(() { + if (context.read().currentScreenTypeEnum == ScreenTypeEnum.kioskScreen) { + context.navigateReplaceTo(AppRoutes.kioskMainScreen); + } else { + context.navigateReplaceTo(AppRoutes.mainQueueScreen); + } + }); } return const Scaffold( diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index e71a16d..e6f8ec0 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,6 +6,10 @@ #include "generated_plugin_registrant.h" +#include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) charset_converter_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "CharsetConverterPlugin"); + charset_converter_plugin_register_with_registrar(charset_converter_registrar); } diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 2e1de87..9fcfdc3 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + charset_converter ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/pubspec.lock b/pubspec.lock index 12279bb..2c6c8e4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,14 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + archive: + dependency: transitive + description: + name: archive + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d + url: "https://pub.dev" + source: hosted + version: "3.6.1" args: dependency: transitive description: @@ -49,6 +57,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" + charset_converter: + dependency: transitive + description: + name: charset_converter + sha256: a601f27b78ca86c3d88899d53059786d9c3f3c485b64974e9105c06c2569aef5 + url: "https://pub.dev" + source: hosted + version: "2.3.0" clock: dependency: transitive description: @@ -89,6 +105,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.6" + csslib: + dependency: transitive + description: + name: csslib + sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" + url: "https://pub.dev" + source: hosted + version: "1.0.2" cupertino_icons: dependency: "direct main" description: @@ -113,6 +137,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.7" + esc_pos_printer: + dependency: "direct main" + description: + name: esc_pos_printer + sha256: "312b05f909f3f7dd1e6a3332cf384dcee2c3a635138823654cd9c0133d8b5c45" + url: "https://pub.dev" + source: hosted + version: "4.1.0" + esc_pos_utils: + dependency: "direct main" + description: + name: esc_pos_utils + sha256: "8ec0013d7a7f1e790ced6b09b95ce3bf2c6f9468a3e2bc49ece000761d86c6f8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" fading_edge_scrollview: dependency: transitive description: @@ -200,6 +240,14 @@ packages: url: "https://pub.dev" source: hosted version: "8.2.8" + gbk_codec: + dependency: transitive + description: + name: gbk_codec + sha256: "3af5311fc9393115e3650ae6023862adf998051a804a08fb804f042724999f61" + url: "https://pub.dev" + source: hosted + version: "0.4.0" get_it: dependency: "direct main" description: @@ -208,6 +256,22 @@ packages: url: "https://pub.dev" source: hosted version: "8.0.3" + hex: + dependency: transitive + description: + name: hex + sha256: "4e7cd54e4b59ba026432a6be2dd9d96e4c5205725194997193bf871703b82c4a" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + html: + dependency: transitive + description: + name: html + sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec" + url: "https://pub.dev" + source: hosted + version: "0.15.5" http: dependency: "direct main" description: @@ -224,6 +288,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.2" + image: + dependency: transitive + description: + name: image + sha256: "8e9d133755c3e84c73288363e6343157c383a0c6c56fc51afcc5d4d7180306d6" + url: "https://pub.dev" + source: hosted + version: "3.3.0" intl: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 3db8ac5..674e445 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -51,6 +51,8 @@ dependencies: marquee: ^2.2.3 logger: ^2.4.0 fluttertoast: ^8.2.8 + esc_pos_printer: ^4.0.0 # Ensure you are using the latest version + esc_pos_utils: ^1.0.0 # win32: ^5.8.0 # tuple: ^2.0.2 diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 661b0ef..b646fab 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,10 +6,13 @@ #include "generated_plugin_registrant.h" +#include #include #include void RegisterPlugins(flutter::PluginRegistry* registry) { + CharsetConverterPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("CharsetConverterPlugin")); ConnectivityPlusWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); FlutterTtsPluginRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 7363fb2..52d668b 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + charset_converter connectivity_plus flutter_tts )