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
)