From c46c475feb10525657de65379d181aad207c3496 Mon Sep 17 00:00:00 2001 From: Faiz Hashmi Date: Wed, 26 Mar 2025 11:27:30 +0300 Subject: [PATCH 1/6] Completed kiosk ui screens --- assets/images/hmglogo_pharmacy.svg | 34 ++++ assets/images/language_icon.svg | 4 + lib/config/routes.dart | 3 + lib/constants/app_constants.dart | 6 + lib/repositories/screen_details_repo.dart | 24 +++ lib/utilities/enums.dart | 9 +- lib/utilities/extensions.dart | 4 + lib/view_models/screen_config_view_model.dart | 24 ++- .../common_widgets/app_general_widgets.dart | 184 ++++++++++++++++++ lib/views/common_widgets/app_header.dart | 4 +- .../kiosk_screens/kiosk_main_screen.dart | 138 +++++++++++++ .../main_queue_screen/main_queue_screen.dart | 174 +---------------- lib/views/splash_screen/splash_screen.dart | 11 +- pubspec.lock | 30 +-- 14 files changed, 455 insertions(+), 194 deletions(-) create mode 100644 assets/images/hmglogo_pharmacy.svg create mode 100644 assets/images/language_icon.svg create mode 100644 lib/views/common_widgets/app_general_widgets.dart create mode 100644 lib/views/kiosk_screens/kiosk_main_screen.dart 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/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..2cbeb19 100644 --- a/lib/constants/app_constants.dart +++ b/lib/constants/app_constants.dart @@ -53,8 +53,10 @@ class AppColors { class AppAssets { 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"; //IconPaths static String vitalSignIcon = "assets/images/vitalsign_icon.svg"; @@ -93,6 +95,7 @@ class ApiConstants { static String baseUrl = 'https://ms.hmg.com/nscapi'; 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 +105,9 @@ class ApiConstants { static String prayerTimeToday = "$baseUrlApiPatientCall/PrayerTime_Today"; static String ticketCallRequestUpdate = "$baseUrlApiPatientCall/CallRequest_QueueUpdate"; + //Generic + static String createTicketForKiosk = '$baseUrlApiGen/GEN_PatientCallNo_Get'; + // Signal R Constants static String sendQLinePatientCall = "SendQLinePatientCall"; diff --git a/lib/repositories/screen_details_repo.dart b/lib/repositories/screen_details_repo.dart index 4aa0c16..383c052 100644 --- a/lib/repositories/screen_details_repo.dart +++ b/lib/repositories/screen_details_repo.dart @@ -13,6 +13,8 @@ abstract class ScreenDetailsRepo { Future createNextTickets({required int ticketNumber}); + Future createTicketFromKiosk({required int queueId}); + Future getScreenConfigurationsByIP({required String ipAddress}); Future getWeatherDetailsByCity({required String cityId}); @@ -77,6 +79,28 @@ class ScreenDetailsRepoImp implements ScreenDetailsRepo { } } + @override + Future createTicketFromKiosk({required int queueId}) async { + try { + var params = { + "projectID": "15", + "createdBy": "101", + "isVidaPlus": true, + "apiKey": AppConstants.apiKey, + }; + GenericRespModel adsGenericModel = await apiClientInstance.postJsonForObject( + (json) => GenericRespModel.fromJson(json), + ApiConstants.createTicketForKiosk, + params, + ); + return adsGenericModel; + } catch (e) { + logger.e(e.toString()); + InfoComponents.showToast(e.toString()); + return null; + } + } + @override Future getScreenConfigurationsByIP({required String ipAddress}) async { try { diff --git a/lib/utilities/enums.dart b/lib/utilities/enums.dart index 7f9900e..86760f1 100644 --- a/lib/utilities/enums.dart +++ b/lib/utilities/enums.dart @@ -15,7 +15,8 @@ enum QTypeEnum { appointment, // 1 lab, // 2 rad, // 3 - pharmacy, // 4 + general, // 4 + pharmacy, // 5 } enum ScreenTypeEnum { @@ -23,6 +24,7 @@ enum ScreenTypeEnum { roomLevelScreen, // 2 receptionScreen, // 3 dashboardScreen, // 4 + kioskScreen, // 5 } enum LanguageEnum { @@ -30,3 +32,8 @@ enum LanguageEnum { arabic, } +enum KioskScreenStateEnums { + languageState, + queueSelectionState, + ticketNoState, +} diff --git a/lib/utilities/extensions.dart b/lib/utilities/extensions.dart index 9637459..d0ef02b 100644 --- a/lib/utilities/extensions.dart +++ b/lib/utilities/extensions.dart @@ -63,6 +63,8 @@ extension QTypeEnumExtension on int { case 3: return QTypeEnum.rad; case 4: + return QTypeEnum.general; + case 5: return QTypeEnum.pharmacy; default: return QTypeEnum.lab; @@ -89,6 +91,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/screen_config_view_model.dart b/lib/view_models/screen_config_view_model.dart index a812953..8c314dc 100644 --- a/lib/view_models/screen_config_view_model.dart +++ b/lib/view_models/screen_config_view_model.dart @@ -66,6 +66,20 @@ class ScreenConfigViewModel extends ChangeNotifier { 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(); @@ -108,13 +122,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); + // updateCurrentScreenTypeEnum(globalConfigurationsModel.screenTypeEnum); + // updateCurrentQTypeEnum(globalConfigurationsModel.qTypeEnum); + notifyListeners(); } 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..02058bb --- /dev/null +++ b/lib/views/common_widgets/app_general_widgets.dart @@ -0,0 +1,184 @@ +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(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 commonSelectionCardKiosk({required ScreenConfigViewModel screenConfigViewModel, required String title, required String icon, required VoidCallback onTap}) { + log("screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum: ${screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum}"); + return InkWell( + onTap: onTap, + child: SizedBox( + child: Container( + constraints: BoxConstraints(minWidth: SizeConfig.getWidthMultiplier() * 30), + padding: const EdgeInsets.all(5), + 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..85d2f64 100644 --- a/lib/views/common_widgets/app_header.dart +++ b/lib/views/common_widgets/app_header.dart @@ -67,7 +67,7 @@ class AppHeader extends StatelessWidget implements PreferredSizeWidget { alignment: Alignment.center, height: SizeConfig.getHeightMultiplier() * 0.65, padding: const EdgeInsets.only(left: 20, right: 20), - decoration: BoxDecoration(color: AppColors.redColor), + decoration: BoxDecoration(color: AppColors.greenColor), child: Directionality( textDirection: globalConfigurationsModel.textDirection, child: Row( @@ -80,7 +80,7 @@ class AppHeader extends StatelessWidget implements PreferredSizeWidget { 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..3de6796 --- /dev/null +++ b/lib/views/kiosk_screens/kiosk_main_screen.dart @@ -0,0 +1,138 @@ +import 'package:flutter/material.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/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/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: () { + if (index == 0) { + screenConfigViewModel.updateCurrentSelectedKioskLanguage(LanguageEnum.english); + screenConfigViewModel.updateKioskScreenState(KioskScreenStateEnums.queueSelectionState); + } else { + screenConfigViewModel.updateCurrentSelectedKioskLanguage(LanguageEnum.arabic); + screenConfigViewModel.updateKioskScreenState(KioskScreenStateEnums.queueSelectionState); + } + }, + ), + ); + }, + ); + } + + Widget kioskQueueSelectionStateWidget(ScreenConfigViewModel screenConfigViewModel) { + return GridView.builder( + itemCount: 5, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: (screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitUp || + screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitDown) + ? 3 + : 2, + ), + itemBuilder: (BuildContext context, int index) { + return Column(mainAxisSize: MainAxisSize.min, children: [ + commonSelectionCardKiosk( + screenConfigViewModel: screenConfigViewModel, + title: "New Latest Certificate Generation ${index + 1}", + icon: AppAssets.languageIcon, + onTap: () { + screenConfigViewModel.updateKioskScreenState(KioskScreenStateEnums.languageState); + }), + ]); + }); + } + + Widget kioskTicketNumberStateWidget(ScreenConfigViewModel screenConfigViewModel) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + commonSelectionCardKiosk(screenConfigViewModel: screenConfigViewModel, title: "English", icon: AppAssets.languageIcon, onTap: () {}), + commonSelectionCardKiosk(screenConfigViewModel: screenConfigViewModel, title: "عربي", icon: AppAssets.languageIcon, onTap: () {}), + ], + ); + } + + 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), + }; + }), + ); + } + + @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..50d0025 100644 --- a/lib/views/main_queue_screen/main_queue_screen.dart +++ b/lib/views/main_queue_screen/main_queue_screen.dart @@ -1,171 +1,20 @@ -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) { @@ -215,27 +64,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..f32cbcb 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,14 @@ 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(() { + log("context.read().currentScreenTypeEnum: ${context.read().currentScreenTypeEnum}"); + if (context.read().currentScreenTypeEnum == ScreenTypeEnum.kioskScreen) { + context.navigateReplaceTo(AppRoutes.kioskMainScreen); + } else { + context.navigateReplaceTo(AppRoutes.mainQueueScreen); + } + }); } return const Scaffold( diff --git a/pubspec.lock b/pubspec.lock index 80c01f2..bb55096 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -61,10 +61,10 @@ packages: dependency: transitive description: name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.19.0" connectivity_plus: dependency: "direct main" description: @@ -260,18 +260,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "10.0.7" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.8" leak_tracker_testing: dependency: transitive description: @@ -556,7 +556,7 @@ packages: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" source_span: dependency: transitive description: @@ -593,10 +593,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.12.0" stream_channel: dependency: transitive description: @@ -609,10 +609,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.0" term_glyph: dependency: transitive description: @@ -625,10 +625,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.3" tuple: dependency: transitive description: @@ -689,10 +689,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b url: "https://pub.dev" source: hosted - version: "14.2.5" + version: "14.3.0" wakelock_plus: dependency: "direct main" description: From 7442e2d36bbac8821c1bb27ff4d51151ef730362 Mon Sep 17 00:00:00 2001 From: Faiz Hashmi Date: Thu, 27 Mar 2025 12:10:51 +0300 Subject: [PATCH 2/6] Moving To Laptop --- lib/constants/app_constants.dart | 5 +- .../common_widgets/app_general_widgets.dart | 2 +- .../kiosk_screens/kiosk_main_screen.dart | 40 +++++++++-- linux/flutter/generated_plugin_registrant.cc | 4 ++ linux/flutter/generated_plugins.cmake | 1 + pubspec.lock | 72 +++++++++++++++++++ pubspec.yaml | 2 + .../flutter/generated_plugin_registrant.cc | 3 + windows/flutter/generated_plugins.cmake | 1 + 9 files changed, 123 insertions(+), 7 deletions(-) diff --git a/lib/constants/app_constants.dart b/lib/constants/app_constants.dart index 2cbeb19..9dcb22b 100644 --- a/lib/constants/app_constants.dart +++ b/lib/constants/app_constants.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:logger/logger.dart'; -bool useTestIP = false; +bool useTestIP = true; Logger logger = Logger(printer: PrettyPrinter(printEmojis: false, colors: true, dateTimeFormat: DateTimeFormat.none)); // app globals @@ -52,6 +52,8 @@ 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"; @@ -77,7 +79,6 @@ class AppAssets { static String windIcon = "assets/icons/windy.svg"; //Tones - static String callTone = "assets/tones/call_tone.mp3"; } diff --git a/lib/views/common_widgets/app_general_widgets.dart b/lib/views/common_widgets/app_general_widgets.dart index 02058bb..34ac287 100644 --- a/lib/views/common_widgets/app_general_widgets.dart +++ b/lib/views/common_widgets/app_general_widgets.dart @@ -159,7 +159,7 @@ Widget commonSelectionCardKiosk({required ScreenConfigViewModel screenConfigView child: SizedBox( child: Container( constraints: BoxConstraints(minWidth: SizeConfig.getWidthMultiplier() * 30), - padding: const EdgeInsets.all(5), + padding: const EdgeInsets.all(10), margin: const EdgeInsets.all(10), decoration: AppColors.configWidgetDecoration, child: Directionality( diff --git a/lib/views/kiosk_screens/kiosk_main_screen.dart b/lib/views/kiosk_screens/kiosk_main_screen.dart index 3de6796..441769f 100644 --- a/lib/views/kiosk_screens/kiosk_main_screen.dart +++ b/lib/views/kiosk_screens/kiosk_main_screen.dart @@ -1,3 +1,5 @@ +import 'dart:developer'; + import 'package:flutter/material.dart'; import 'package:hmg_qline/constants/app_constants.dart'; import 'package:hmg_qline/utilities/enums.dart'; @@ -7,6 +9,7 @@ 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'; @@ -90,18 +93,47 @@ class KioskMainScreen extends StatelessWidget { title: "New Latest Certificate Generation ${index + 1}", icon: AppAssets.languageIcon, onTap: () { - screenConfigViewModel.updateKioskScreenState(KioskScreenStateEnums.languageState); + screenConfigViewModel.updateKioskScreenState(KioskScreenStateEnums.ticketNoState); }), ]); }); } Widget kioskTicketNumberStateWidget(ScreenConfigViewModel screenConfigViewModel) { - return Row( + bool isEnglish = screenConfigViewModel.currentSelectedKioskLanguage == LanguageEnum.english; + return Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - commonSelectionCardKiosk(screenConfigViewModel: screenConfigViewModel, title: "English", icon: AppAssets.languageIcon, onTap: () {}), - commonSelectionCardKiosk(screenConfigViewModel: screenConfigViewModel, title: "عربي", icon: AppAssets.languageIcon, onTap: () {}), + 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), + InkWell( + onTap: () { + screenConfigViewModel.updateKioskScreenState(KioskScreenStateEnums.languageState); + }, + child: AppText( + isEnglish ? "PHR-45" : "بي اتش ار-٤٥", + 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, + ), ], ); } 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 bb55096..6a5e217 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 42341f0..1eda80a 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 ) From fcec60e978f6c3f44fd3680bea204aedc91801cd Mon Sep 17 00:00:00 2001 From: FaizHashmiCS22 Date: Thu, 27 Mar 2025 15:39:00 +0300 Subject: [PATCH 3/6] Completed Kiosk Flow --- assets/images/kiosk_queue_icon.svg | 4 + lib/constants/app_constants.dart | 7 +- lib/main.dart | 2 +- lib/models/global_config_model.dart | 7 +- lib/models/kiosk_queue_model.dart | 56 +++++++++ lib/models/kiosk_ticket_model.dart | 22 ++++ lib/repositories/screen_details_repo.dart | 16 ++- lib/utilities/enums.dart | 1 + lib/view_models/screen_config_view_model.dart | 35 +++++- .../common_widgets/app_general_widgets.dart | 5 +- .../kiosk_screens/kiosk_main_screen.dart | 112 ++++++++++++------ lib/views/splash_screen/splash_screen.dart | 1 - pubspec.lock | 30 ++--- 13 files changed, 226 insertions(+), 72 deletions(-) create mode 100644 assets/images/kiosk_queue_icon.svg create mode 100644 lib/models/kiosk_queue_model.dart create mode 100644 lib/models/kiosk_ticket_model.dart 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/lib/constants/app_constants.dart b/lib/constants/app_constants.dart index 9dcb22b..d01acb8 100644 --- a/lib/constants/app_constants.dart +++ b/lib/constants/app_constants.dart @@ -59,6 +59,7 @@ class AppAssets { 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"; @@ -88,7 +89,7 @@ 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; } @@ -96,7 +97,8 @@ class ApiConstants { static String baseUrl = 'https://ms.hmg.com/nscapi'; static String baseUrlHub = '$baseUrl/PatientCallingHub'; static String baseUrlApi = '$baseUrl/api'; - static String baseUrlApiGen = '$baseUrl/api/Gen/'; + 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'; @@ -108,6 +110,7 @@ class ApiConstants { //Generic static String createTicketForKiosk = '$baseUrlApiGen/GEN_PatientCallNo_Get'; + static String ticketCallRequestUpdateForKiosk = '$baseUrlApiGen/GEN_TicketQueueAck_Insert'; // Signal R Constants diff --git a/lib/main.dart b/lib/main.dart index 1214523..7dfbdad 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..790415d 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'; @@ -59,6 +59,7 @@ class GlobalConfigurationsModel { double? projectLatitude; double? projectLongitude; int? cityKey; + List? kioskQueueList; GlobalConfigurationsModel({ this.id, @@ -116,6 +117,7 @@ class GlobalConfigurationsModel { this.projectLatitude, this.projectLongitude, this.cityKey, + this.kioskQueueList, }); GlobalConfigurationsModel.fromJson(Map json) { @@ -176,6 +178,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/repositories/screen_details_repo.dart b/lib/repositories/screen_details_repo.dart index 383c052..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,7 +14,7 @@ abstract class ScreenDetailsRepo { Future createNextTickets({required int ticketNumber}); - Future createTicketFromKiosk({required int queueId}); + Future createTicketFromKiosk({required int projectId, required int queueId}); Future getScreenConfigurationsByIP({required String ipAddress}); @@ -80,20 +81,23 @@ class ScreenDetailsRepoImp implements ScreenDetailsRepo { } @override - Future createTicketFromKiosk({required int queueId}) async { + Future createTicketFromKiosk({required int projectId, required int queueId}) async { try { var params = { - "projectID": "15", + "projectID": "$projectId", + "queueID": "$queueId", + "isVidaPlus": false, "createdBy": "101", - "isVidaPlus": true, "apiKey": AppConstants.apiKey, }; - GenericRespModel adsGenericModel = await apiClientInstance.postJsonForObject( + GenericRespModel genericRespModel = await apiClientInstance.postJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConstants.createTicketForKiosk, params, ); - return adsGenericModel; + + genericRespModel.data = KioskPatientTicket.fromJson(genericRespModel.data); + return genericRespModel; } catch (e) { logger.e(e.toString()); InfoComponents.showToast(e.toString()); diff --git a/lib/utilities/enums.dart b/lib/utilities/enums.dart index 86760f1..ad6eb8a 100644 --- a/lib/utilities/enums.dart +++ b/lib/utilities/enums.dart @@ -36,4 +36,5 @@ enum KioskScreenStateEnums { languageState, queueSelectionState, ticketNoState, + busyState, } diff --git a/lib/view_models/screen_config_view_model.dart b/lib/view_models/screen_config_view_model.dart index 8c314dc..5a715cc 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; @@ -73,6 +76,13 @@ class ScreenConfigViewModel extends ChangeNotifier { notifyListeners(); } + KioskPatientTicket? kioskPatientTicket = KioskPatientTicket(); + + void updateTicketGeneratedFromKiosk(KioskPatientTicket? value) { + kioskPatientTicket = value; + notifyListeners(); + } + LanguageEnum currentSelectedKioskLanguage = LanguageEnum.english; void updateCurrentSelectedKioskLanguage(LanguageEnum value) { @@ -122,9 +132,9 @@ class ScreenConfigViewModel extends ChangeNotifier { GlobalConfigurationsModel globalConfigurationsModel = GlobalConfigurationsModel(); Future getGlobalConfigurationsByIP() async { - // TODO: TEST ONLY - updateCurrentScreenTypeEnum(ScreenTypeEnum.kioskScreen); - updateCurrentQTypeEnum(QTypeEnum.general); + // // TODO: TEST ONLY + // updateCurrentScreenTypeEnum(ScreenTypeEnum.kioskScreen); + // updateCurrentQTypeEnum(QTypeEnum.general); GlobalConfigurationsModel? response = await screenDetailsRepo.getGlobalScreenConfigurations(ipAddress: currentScreenIP); if (response == null) { @@ -132,8 +142,8 @@ class ScreenConfigViewModel extends ChangeNotifier { return; } updateGlobalConfigurationsModel(value: response); - // updateCurrentScreenTypeEnum(globalConfigurationsModel.screenTypeEnum); - // updateCurrentQTypeEnum(globalConfigurationsModel.qTypeEnum); + updateCurrentScreenTypeEnum(globalConfigurationsModel.screenTypeEnum); + updateCurrentQTypeEnum(globalConfigurationsModel.qTypeEnum); notifyListeners(); } @@ -322,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 index 34ac287..fcb0e90 100644 --- a/lib/views/common_widgets/app_general_widgets.dart +++ b/lib/views/common_widgets/app_general_widgets.dart @@ -153,13 +153,12 @@ Widget noPatientInQueue({required String text, required String fontName, require } Widget commonSelectionCardKiosk({required ScreenConfigViewModel screenConfigViewModel, required String title, required String icon, required VoidCallback onTap}) { - log("screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum: ${screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum}"); return InkWell( onTap: onTap, child: SizedBox( child: Container( - constraints: BoxConstraints(minWidth: SizeConfig.getWidthMultiplier() * 30), - padding: const EdgeInsets.all(10), + constraints: BoxConstraints(minWidth: SizeConfig.getWidthMultiplier() * 40), + padding: const EdgeInsets.all(30), margin: const EdgeInsets.all(10), decoration: AppColors.configWidgetDecoration, child: Directionality( diff --git a/lib/views/kiosk_screens/kiosk_main_screen.dart b/lib/views/kiosk_screens/kiosk_main_screen.dart index 441769f..1c21a59 100644 --- a/lib/views/kiosk_screens/kiosk_main_screen.dart +++ b/lib/views/kiosk_screens/kiosk_main_screen.dart @@ -2,6 +2,9 @@ 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'; @@ -78,25 +81,45 @@ class KioskMainScreen extends StatelessWidget { } Widget kioskQueueSelectionStateWidget(ScreenConfigViewModel screenConfigViewModel) { - return GridView.builder( - itemCount: 5, - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: (screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitUp || - screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitDown) - ? 3 - : 2, - ), - itemBuilder: (BuildContext context, int index) { - return Column(mainAxisSize: MainAxisSize.min, children: [ - commonSelectionCardKiosk( - screenConfigViewModel: screenConfigViewModel, - title: "New Latest Certificate Generation ${index + 1}", - icon: AppAssets.languageIcon, - onTap: () { - screenConfigViewModel.updateKioskScreenState(KioskScreenStateEnums.ticketNoState); - }), - ]); - }); + 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 { + 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 kioskTicketNumberStateWidget(ScreenConfigViewModel screenConfigViewModel) { @@ -112,18 +135,13 @@ class KioskMainScreen extends StatelessWidget { fontFamily: isEnglish ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins, ), const SizedBox(height: 20), - InkWell( - onTap: () { - screenConfigViewModel.updateKioskScreenState(KioskScreenStateEnums.languageState); - }, - child: AppText( - isEnglish ? "PHR-45" : "بي اتش ار-٤٥", - fontSize: SizeConfig.getWidthMultiplier() * 10, - fontHeight: 1, - fontWeight: FontWeight.bold, - textDirection: isEnglish ? TextDirection.ltr : TextDirection.rtl, - fontFamily: isEnglish ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins, - ), + 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( @@ -134,6 +152,21 @@ class KioskMainScreen extends StatelessWidget { 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, + ), + ), ], ); } @@ -141,13 +174,16 @@ class KioskMainScreen extends StatelessWidget { 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), - }; - }), + 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()), + }; + }, + ), ); } diff --git a/lib/views/splash_screen/splash_screen.dart b/lib/views/splash_screen/splash_screen.dart index f32cbcb..22bf113 100644 --- a/lib/views/splash_screen/splash_screen.dart +++ b/lib/views/splash_screen/splash_screen.dart @@ -47,7 +47,6 @@ class SplashScreen extends StatelessWidget { // If the data is loaded successfully if (snapshot.connectionState == ConnectionState.done) { Future.delayed(const Duration(seconds: 1)).whenComplete(() { - log("context.read().currentScreenTypeEnum: ${context.read().currentScreenTypeEnum}"); if (context.read().currentScreenTypeEnum == ScreenTypeEnum.kioskScreen) { context.navigateReplaceTo(AppRoutes.kioskMainScreen); } else { diff --git a/pubspec.lock b/pubspec.lock index 6a5e217..4d2e170 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -77,10 +77,10 @@ packages: dependency: transitive description: name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.19.0" + version: "1.18.0" connectivity_plus: dependency: "direct main" description: @@ -332,18 +332,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.7" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.8" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -628,7 +628,7 @@ packages: dependency: transitive description: flutter source: sdk - version: "0.0.0" + version: "0.0.99" source_span: dependency: transitive description: @@ -665,10 +665,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.11.1" stream_channel: dependency: transitive description: @@ -681,10 +681,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.2.0" term_glyph: dependency: transitive description: @@ -697,10 +697,10 @@ packages: dependency: transitive description: name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.3" + version: "0.7.2" tuple: dependency: transitive description: @@ -761,10 +761,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "14.3.0" + version: "14.2.5" wakelock_plus: dependency: "direct main" description: From 640b9acb46dd67fe1eee28b68ebafcc6048e35fb Mon Sep 17 00:00:00 2001 From: FaizHashmiCS22 Date: Mon, 7 Apr 2025 15:19:52 +0300 Subject: [PATCH 4/6] Made release for kiosk demo --- lib/constants/app_constants.dart | 15 +++++- lib/models/ticket_model.dart | 12 ++++- lib/utilities/enums.dart | 1 - lib/utilities/extensions.dart | 2 - lib/view_models/screen_config_view_model.dart | 2 +- .../kiosk_screens/kiosk_main_screen.dart | 53 +++++++++++++------ .../main_queue_screen/main_queue_screen.dart | 7 +++ 7 files changed, 69 insertions(+), 23 deletions(-) diff --git a/lib/constants/app_constants.dart b/lib/constants/app_constants.dart index d01acb8..7a1ad0f 100644 --- a/lib/constants/app_constants.dart +++ b/lib/constants/app_constants.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:logger/logger.dart'; -bool useTestIP = true; +bool useTestIP = false; Logger logger = Logger(printer: PrettyPrinter(printEmojis: false, colors: true, dateTimeFormat: DateTimeFormat.none)); // app globals @@ -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 = "في انتظار وصول المرضى"; } @@ -121,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/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/utilities/enums.dart b/lib/utilities/enums.dart index ad6eb8a..8d0154e 100644 --- a/lib/utilities/enums.dart +++ b/lib/utilities/enums.dart @@ -16,7 +16,6 @@ enum QTypeEnum { lab, // 2 rad, // 3 general, // 4 - pharmacy, // 5 } enum ScreenTypeEnum { diff --git a/lib/utilities/extensions.dart b/lib/utilities/extensions.dart index d0ef02b..37856ca 100644 --- a/lib/utilities/extensions.dart +++ b/lib/utilities/extensions.dart @@ -64,8 +64,6 @@ extension QTypeEnumExtension on int { return QTypeEnum.rad; case 4: return QTypeEnum.general; - case 5: - return QTypeEnum.pharmacy; default: return QTypeEnum.lab; } diff --git a/lib/view_models/screen_config_view_model.dart b/lib/view_models/screen_config_view_model.dart index 5a715cc..efa3ede 100644 --- a/lib/view_models/screen_config_view_model.dart +++ b/lib/view_models/screen_config_view_model.dart @@ -138,7 +138,7 @@ class ScreenConfigViewModel extends ChangeNotifier { GlobalConfigurationsModel? response = await screenDetailsRepo.getGlobalScreenConfigurations(ipAddress: currentScreenIP); if (response == null) { - log("response; ${response}"); + log("response; $response"); return; } updateGlobalConfigurationsModel(value: response); diff --git a/lib/views/kiosk_screens/kiosk_main_screen.dart b/lib/views/kiosk_screens/kiosk_main_screen.dart index 1c21a59..c93740e 100644 --- a/lib/views/kiosk_screens/kiosk_main_screen.dart +++ b/lib/views/kiosk_screens/kiosk_main_screen.dart @@ -65,13 +65,27 @@ class KioskMainScreen extends StatelessWidget { screenConfigViewModel: screenConfigViewModel, title: index == 0 ? "English" : "عربي", icon: AppAssets.languageIcon, - onTap: () { + onTap: () async { if (index == 0) { - screenConfigViewModel.updateCurrentSelectedKioskLanguage(LanguageEnum.english); - screenConfigViewModel.updateKioskScreenState(KioskScreenStateEnums.queueSelectionState); + 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 { - screenConfigViewModel.updateCurrentSelectedKioskLanguage(LanguageEnum.arabic); - screenConfigViewModel.updateKioskScreenState(KioskScreenStateEnums.queueSelectionState); + 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); + } } }, ), @@ -103,17 +117,7 @@ class KioskMainScreen extends StatelessWidget { title: screenConfigViewModel.currentSelectedKioskLanguage == LanguageEnum.english ? "${kioskQueueModel.queueName}" : "${kioskQueueModel.queueNameN}", icon: AppAssets.kioskQueueIcon, onTap: () 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); + await generateTicketForQueue(screenConfigViewModel: screenConfigViewModel, kioskQueueModel: kioskQueueModel); }, ), ], @@ -171,6 +175,23 @@ class KioskMainScreen extends StatelessWidget { ); } + 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), diff --git a/lib/views/main_queue_screen/main_queue_screen.dart b/lib/views/main_queue_screen/main_queue_screen.dart index 50d0025..acc1035 100644 --- a/lib/views/main_queue_screen/main_queue_screen.dart +++ b/lib/views/main_queue_screen/main_queue_screen.dart @@ -21,7 +21,14 @@ class MainQueueScreen extends StatelessWidget { 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; } From 5a3436f4a5ad6152f82b3ed90187eb8a37a306d2 Mon Sep 17 00:00:00 2001 From: FaizHashmiCS22 Date: Sun, 20 Apr 2025 10:44:52 +0300 Subject: [PATCH 5/6] Made release for kiosk demo --- lib/main.dart | 2 +- lib/services/text_to_speech_service.dart | 17 ++++++++++++++--- lib/view_models/queuing_view_model.dart | 2 +- lib/views/common_widgets/app_header.dart | 5 +++-- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 7dfbdad..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.portraitDown]); + // SystemChrome.setPreferredOrientations([DeviceOrientation.portraitDown]); SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []); return MultiProvider( providers: [ 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/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/views/common_widgets/app_header.dart b/lib/views/common_widgets/app_header.dart index 85d2f64..5e77cda 100644 --- a/lib/views/common_widgets/app_header.dart +++ b/lib/views/common_widgets/app_header.dart @@ -65,8 +65,8 @@ class AppHeader extends StatelessWidget implements PreferredSizeWidget { children: [ Container( alignment: Alignment.center, - height: SizeConfig.getHeightMultiplier() * 0.65, - padding: const EdgeInsets.only(left: 20, right: 20), + height: SizeConfig.getHeightMultiplier() * 0.6, + padding: const EdgeInsets.symmetric(horizontal: 20), decoration: BoxDecoration(color: AppColors.greenColor), child: Directionality( textDirection: globalConfigurationsModel.textDirection, @@ -77,6 +77,7 @@ 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( From d6705f198a4fac5368b5d13619fa341cfc7c4030 Mon Sep 17 00:00:00 2001 From: FaizHashmiCS22 Date: Tue, 6 May 2025 17:14:16 +0300 Subject: [PATCH 6/6] added isRoomNoRequired --- lib/constants/app_constants.dart | 2 +- lib/models/global_config_model.dart | 3 +++ .../common_widgets/app_general_widgets.dart | 18 +++++++++++++----- lib/views/common_widgets/app_header.dart | 8 ++++---- .../main_queue_screen/main_queue_screen.dart | 15 +++++++++++++-- 5 files changed, 34 insertions(+), 12 deletions(-) diff --git a/lib/constants/app_constants.dart b/lib/constants/app_constants.dart index 7a1ad0f..9124977 100644 --- a/lib/constants/app_constants.dart +++ b/lib/constants/app_constants.dart @@ -96,7 +96,7 @@ class AppConstants { } 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'; diff --git a/lib/models/global_config_model.dart b/lib/models/global_config_model.dart index 790415d..de9fa46 100644 --- a/lib/models/global_config_model.dart +++ b/lib/models/global_config_model.dart @@ -26,6 +26,7 @@ class GlobalConfigurationsModel { String postVoiceText = "Please Visit Counter"; String? roomText; int? roomNo; + bool? isRoomNoRequired; String? counterText; String? queueNoText; String? callForText; @@ -84,6 +85,7 @@ class GlobalConfigurationsModel { this.postVoiceText = "Please Visit Counter", this.roomText, this.roomNo, + this.isRoomNoRequired = true, this.counterText, this.queueNoText, this.callForText, @@ -144,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']; diff --git a/lib/views/common_widgets/app_general_widgets.dart b/lib/views/common_widgets/app_general_widgets.dart index fcb0e90..61acca0 100644 --- a/lib/views/common_widgets/app_general_widgets.dart +++ b/lib/views/common_widgets/app_general_widgets.dart @@ -122,18 +122,18 @@ int getFlexForScreenTypes(ScreenConfigViewModel screenConfigVM) { return flex; } -Widget counterNoText(int counterNo) { +Widget counterNoText({required int counterNo, required bool isRoomNoRequired, required String roomText}) { return AppText( - "${AppStrings.counterNo}$counterNo", + "$roomText $counterNo", fontFamily: AppStrings.fontNamePoppins, textAlign: TextAlign.center, fontWeight: FontWeight.bold, - color: Colors.transparent, + color: isRoomNoRequired ? Colors.black : Colors.transparent, fontSize: SizeConfig.getWidthMultiplier() * 8, ); } -Widget noPatientInQueue({required String text, required String fontName, required bool isForRoomLevel, required int counterNo}) { +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, @@ -145,7 +145,15 @@ Widget noPatientInQueue({required String text, required String fontName, require if (isForRoomLevel) { return Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [counterNoText(counterNo), noPatientText, const SizedBox.shrink()], + children: [ + counterNoText( + counterNo: counterNo, + roomText: roomText, + isRoomNoRequired: isRoomNoRequired, + ), + noPatientText, + const SizedBox.shrink() + ], ); } else { return noPatientText; diff --git a/lib/views/common_widgets/app_header.dart b/lib/views/common_widgets/app_header.dart index 5e77cda..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, ), ], diff --git a/lib/views/main_queue_screen/main_queue_screen.dart b/lib/views/main_queue_screen/main_queue_screen.dart index acc1035..3464a3c 100644 --- a/lib/views/main_queue_screen/main_queue_screen.dart +++ b/lib/views/main_queue_screen/main_queue_screen.dart @@ -34,7 +34,14 @@ class MainQueueScreen extends StatelessWidget { } 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, @@ -43,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,