diff --git a/android/app/src/main/kotlin/com/example/hmg_qline/hmg_qline/BootForegroundService.kt b/android/app/src/main/kotlin/com/example/hmg_qline/hmg_qline/BootForegroundService.kt
index bafb989..e5d8522 100644
--- a/android/app/src/main/kotlin/com/example/hmg_qline/hmg_qline/BootForegroundService.kt
+++ b/android/app/src/main/kotlin/com/example/hmg_qline/hmg_qline/BootForegroundService.kt
@@ -1,37 +1,22 @@
package com.example.hmg_qline.hmg_qline
-
-import android.app.AlarmManager
import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
-import android.app.PendingIntent
-import android.content.Context
import android.content.Intent
import android.os.Build
-import android.util.Log
import androidx.core.app.NotificationCompat
import androidx.lifecycle.LifecycleService
-import android.app.ActivityManager
class BootForegroundService : LifecycleService() {
override fun onCreate() {
super.onCreate()
startForegroundService()
- schedulePeriodicCheck()
}
private fun startForegroundService() {
val channelId = "boot_service_channel"
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- val channel = NotificationChannel(
- channelId,
- "Boot Service Channel",
- NotificationManager.IMPORTANCE_HIGH
- )
- val manager = getSystemService(NotificationManager::class.java)
- manager?.createNotificationChannel(channel)
- }
+ createNotificationChannel()
val notification: Notification = NotificationCompat.Builder(this, channelId)
.setContentTitle("QLine App")
@@ -41,67 +26,24 @@ class BootForegroundService : LifecycleService() {
startForeground(1, notification)
- val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
- val runningProcesses = activityManager.runningAppProcesses
-
- var isAppInForeground = false
- for (process in runningProcesses) {
- if (process.processName == packageName &&
- process.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
- ) {
- isAppInForeground = true
- break
- }
+ // Only launch MainActivity if this service is started by the system (e.g. on boot)
+ val intent = Intent(this, MainActivity::class.java).apply {
+ addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP)
}
-
- if (!isAppInForeground) {
- Log.d("BootForegroundService", "App is NOT in foreground — launching MainActivity.")
- val intent = Intent(this, MainActivity::class.java).apply {
- addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP)
- }
- startActivity(intent)
- } else {
- Log.d("BootForegroundService", "App is already in foreground.")
- }
-
- stopSelf() // Stop the service after check
- }
-
-
- private fun schedulePeriodicCheck() {
- val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
- val intent = Intent(this, BootForegroundService::class.java)
- val pendingIntent = PendingIntent.getService(
- this,
- 0,
- intent,
- PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
- )
- // Repeat every 1 minute
- alarmManager.setRepeating(
- AlarmManager.RTC_WAKEUP,
- System.currentTimeMillis() + 60 * 1000,
- 60 * 1000,
- pendingIntent
- )
-
+ startActivity(intent)
+ stopSelf() // Stop the service after initialization
}
- private fun bringAppToFrontIfNotVisible() {
- val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
- val runningProcesses = activityManager.runningAppProcesses
-
- val isAppInForeground = runningProcesses.any {
- it.processName == packageName && it.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
- }
-
- if (!isAppInForeground) {
- Log.d("BootForegroundService", "App is not in foreground, launching MainActivity")
- val intent = Intent(this, MainActivity::class.java)
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP)
- startActivity(intent)
- } else {
- Log.d("BootForegroundService", "App is already in foreground")
+ private fun createNotificationChannel() {
+ val channelId = "boot_service_channel"
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ val channel = NotificationChannel(
+ channelId,
+ "Boot Service Channel",
+ NotificationManager.IMPORTANCE_HIGH
+ )
+ val manager = getSystemService(NotificationManager::class.java)
+ manager?.createNotificationChannel(channel)
}
}
}
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/com/example/hmg_qline/hmg_qline/BootReceiver.kt b/android/app/src/main/kotlin/com/example/hmg_qline/hmg_qline/BootReceiver.kt
index f7d8efc..4c83c97 100644
--- a/android/app/src/main/kotlin/com/example/hmg_qline/hmg_qline/BootReceiver.kt
+++ b/android/app/src/main/kotlin/com/example/hmg_qline/hmg_qline/BootReceiver.kt
@@ -9,11 +9,17 @@ import android.util.Log
class BootBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Log.d("BootReceiver", "Received intent: ${intent.action}")
- if (intent.action == Intent.ACTION_BOOT_COMPLETED || intent.action == "android.intent.action.QUICKBOOT_POWERON") {
+
+ if (intent.action == Intent.ACTION_BOOT_COMPLETED ||
+ intent.action == "android.intent.action.QUICKBOOT_POWERON" ||
+ intent.action == "com.htc.intent.action.QUICKBOOT_POWERON"
+ ) {
+
Log.d("BootReceiver", "Starting BootForegroundService.")
val serviceIntent = Intent(context, BootForegroundService::class.java)
+
+ // Use foreground service for Android 8.0+ (API 26+)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- // For Android 11 (API level 30) or later
context.startForegroundService(serviceIntent)
} else {
context.startService(serviceIntent)
diff --git a/android/app/src/main/kotlin/com/example/hmg_qline/hmg_qline/MainActivity.kt b/android/app/src/main/kotlin/com/example/hmg_qline/hmg_qline/MainActivity.kt
index 400406c..962b001 100644
--- a/android/app/src/main/kotlin/com/example/hmg_qline/hmg_qline/MainActivity.kt
+++ b/android/app/src/main/kotlin/com/example/hmg_qline/hmg_qline/MainActivity.kt
@@ -13,14 +13,18 @@ class MainActivity : FlutterActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
- MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
- call, _ ->
+ MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
Log.d("MainActivity", "MethodChannel call received: ${call.method}")
- if (call.method == "reopenApp") {
- Log.d("MainActivity", "reopenApp called, launching MainActivity")
- val intent = Intent(this, MainActivity::class.java)
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_SINGLE_TOP)
- startActivity(intent)
+ when (call.method) {
+ "reopenApp" -> {
+ Log.d("MainActivity", "reopenApp called, bringing app to foreground")
+ // Simply bring current activity to foreground
+ moveTaskToBack(false)
+ // Or trigger Flutter navigation if needed
+ result.success("App brought to foreground")
+ }
+
+ else -> result.notImplemented()
}
}
}
diff --git a/assets/fonts/Ge_SS_Two/GE_SS_Two_Bold.otf b/assets/fonts/Ge_SS_Two/GE_SS_Two_Bold.otf
new file mode 100644
index 0000000..da99274
Binary files /dev/null and b/assets/fonts/Ge_SS_Two/GE_SS_Two_Bold.otf differ
diff --git a/assets/fonts/Ge_SS_Two/GE_SS_Two_Light.otf b/assets/fonts/Ge_SS_Two/GE_SS_Two_Light.otf
new file mode 100644
index 0000000..60ea874
Binary files /dev/null and b/assets/fonts/Ge_SS_Two/GE_SS_Two_Light.otf differ
diff --git a/assets/fonts/Ge_SS_Two/GE_SS_Two_Medium.otf b/assets/fonts/Ge_SS_Two/GE_SS_Two_Medium.otf
new file mode 100644
index 0000000..ff4a1bf
Binary files /dev/null and b/assets/fonts/Ge_SS_Two/GE_SS_Two_Medium.otf differ
diff --git a/assets/fonts/Poppins/Poppins-Black.ttf b/assets/fonts/Poppins/Poppins-Black.ttf
new file mode 100644
index 0000000..21696ba
Binary files /dev/null and b/assets/fonts/Poppins/Poppins-Black.ttf differ
diff --git a/assets/fonts/Poppins/Poppins-Bold.ttf b/assets/fonts/Poppins/Poppins-Bold.ttf
index b94d47f..4d29009 100644
Binary files a/assets/fonts/Poppins/Poppins-Bold.ttf and b/assets/fonts/Poppins/Poppins-Bold.ttf differ
diff --git a/assets/fonts/Poppins/Poppins-ExtraBold.ttf b/assets/fonts/Poppins/Poppins-ExtraBold.ttf
new file mode 100644
index 0000000..bc0b39c
Binary files /dev/null and b/assets/fonts/Poppins/Poppins-ExtraBold.ttf differ
diff --git a/assets/fonts/Poppins/Poppins-Medium.ttf b/assets/fonts/Poppins/Poppins-Medium.ttf
index e90e87e..a872552 100644
Binary files a/assets/fonts/Poppins/Poppins-Medium.ttf and b/assets/fonts/Poppins/Poppins-Medium.ttf differ
diff --git a/assets/fonts/Poppins/Poppins-Regular.ttf b/assets/fonts/Poppins/Poppins-Regular.ttf
index be06e7f..d8a201f 100644
Binary files a/assets/fonts/Poppins/Poppins-Regular.ttf and b/assets/fonts/Poppins/Poppins-Regular.ttf differ
diff --git a/assets/fonts/Poppins/Poppins-SemiBold.ttf b/assets/fonts/Poppins/Poppins-SemiBold.ttf
index 8987d80..0c1c165 100644
Binary files a/assets/fonts/Poppins/Poppins-SemiBold.ttf and b/assets/fonts/Poppins/Poppins-SemiBold.ttf differ
diff --git a/assets/new_design_icons/cloud_solutions_logo.svg b/assets/new_design_icons/cloud_solutions_logo.svg
new file mode 100644
index 0000000..cc3710a
--- /dev/null
+++ b/assets/new_design_icons/cloud_solutions_logo.svg
@@ -0,0 +1,9 @@
+
diff --git a/assets/new_design_icons/hmg_logo_full.svg b/assets/new_design_icons/hmg_logo_full.svg
new file mode 100644
index 0000000..d05f410
--- /dev/null
+++ b/assets/new_design_icons/hmg_logo_full.svg
@@ -0,0 +1,19 @@
+
diff --git a/assets/new_design_icons/hmg_logo_pattern_dark.svg b/assets/new_design_icons/hmg_logo_pattern_dark.svg
new file mode 100644
index 0000000..34a2305
--- /dev/null
+++ b/assets/new_design_icons/hmg_logo_pattern_dark.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/new_design_icons/hmg_logo_pattern_light.svg b/assets/new_design_icons/hmg_logo_pattern_light.svg
new file mode 100644
index 0000000..ce8043e
--- /dev/null
+++ b/assets/new_design_icons/hmg_logo_pattern_light.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/new_design_icons/new_doctor_icon.svg b/assets/new_design_icons/new_doctor_icon.svg
new file mode 100644
index 0000000..9e673dc
--- /dev/null
+++ b/assets/new_design_icons/new_doctor_icon.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/new_design_icons/new_vital_sign_icon.svg b/assets/new_design_icons/new_vital_sign_icon.svg
new file mode 100644
index 0000000..b1dc0eb
--- /dev/null
+++ b/assets/new_design_icons/new_vital_sign_icon.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/new_design_icons/salah_time_icon.svg b/assets/new_design_icons/salah_time_icon.svg
new file mode 100644
index 0000000..a0606d3
--- /dev/null
+++ b/assets/new_design_icons/salah_time_icon.svg
@@ -0,0 +1,8 @@
+
diff --git a/lib/constants/app_constants.dart b/lib/constants/app_constants.dart
index 8d083a2..0e3a741 100644
--- a/lib/constants/app_constants.dart
+++ b/lib/constants/app_constants.dart
@@ -13,6 +13,7 @@ class AppStrings {
static String poweredBy = "Powered By";
static String appName = "QLine";
static String fontNamePoppins = "Poppins";
+ static String fontNameGesTwo = "GE_SS_Two";
static String fontNameCairo = "Cairo";
static String noInternetConnection = "No Internet Connection";
static String awaitingArrivalEng = "Awaiting Patients Arrival";
@@ -26,6 +27,10 @@ class AppStrings {
static String errorLogsFileName = "error_logs.txt";
static String openAppNativeFunctionName = "reopenApp";
+
+ static String dummyRssFeedText =
+ "Breaking: New Flutter 3.16 released with enhanced performance and stability features • Weather Update: Sunny skies expected throughout the week with temperatures reaching 25°C • Traffic Alert: Highway A1 experiencing delays due to construction work between exits 15-18 • Market Update: Stock indices show positive growth with technology sector leading gains • Company Announcement: Q4 results exceed expectations • New product launch scheduled for next month • Employee appreciation event on Friday • Special Offer: 20% discount on all services this week • Limited time promotion • Terms and conditions apply • Contact customer service for details • Welcome to our digital queue management system • Please follow the instructions on screen • For assistance, contact our support team • Thank you for your patience";
+ static List prayersArray = ["الفجر", "الظهر", "العصر", "المغرب", "العشاء"];
}
class AppColors {
@@ -47,7 +52,6 @@ class AppColors {
static Color procedureColor = const Color(0xFF460707);
//Decoration
-
static BoxDecoration configWidgetDecoration = BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12),
@@ -64,6 +68,36 @@ class AppColors {
),
],
);
+
+ // New Design Colors
+
+ static Color backgroundColor = const Color(0xFFF7F7F7);
+ static Color greyTextColor = const Color(0xFF3E3C47);
+ static Color darkGreyTextColor = const Color(0xFF2B353E);
+ static Color greyContainerColor = const Color(0xFF4B5B6A);
+ static Color newGreenColor = const Color(0xFF03A567);
+ static Color newRedColor = const Color(0xFFEC1C2B);
+ static Color lightBorderColor = const Color(0xFFEDEDED);
+
+ static Color newVitalSignColor = greyContainerColor;
+ static Color newDoctorColor = newGreenColor;
+
+ // Custom Shadow Container Colors
+ static Color smoothContainerShadow = const Color(0x14000000); // 8% black without opacity
+
+ static List gradientBorderComboForVitalSigns = [
+ const Color(0xFFFFFFFF), // start
+ const Color(0xFFAFEAD4), // start
+ const Color(0xFF42BB8D), // end
+ const Color(0xFF42BB8D), // base color
+ ];
+
+ static List gradientBorderComboForDoctor = [
+ const Color(0xFFFFFFFF), // start
+ const Color(0xFFF2F3F4),
+ const Color(0xFFA5ADB4),
+ const Color(0xFF78848F),
+ ];
}
class AppAssets {
@@ -78,8 +112,8 @@ class AppAssets {
//IconPaths
static String vitalSignIcon = "assets/images/vitalsign_icon.svg";
- static String nebulizationIcon = "assets/images/nebulization_icon.svg";
static String doctorIcon = "assets/images/doctor_icon.svg";
+ static String nebulizationIcon = "assets/images/nebulization_icon.svg";
static String procedureIcon = "assets/images/procedure_icon.svg";
static String vaccinationIcon = "assets/images/vaccination_icon.svg";
@@ -96,6 +130,16 @@ class AppAssets {
//Tones
static String callTone = "assets/tones/call_tone.mp3";
+
+ // New Design Icons
+ static String hmgLogoPatternLightIcon = "assets/new_design_icons/hmg_logo_pattern_light.svg";
+ static String hmgLogoPatternDarkIcon = "assets/new_design_icons/hmg_logo_pattern_dark.svg";
+ static String salahTimeIcon = "assets/new_design_icons/salah_time_icon.svg";
+ static String hmgLogoFull = "assets/new_design_icons/hmg_logo_full.svg";
+ static String cloudSolutionsLogo = "assets/new_design_icons/cloud_solutions_logo.svg";
+
+ static String newVitalSignIcon = "assets/images/vitalsign_icon.svg";
+ static String newDoctorIcon = "assets/images/doctor_icon.svg";
}
class AppConstants {
@@ -105,9 +149,8 @@ class AppConstants {
static String onlyDate = "[0-9/]";
static String apiKey = 'EE17D21C7943485D9780223CCE55DCE5';
static String testIP = '12.4.5.1'; // projectID.QlineType.ScreenType.AnyNumber (1 to 10)
- static int thresholdForListUI = 3;
-
- static double currentBuildVersion = 8.8;
+ static int thresholdForListUI = 5;
+ static double currentBuildVersion = 8.9;
static double clearLogsHoursThreshold = 48;
}
diff --git a/lib/models/global_config_model.dart b/lib/models/global_config_model.dart
index dbb63d7..5a228a1 100644
--- a/lib/models/global_config_model.dart
+++ b/lib/models/global_config_model.dart
@@ -1,4 +1,5 @@
import 'dart:ui';
+import 'package:hmg_qline/constants/app_constants.dart';
import 'package:hmg_qline/models/kiosk_language_config_model.dart';
import 'package:hmg_qline/models/kiosk_queue_model.dart';
import 'package:hmg_qline/utilities/enums.dart';
@@ -18,29 +19,41 @@ class GlobalConfigurationsModel {
TextDirection textDirection = TextDirection.ltr;
LanguageEnum voiceLanguageEnum = LanguageEnum.english;
String? voiceLanguageText;
- int screenMaxDisplayPatients = 10;
+ int screenMaxDisplayPatients = 16;
bool? isNotiReq;
int? prioritySMS;
int? priorityWhatsApp;
int? priorityEmail;
String ticketNoText = "Ticket Number";
String postVoiceText = "Please Visit Counter";
- String? roomText;
+
int? roomNo;
bool? isRoomNoRequired;
- String? counterText;
- String? queueNoText;
- String? callForText;
- String? currentServeText;
+ String? roomTextEng;
+ String? counterTextEng;
+ String? queueNoTextEng;
+ String? callForTextEng;
+ String? roomTextArb;
+ String? counterTextArb;
+ String? queueNoTextArb;
+ String? callForTextArb;
+ String? currentServeTextEng;
+ String? currentServeTextArb;
String maxText = "";
String minText = "";
- String nextPrayerText = "";
+ String nextPrayerTextEng = "Next Prayer";
+ String nextPrayerTextArb = "الصلا�� القادمة";
String weatherText = "Weather";
- String? fajarText;
- String? dhuhrText;
- String? asarText;
- String? maghribText;
- String? ishaText;
+ String? fajarTextEng;
+ String? dhuhrTextEng;
+ String? asarTextEng;
+ String? maghribTextEng;
+ String? ishaTextEng;
+ String? fajarTextArb;
+ String? dhuhrTextArb;
+ String? asarTextArb;
+ String? maghribTextArb;
+ String? ishaTextArb;
bool? isActive;
int? createdBy;
String? createdOn;
@@ -64,16 +77,27 @@ class GlobalConfigurationsModel {
List? kioskQueueList;
List? kioskLanguageConfigList;
- String vitalSignText = "Vital Sign";
- String doctorText = "Doctor";
- String procedureText = "Procedure";
- String vaccinationText = "Vaccination";
- String nebulizationText = "Nebulization";
- String callForVitalSignText = "Call for Vital Sign";
- String callForDoctorText = "Call for Doctor";
- String callForProcedureText = "Call for Procedure";
- String callForVaccinationText = "Call for Vaccination";
- String callForNebulizationText = "Call for Nebulization";
+ String vitalSignTextEng = "Vital Sign";
+ String doctorTextEng = "Doctor";
+ String procedureTextEng = "Procedure";
+ String vaccinationTextEng = "Vaccination";
+ String nebulizationTextEng = "Nebulization";
+ String callForVitalSignTextEng = "Call for Vital Sign";
+ String callForDoctorTextEng = "Call for Doctor";
+ String callForProcedureTextEng = "Call for Procedure";
+ String callForVaccinationTextEng = "Call for Vaccination";
+ String callForNebulizationTextEng = "Call for Nebulization";
+
+ String vitalSignTextArb = "العلامات الحيوية";
+ String doctorTextArb = "الطبيب";
+ String procedureTextArb = "الإجراء";
+ String vaccinationTextArb = "التطعيم";
+ String nebulizationTextArb = "البخاخة";
+ String callForVitalSignTextArb = "الرجاء التوجّه إلى غرفة العلامات الحيوية";
+ String callForDoctorTextArb = "الرجاء التوجّه إلى غرفة الطبيب";
+ String callForProcedureTextArb = "الرجاء التوجّه إلى غرفة الإجراء";
+ String callForVaccinationTextArb = "الرجاء التوجّه إلى غرفة التطعيم";
+ String callForNebulizationTextArb = "الرجاء التوجّه إلى غرفة البخاخة";
GlobalConfigurationsModel({
this.id,
@@ -89,29 +113,39 @@ class GlobalConfigurationsModel {
this.textDirection = TextDirection.ltr,
this.voiceLanguageEnum = LanguageEnum.english,
this.voiceLanguageText,
- this.screenMaxDisplayPatients = 10,
+ this.screenMaxDisplayPatients = 16,
this.isNotiReq,
this.prioritySMS,
this.priorityWhatsApp,
this.priorityEmail,
this.ticketNoText = "Ticket Number",
this.postVoiceText = "Please Visit Counter",
- this.roomText,
+ this.roomTextEng,
this.roomNo,
this.isRoomNoRequired = true,
- this.counterText,
- this.queueNoText,
- this.callForText,
- this.currentServeText,
+ this.counterTextEng,
+ this.queueNoTextEng,
+ this.callForTextEng,
+ this.counterTextArb,
+ this.queueNoTextArb,
+ this.callForTextArb,
+ this.currentServeTextEng,
+ this.currentServeTextArb,
this.maxText = "",
this.minText = "",
- this.nextPrayerText = "",
+ this.nextPrayerTextEng = "Next Prayer",
+ this.nextPrayerTextArb = "الصلاة القادمة",
this.weatherText = "Weather",
- this.fajarText,
- this.dhuhrText,
- this.asarText,
- this.maghribText,
- this.ishaText,
+ this.fajarTextEng,
+ this.dhuhrTextEng,
+ this.asarTextEng,
+ this.maghribTextEng,
+ this.ishaTextEng,
+ this.fajarTextArb,
+ this.dhuhrTextArb,
+ this.asarTextArb,
+ this.maghribTextArb,
+ this.ishaTextArb,
this.isActive,
this.createdBy,
this.createdOn,
@@ -134,16 +168,26 @@ class GlobalConfigurationsModel {
this.cityKey,
this.kioskQueueList,
this.kioskLanguageConfigList,
- this.vitalSignText = "Vital Sign",
- this.doctorText = "Doctor",
- this.procedureText = "Procedure",
- this.vaccinationText = "Vaccination",
- this.nebulizationText = "Nebulization",
- this.callForVitalSignText = "Call for Vital Sign",
- this.callForDoctorText = "Call for Doctor",
- this.callForProcedureText = "Call for Procedure",
- this.callForVaccinationText = "Call for Vaccination",
- this.callForNebulizationText = "Call for Nebulization",
+ this.vitalSignTextEng = "Vital Sign",
+ this.doctorTextEng = "Doctor",
+ this.procedureTextEng = "Procedure",
+ this.vaccinationTextEng = "Vaccination",
+ this.nebulizationTextEng = "Nebulization",
+ this.callForVitalSignTextEng = "Call for Vital Sign",
+ this.callForDoctorTextEng = "Call for Doctor",
+ this.callForProcedureTextEng = "Call for Procedure",
+ this.callForVaccinationTextEng = "Call for Vaccination",
+ this.callForNebulizationTextEng = "Call for Nebulization",
+ this.vitalSignTextArb = "العلامات الحيوية",
+ this.doctorTextArb = "الطبيب",
+ this.procedureTextArb = "الإجراء",
+ this.vaccinationTextArb = "التطعيم",
+ this.nebulizationTextArb = "البخاخة",
+ this.callForVitalSignTextArb = "استدعاء للعلامات الحيوية",
+ this.callForDoctorTextArb = "الرجاء التوجّه إلى غرفة الطبيب",
+ this.callForProcedureTextArb = "الرجاء التوجّه إلى غرفة الإجراء",
+ this.callForVaccinationTextArb = "الرجاء التوجّه إلى غرفة التطعيم",
+ this.callForNebulizationTextArb = "الرجاء التوجّه إلى غرفة البخاخة",
});
GlobalConfigurationsModel.fromJson({required Map json, int qType = 1, int screenType = 1}) {
@@ -158,31 +202,45 @@ class GlobalConfigurationsModel {
screenLanguageEnum = (json['screenLanguage'] as int).toLanguageEnum();
screenLanguageText = json['screenLanguageText'];
textDirection = json['textDirection'] == 2 ? TextDirection.rtl : TextDirection.ltr;
+ // textDirection = TextDirection.rtl;
+ // screenMaxDisplayPatients = json['screenMaxDisplayPatients'] ?? 16;
+ // TODO: Uncomment this screenMaxDisplayPatients
+ screenMaxDisplayPatients = 16;
voiceLanguageEnum = (json['voiceLanguage'] as int).toLanguageEnum();
voiceLanguageText = json['voiceLanguageText'];
- screenMaxDisplayPatients = json['screenMaxDisplayPatients'] ?? 10;
isNotiReq = json['isNotiReq'];
prioritySMS = json['prioritySMS'];
priorityWhatsApp = json['priorityWhatsApp'];
- priorityEmail = json['priorityEmail'];
+ priorityEmail = json['priorityEmail'];
ticketNoText = json['ticketNoText'] ?? "Ticket Number";
postVoiceText = json['pleaseVisitCounterText'] ?? "Please Visit Counter";
- counterText = json['counterText'];
- roomText = json['roomText'];
roomNo = json['roomNo'];
isRoomNoRequired = json['isRoomNoReq'] ?? true;
- queueNoText = json['queueNoText'];
- callForText = json['callForText'];
- currentServeText = json['currentServeText'];
+ queueNoTextEng = json['queueNoText'];
+ callForTextEng = json['callForText'];
+ counterTextEng = json['counterText'];
+ roomTextEng = json['roomText'];
+ queueNoTextArb = json['queueNoTextAr'] ?? "الرقم";
+ callForTextArb = json['callForTextAr'] ?? "التوجه إلى";
+ counterTextArb = json['counterTextAr'] ?? "";
+ roomTextArb = json['roomTextAr'] ?? "الغرفة";
+ currentServeTextEng = json['currentServeText'];
+ currentServeTextArb = json['currentServeTextAr'] ?? "يتم خدمة";
maxText = json['maxText'] ?? "";
minText = json['minText'] ?? "";
- nextPrayerText = json['nextPrayerText'] ?? "";
+ nextPrayerTextEng = json['nextPrayerText'] ?? "Next Prayer";
+ nextPrayerTextArb = json['nextPrayerTextArb'] ?? "الصلاة القادمة";
weatherText = json['weatherText'] ?? "Weather";
- fajarText = json['fajarText'];
- dhuhrText = json['dhuhrText'];
- asarText = json['asarText'];
- maghribText = json['maghribText'];
- ishaText = json['ishaText'];
+ fajarTextEng = json['fajarText'];
+ dhuhrTextEng = json['dhuhrText'];
+ asarTextEng = json['asarText'];
+ maghribTextEng = json['maghribText'];
+ ishaTextEng = json['ishaText'];
+ fajarTextArb = json['fajarTextAr'] ?? AppStrings.prayersArray[0];
+ dhuhrTextArb = json['dhuhrTextAr'] ?? AppStrings.prayersArray[1];
+ asarTextArb = json['asarTextAr'] ?? AppStrings.prayersArray[2];
+ maghribTextArb = json['maghribTextAr'] ?? AppStrings.prayersArray[3];
+ ishaTextArb = json['ishaTextAr'] ?? AppStrings.prayersArray[4];
isActive = json['isActive'];
createdBy = json['createdBy'];
createdOn = json['createdOn'];
@@ -213,25 +271,31 @@ class GlobalConfigurationsModel {
} else {
kioskLanguageConfigList = [];
}
- vitalSignText = json['vitalSignText'];
- doctorText = json['doctorText'];
- procedureText = json['procedureText'];
- vaccinationText = json['vaccinationText'];
- nebulizationText = json['nebulizationText'];
- callForVitalSignText = json['callForVitalSignText'];
- callForDoctorText = json['callForDoctorText'];
- callForProcedureText = json['callForProcedureText'];
- callForVaccinationText = json['callForVaccinationText'];
- callForNebulizationText = json['callForNebulizationText'];
+ vitalSignTextEng = json['vitalSignText'];
+ doctorTextEng = json['doctorText'];
+ procedureTextEng = json['procedureText'];
+ vaccinationTextEng = json['vaccinationText'];
+ nebulizationTextEng = json['nebulizationText'];
+ callForVitalSignTextEng = json['callForVitalSignText'];
+ callForDoctorTextEng = json['callForDoctorText'];
+ callForProcedureTextEng = json['callForProcedureText'];
+ callForVaccinationTextEng = json['callForVaccinationText'];
+ callForNebulizationTextEng = json['callForNebulizationText'];
+
+ vitalSignTextArb = json['vitalSignTextAr'] ?? "غرفة العلامات الحيوية";
+ doctorTextArb = json['doctorTextAr'] ?? " غرفة الطبيب";
+ procedureTextArb = json['procedureTextAr'] ?? "غرفة الإجراء";
+ vaccinationTextArb = json['vaccinationTextAr'] ?? "غرفة التطعيم";
+ nebulizationTextArb = json['nebulizationTextAr'] ?? "غرفة البخاخة";
+ callForVitalSignTextArb = json['callForVitalSignTextAr'] ?? " غرفة استدعاء للعلامات الحيوية";
+ callForDoctorTextArb = json['callForDoctorTextAr'] ?? "الرجاء التوّه إلى غرفة الطبيب";
+ callForProcedureTextArb = json['callForProcedureTextAr'] ?? "الرجاء التوجّه إلى غرفة الإجراء";
+ callForVaccinationTextArb = json['callForVaccinationTextAr'] ?? "الرجاء لتوجّه إلى غرفة التطعيم";
+ callForNebulizationTextArb = json['callForNebulizationTextAr'] ?? "الرجاء التوجّه إلى غرفة البخاخة";
}
@override
String toString() {
- return 'GlobalConfigurationsModel{id: $id, configType: $configType, description: $description, counterStart: $counterStart, counterEnd: $counterEnd, concurrentCallDelaySec: $concurrentCallDelaySec, voiceType: $voiceType, voiceTypeText: $voiceTypeText, screenLanguageEnum: $screenLanguageEnum, screenLanguageText: $screenLanguageText, textDirection: $textDirection, voiceLanguageEnum: $voiceLanguageEnum, voiceLanguageText: $voiceLanguageText, screenMaxDisplayPatients: $screenMaxDisplayPatients, isNotiReq: $isNotiReq, prioritySMS: $prioritySMS, priorityWhatsApp: $priorityWhatsApp, priorityEmail: $priorityEmail, ticketNoText: $ticketNoText, postVoiceText: $postVoiceText, roomText: $roomText, roomNo: $roomNo, isRoomNoRequired: $isRoomNoRequired, counterText: $counterText, queueNoText: $queueNoText, callForText: $callForText, currentServeText: $currentServeText, maxText: $maxText, minText: $minText, nextPrayerText: $nextPrayerText, weatherText: $weatherText, fajarText: $fajarText, dhuhrText: $dhuhrText, asarText: $asarText, maghribText: $maghribText, ishaText: $ishaText, isActive: $isActive, createdBy: $createdBy, createdOn: $createdOn, editedBy: $editedBy, editedOn: $editedOn, isToneReq: $isToneReq, isVoiceReq: $isVoiceReq, orientationTypeEnum: $orientationTypeEnum, isTurnOn: $isTurnOn, waitingAreaType: $waitingAreaType, gender: $gender, isWeatherReq: $isWeatherReq, isPrayerTimeReq: $isPrayerTimeReq, isRssFeedReq: $isRssFeedReq, qTypeEnum: $qTypeEnum, screenTypeEnum: $screenTypeEnum, projectID: $projectID, projectLatitude: $projectLatitude, projectLongitude: $projectLongitude, cityKey: $cityKey, kioskQueueList: $kioskQueueList, kioskLanguageConfigList: $kioskLanguageConfigList, vitalSignText: $vitalSignText, doctorText: $doctorText, procedureText: $procedureText, vaccinationText: $vaccinationText, nebulizationText: $nebulizationText, callForVitalSignText: $callForVitalSignText, callForDoctorText: $callForDoctorText, callForProcedureText: $callForProcedureText, callForVaccinationText: $callForVaccinationText, callForNebulizationText: $callForNebulizationText}';
+ return 'GlobalConfigurationsModel{id: $id, configType: $configType, description: $description, counterStart: $counterStart, counterEnd: $counterEnd, concurrentCallDelaySec: $concurrentCallDelaySec, voiceType: $voiceType, voiceTypeText: $voiceTypeText, screenLanguageEnum: $screenLanguageEnum, screenLanguageText: $screenLanguageText, textDirection: $textDirection, voiceLanguageEnum: $voiceLanguageEnum, voiceLanguageText: $voiceLanguageText, screenMaxDisplayPatients: $screenMaxDisplayPatients, isNotiReq: $isNotiReq, prioritySMS: $prioritySMS, priorityWhatsApp: $priorityWhatsApp, priorityEmail: $priorityEmail, ticketNoText: $ticketNoText, postVoiceText: $postVoiceText, roomText: $roomTextEng, roomNo: $roomNo, isRoomNoRequired: $isRoomNoRequired, counterText: $counterTextEng, queueNoText: $queueNoTextEng, callForText: $callForTextEng, currentServeTextArb: $currentServeTextArb,, currentServeTextEng: $currentServeTextEng, maxText: $maxText, minText: $minText, nextPrayerTextEng: $nextPrayerTextEng, nextPrayerTextArb: $nextPrayerTextArb, weatherText: $weatherText, fajarText: $fajarTextEng, dhuhrText: $dhuhrTextEng, asarText: $asarTextEng, maghribText: $maghribTextEng, ishaText: $ishaTextEng, isActive: $isActive, createdBy: $createdBy, createdOn: $createdOn, editedBy: $editedBy, editedOn: $editedOn, isToneReq: $isToneReq, isVoiceReq: $isVoiceReq, orientationTypeEnum: $orientationTypeEnum, isTurnOn: $isTurnOn, waitingAreaType: $waitingAreaType, gender: $gender, isWeatherReq: $isWeatherReq, isPrayerTimeReq: $isPrayerTimeReq, isRssFeedReq: $isRssFeedReq, qTypeEnum: $qTypeEnum, screenTypeEnum: $screenTypeEnum, projectID: $projectID, projectLatitude: $projectLatitude, projectLongitude: $projectLongitude, cityKey: $cityKey, kioskQueueList: $kioskQueueList, kioskLanguageConfigList: $kioskLanguageConfigList, vitalSignText: $vitalSignTextEng, doctorText: $doctorTextEng, procedureText: $procedureTextEng, vaccinationText: $vaccinationTextEng, nebulizationText: $nebulizationTextEng, callForVitalSignText: $callForVitalSignTextEng, callForDoctorText: $callForDoctorTextEng, callForProcedureText: $callForProcedureTextEng, callForVaccinationText: $callForVaccinationTextEng, callForNebulizationText: $callForNebulizationTextEng, vitalSignTextArb: $vitalSignTextArb, doctorTextArb: $doctorTextArb, procedureTextArb: $procedureTextArb, vaccinationTextArb: $vaccinationTextArb, nebulizationTextArb: $nebulizationTextArb, callForVitalSignTextArb: $callForVitalSignTextArb, callForDoctorTextArb: $callForDoctorTextArb, callForProcedureTextArb: $callForProcedureTextArb, callForVaccinationTextArb: $callForVaccinationTextArb, callForNebulizationTextArb: $callForNebulizationTextArb}';
}
}
-
-// {
-// "latitude": 24.722136,
-// "longitude": 46.774303
-// }
diff --git a/lib/repositories/screen_details_repo.dart b/lib/repositories/screen_details_repo.dart
index 06f6de5..29c689a 100644
--- a/lib/repositories/screen_details_repo.dart
+++ b/lib/repositories/screen_details_repo.dart
@@ -50,7 +50,6 @@ class ScreenDetailsRepoImp implements ScreenDetailsRepo {
List globalConfigurationsModel = List.generate(genericModel.data.length, (index) => GlobalConfigurationsModel.fromJson(json: genericModel.data[index]));
if (globalConfigurationsModel.isNotEmpty) {
loggerService.logToFile(message: globalConfigurationsModel.toString(), type: LogTypeEnum.data, source: "getGlobalScreenConfigurations-> screen_details_repo.dart");
-
return globalConfigurationsModel.first;
}
return null;
diff --git a/lib/services/logger_service.dart b/lib/services/logger_service.dart
index 7792d6f..5b61383 100644
--- a/lib/services/logger_service.dart
+++ b/lib/services/logger_service.dart
@@ -47,7 +47,7 @@ class LoggerServiceImp implements LoggerService {
if (lastLogsClearedAt != null &&
now.difference(lastLogsClearedAt).inHours >= AppConstants.clearLogsHoursThreshold) {
- final clearingMessage = "[$timestamp] [SOURCE: $source] ${type.name.toUpperCase()}: LOGS HAVE BEEN CLEARED";
+ final clearingMessage = "[$timestamp] [SOURCE: $source] ${type.name.toUpperCase()}: LOGS HAVE BEEN CLEARED\n";
await file.writeAsString(clearingMessage);
screenConfigViewModel.lastTimeLogsCleared = now;
cacheService.setLastTimeLogsCleared(lastTimeCleared: now.millisecondsSinceEpoch);
diff --git a/lib/utilities/extensions.dart b/lib/utilities/extensions.dart
index 307c365..ba9b4e0 100644
--- a/lib/utilities/extensions.dart
+++ b/lib/utilities/extensions.dart
@@ -38,9 +38,11 @@ extension NavigationExt on BuildContext {
navigateReplaceTo(String route) {
Navigator.pushReplacementNamed(this, route);
}
+
navigateTo(String route) {
Navigator.pushNamed(this, route);
}
+
popScreen() => Navigator.of(this).pop();
}
@@ -55,11 +57,9 @@ extension ScreenOrientationExt on ScreenOrientationEnum {
return 2;
case ScreenOrientationEnum.landscapeLeft:
return 4;
- default:
- return 0;
}
}
-}
+}
extension QTypeEnumExtension on int {
QTypeEnum toQTypeEnum() {
@@ -146,19 +146,16 @@ extension LanguageEnumToString on LanguageEnum {
return "en-US";
case LanguageEnum.arabic:
return "ar-SA";
- default:
- return "en-US";
}
}
}
-
extension XCallType on CallTypeEnum {
Color getColorByCallType() {
if (this == CallTypeEnum.vitalSign) {
- return AppColors.vitalSignColor;
+ return AppColors.newVitalSignColor;
} else if (this == CallTypeEnum.doctor) {
- return AppColors.doctorColor;
+ return AppColors.newDoctorColor;
} else if (this == CallTypeEnum.procedure) {
return AppColors.procedureColor;
} else if (this == CallTypeEnum.vaccination) {
@@ -170,32 +167,46 @@ extension XCallType on CallTypeEnum {
}
}
- String getMessageByCallType(GlobalConfigurationsModel globalConfig, {bool isListView = false}) {
+ String getMessageByCallTypeForEnglish(GlobalConfigurationsModel globalConfig, {bool isListView = false}) {
switch (this) {
case CallTypeEnum.vitalSign:
- return !isListView ? globalConfig.callForVitalSignText : globalConfig.vitalSignText;
+ return !isListView ? globalConfig.callForVitalSignTextEng : globalConfig.vitalSignTextEng;
case CallTypeEnum.doctor:
- return !isListView ? globalConfig.callForDoctorText : globalConfig.doctorText;
+ return !isListView ? globalConfig.callForDoctorTextEng : globalConfig.doctorTextEng;
case CallTypeEnum.procedure:
- return !isListView ? globalConfig.callForProcedureText : globalConfig.procedureText;
+ return !isListView ? globalConfig.callForProcedureTextEng : globalConfig.procedureTextEng;
case CallTypeEnum.vaccination:
- return !isListView ? globalConfig.callForVaccinationText : globalConfig.vaccinationText;
+ return !isListView ? globalConfig.callForVaccinationTextEng : globalConfig.vaccinationTextEng;
case CallTypeEnum.nebulization:
- return !isListView ? globalConfig.callForNebulizationText : globalConfig.nebulizationText;
+ return !isListView ? globalConfig.callForNebulizationTextEng : globalConfig.nebulizationTextEng;
case CallTypeEnum.none:
- return !isListView ? globalConfig.callForVitalSignText : globalConfig.vitalSignText;
+ return !isListView ? globalConfig.callForVitalSignTextEng : globalConfig.vitalSignTextEng;
+ }
+ }
- default:
- return globalConfig.callForVitalSignText;
+ String getMessageByCallTypeForArabic(GlobalConfigurationsModel globalConfig, {bool isListView = false}) {
+ switch (this) {
+ case CallTypeEnum.vitalSign:
+ return !isListView ? globalConfig.callForVitalSignTextArb : globalConfig.vitalSignTextArb;
+ case CallTypeEnum.doctor:
+ return !isListView ? globalConfig.callForDoctorTextArb : globalConfig.doctorTextArb;
+ case CallTypeEnum.procedure:
+ return !isListView ? globalConfig.callForProcedureTextArb : globalConfig.procedureTextArb;
+ case CallTypeEnum.vaccination:
+ return !isListView ? globalConfig.callForVaccinationTextArb : globalConfig.vaccinationTextArb;
+ case CallTypeEnum.nebulization:
+ return !isListView ? globalConfig.callForNebulizationTextArb : globalConfig.nebulizationTextArb;
+ case CallTypeEnum.none:
+ return !isListView ? globalConfig.callForVitalSignTextArb : globalConfig.vitalSignTextArb;
}
}
SvgPicture getIconByCallType(double height, {double? width, BoxFit fit = BoxFit.contain}) {
String iconPath = "";
if (this == CallTypeEnum.vitalSign) {
- iconPath = AppAssets.vitalSignIcon;
+ iconPath = AppAssets.newVitalSignIcon;
} else if (this == CallTypeEnum.doctor) {
- iconPath = AppAssets.doctorIcon;
+ iconPath = AppAssets.newDoctorIcon;
} else if (this == CallTypeEnum.procedure) {
iconPath = AppAssets.procedureIcon;
} else if (this == CallTypeEnum.vaccination) {
@@ -230,6 +241,23 @@ extension XCallType on CallTypeEnum {
}
}
+ List getGradientComboByCallType() {
+ switch (this) {
+ case CallTypeEnum.vitalSign:
+ return AppColors.gradientBorderComboForVitalSigns;
+ case CallTypeEnum.doctor:
+ return AppColors.gradientBorderComboForDoctor;
+ case CallTypeEnum.procedure:
+ return AppColors.gradientBorderComboForVitalSigns;
+ case CallTypeEnum.vaccination:
+ return AppColors.gradientBorderComboForVitalSigns;
+ case CallTypeEnum.nebulization:
+ return AppColors.gradientBorderComboForVitalSigns;
+ case CallTypeEnum.none:
+ return AppColors.gradientBorderComboForVitalSigns;
+ }
+ }
+
String getCallTextFromCallType(TicketData ticket) {
switch (this) {
case CallTypeEnum.vitalSign:
diff --git a/lib/utilities/lifecycle_handler.dart b/lib/utilities/lifecycle_handler.dart
index da3142b..1bc2e4d 100644
--- a/lib/utilities/lifecycle_handler.dart
+++ b/lib/utilities/lifecycle_handler.dart
@@ -1,7 +1,6 @@
import 'package:flutter/widgets.dart';
import 'package:hmg_qline/config/dependency_injection.dart';
import 'package:hmg_qline/services/logger_service.dart';
-import 'package:hmg_qline/utilities/enums.dart';
class LifecycleHandler extends WidgetsBindingObserver {
final void Function()? onResumed;
@@ -18,6 +17,7 @@ class LifecycleHandler extends WidgetsBindingObserver {
this.onHidden,
});
+
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
LoggerService loggerService = getIt.get();
diff --git a/lib/utilities/native_method_handler.dart b/lib/utilities/native_method_handler.dart
index 1a5dc5a..c16bdcb 100644
--- a/lib/utilities/native_method_handler.dart
+++ b/lib/utilities/native_method_handler.dart
@@ -6,7 +6,6 @@ import 'package:restart_app/restart_app.dart';
abstract class NativeMethodChannelService {
void reopenApp();
-
void restartApp();
}
diff --git a/lib/view_models/queuing_view_model.dart b/lib/view_models/queuing_view_model.dart
index 665af4d..f90fb71 100644
--- a/lib/view_models/queuing_view_model.dart
+++ b/lib/view_models/queuing_view_model.dart
@@ -192,7 +192,6 @@ class QueuingViewModel extends ChangeNotifier {
}
Future testSpeech() async {
-
textToSpeechService.speechTextTest(MockJsonRepo.ticket);
}
diff --git a/lib/view_models/screen_config_view_model.dart b/lib/view_models/screen_config_view_model.dart
index 7422fb7..03d805e 100644
--- a/lib/view_models/screen_config_view_model.dart
+++ b/lib/view_models/screen_config_view_model.dart
@@ -4,7 +4,6 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:hmg_qline/config/dependency_injection.dart';
import 'package:hmg_qline/constants/app_constants.dart';
-import 'package:hmg_qline/main.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_language_config_model.dart';
@@ -55,10 +54,12 @@ class ScreenConfigViewModel extends ChangeNotifier {
Future onAppPaused() async {
loggerService.logToFile(message: "[didChangeAppLifecycleState] : [onAppPaused]", source: "onAppPaused -> screen_config_view_model.dart", type: LogTypeEnum.data);
+ nativeMethodChannelService.restartApp();
+ }
- // nativeMethodChannelService.reopenApp();
+ Future onAppDetached() async {
+ loggerService.logToFile(message: "[didChangeAppLifecycleState] : [onAppDetached]", source: "onAppDetached -> screen_config_view_model.dart", type: LogTypeEnum.data);
nativeMethodChannelService.restartApp();
- // runApp(const MyApp());
}
Future waitForIPAndInitializeConfigVM() async {
@@ -226,7 +227,9 @@ class ScreenConfigViewModel extends ChangeNotifier {
notifyListeners();
}
- String nextPrayerToShowWithTime = '';
+ String nextPrayerTime = '';
+ String nextPrayerToShowEng = '';
+ String nextPrayerToShowArb = '';
void getNextPrayerToShow() async {
final current = DateTime.now();
@@ -246,39 +249,55 @@ class ScreenConfigViewModel extends ChangeNotifier {
if (prayersWidgetModel.fajr != null && prayersWidgetModel.fajr!.toDateTimeFromInt().isAfter(current)) {
final namazTime = prayersWidgetModel.fajr!.toFormattedDateTimeFromInt();
- nextPrayerToShowWithTime = "${globalConfigurationsModel.fajarText} at $namazTime";
+ nextPrayerTime = namazTime;
+ nextPrayerToShowEng = "${globalConfigurationsModel.fajarTextEng}";
+ nextPrayerToShowArb = "${globalConfigurationsModel.fajarTextArb}";
notifyListeners();
return;
}
if (prayersWidgetModel.dhuhr != null && prayersWidgetModel.dhuhr!.toDateTimeFromInt().isAfter(current)) {
final namazTime = prayersWidgetModel.dhuhr!.toFormattedDateTimeFromInt();
- nextPrayerToShowWithTime = "${globalConfigurationsModel.dhuhrText} at $namazTime";
+ nextPrayerTime = namazTime;
+ nextPrayerToShowEng = "${globalConfigurationsModel.dhuhrTextEng}";
+ nextPrayerToShowArb = "${globalConfigurationsModel.dhuhrTextArb}";
+
notifyListeners();
return;
}
if (prayersWidgetModel.asr != null && prayersWidgetModel.asr!.toDateTimeFromInt().isAfter(current)) {
final namazTime = prayersWidgetModel.asr!.toFormattedDateTimeFromInt();
- nextPrayerToShowWithTime = "${globalConfigurationsModel.asarText} at $namazTime";
+ nextPrayerTime = namazTime;
+ nextPrayerToShowEng = "${globalConfigurationsModel.asarTextEng}";
+ nextPrayerToShowArb = "${globalConfigurationsModel.asarTextArb}";
+
notifyListeners();
return;
}
if (prayersWidgetModel.maghrib != null && prayersWidgetModel.maghrib!.toDateTimeFromInt().isAfter(current)) {
final namazTime = prayersWidgetModel.maghrib!.toFormattedDateTimeFromInt();
- nextPrayerToShowWithTime = "${globalConfigurationsModel.maghribText} at $namazTime";
+ nextPrayerTime = namazTime;
+ nextPrayerToShowEng = "${globalConfigurationsModel.maghribTextEng}";
+ nextPrayerToShowArb = "${globalConfigurationsModel.maghribTextArb}";
+
notifyListeners();
return;
}
if (prayersWidgetModel.isha != null && prayersWidgetModel.isha!.toDateTimeFromInt().isAfter(current)) {
final namazTime = prayersWidgetModel.isha!.toFormattedDateTimeFromInt();
- nextPrayerToShowWithTime = "${globalConfigurationsModel.ishaText} at $namazTime";
+ nextPrayerTime = namazTime;
+ nextPrayerToShowEng = "${globalConfigurationsModel.ishaTextEng}";
+ nextPrayerToShowArb = "${globalConfigurationsModel.ishaTextArb}";
+
notifyListeners();
return;
}
- final namazTime = prayersWidgetModel.fajr!.toFormattedDateTimeFromInt();
- nextPrayerToShowWithTime = "${globalConfigurationsModel.fajarText} at $namazTime";
- notifyListeners();
- return;
+ final namazTime = prayersWidgetModel.fajr!.toFormattedDateTimeFromInt();
+ nextPrayerTime = namazTime;
+ nextPrayerToShowEng = "${globalConfigurationsModel.fajarTextEng}";
+ nextPrayerToShowArb = "${globalConfigurationsModel.fajarTextArb}";
+ notifyListeners();
+ return;
}
int counter = 0;
@@ -298,13 +317,13 @@ class ScreenConfigViewModel extends ChangeNotifier {
return;
}
- _midnightTimer = Timer.periodic(const Duration(minutes: 1), (timer) async {
+ _midnightTimer = Timer.periodic(const Duration(minutes: 10), (timer) async {
counter++;
DateTime now = DateTime.now();
log("counterValue: $counter");
- // Every hour, update RSS feed if required
- if (counter % 60 == 0 && globalConfigurationsModel.isRssFeedReq) {
+ // Every Two hour, update RSS feed if required
+ if (counter % 12 == 0 && globalConfigurationsModel.isRssFeedReq) {
await getRssFeedDetailsFromServer();
}
@@ -314,6 +333,7 @@ class ScreenConfigViewModel extends ChangeNotifier {
// At midnight, update weather and prayer details if required
if (now.day != lastChecked.day) {
if (now.difference(now.copyWith(hour: 0, minute: 0, second: 0, millisecond: 0, microsecond: 0)).inMinutes >= 5) {
+ nativeMethodChannelService.restartApp();
if (globalConfigurationsModel.isWeatherReq) {
await getWeatherDetailsFromServer();
}
diff --git a/lib/views/common_widgets/app_footer.dart b/lib/views/common_widgets/app_footer.dart
index 2db283d..c09d402 100644
--- a/lib/views/common_widgets/app_footer.dart
+++ b/lib/views/common_widgets/app_footer.dart
@@ -1,6 +1,8 @@
import 'package:flutter/material.dart';
+import 'package:flutter_svg/svg.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_general_widgets.dart';
import 'package:marquee/marquee.dart';
import 'package:provider/provider.dart';
import 'package:hmg_qline/constants/app_constants.dart';
@@ -11,110 +13,187 @@ import 'package:hmg_qline/views/view_helpers/size_config.dart';
class AppFooter extends StatelessWidget {
const AppFooter({super.key});
+ Widget _buildStatusRow(String label, bool isConnected) {
+ return Row(
+ children: [
+ AppText(
+ "$label:",
+ fontSize: SizeConfig.getWidthMultiplier()! * 1.5,
+ ),
+ AppText(
+ " ${isConnected ? "Connected" : "Disconnected"}",
+ fontSize: SizeConfig.getWidthMultiplier()! * 1.5,
+ color: isConnected ? AppColors.greenColor : AppColors.redColor,
+ ),
+ ],
+ );
+ }
+
+ Widget _buildPrayerColumn(String label, String prayerName, {bool isForArabic = false}) {
+ return Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ AppText(
+ label,
+ fontSize: SizeConfig.getWidthMultiplier()! * 1.8,
+ fontFamily: isForArabic ? AppStrings.fontNameGesTwo : AppStrings.fontNamePoppins,
+ ),
+ AppText(
+ prayerName,
+ fontSize: SizeConfig.getWidthMultiplier()! * 2,
+ fontWeight: FontWeight.bold,
+ color: AppColors.darkGreyTextColor,
+ fontFamily: isForArabic ? AppStrings.fontNameGesTwo : AppStrings.fontNamePoppins,
+ ),
+ ],
+ );
+ }
+
@override
Widget build(BuildContext context) {
return Consumer(builder: (BuildContext context, ScreenConfigViewModel screenConfigVM, Widget? child) {
- return Container(
- color: Colors.grey.withOpacity(0.1),
- height: SizeConfig.getHeightMultiplier() * 0.7,
- width: double.infinity,
- child: Row(
- crossAxisAlignment: CrossAxisAlignment.center,
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Row(
- children: [
- const SizedBox(width: 20),
- Column(
- mainAxisAlignment: MainAxisAlignment.center,
- children: [
- AppText(
- AppStrings.poweredBy,
- fontSize: SizeConfig.getWidthMultiplier() * 2.5,
- ),
- Text("v${screenConfigVM.currentScreenIP}(${AppConstants.currentBuildVersion})",
- style: TextStyle(
- fontWeight: FontWeight.w500,
- fontSize: SizeConfig.getWidthMultiplier() * 1.5,
- )),
- // Row(
- // children: [
- // InkWell(
- // onTap: () {
- // screenConfigVM.updateCurrentScreenRotation(ScreenOrientationEnum.portraitUp);
- // },
- // child: Icon(
- // Icons.arrow_upward,
- // size: SizeConfig.getWidthMultiplier() * 2,
- // ),
- // ),
- // InkWell(
- // onTap: () {
- // screenConfigVM.updateCurrentScreenRotation(ScreenOrientationEnum.landscapeRight);
- // },
- // child: Icon(Icons.arrow_forward, size: SizeConfig.getWidthMultiplier() * 2),
- // ),
- // InkWell(
- // onTap: () {
- // screenConfigVM.updateCurrentScreenRotation(ScreenOrientationEnum.portraitDown);
- // },
- // child: Icon(
- // Icons.arrow_downward,
- // size: SizeConfig.getWidthMultiplier() * 2,
- // ),
- // ),
- // InkWell(
- // onTap: () {
- // screenConfigVM.updateCurrentScreenRotation(ScreenOrientationEnum.landscapeLeft);
- // },
- // child: Icon(
- // Icons.arrow_back,
- // size: SizeConfig.getWidthMultiplier() * 2,
- // ),
- // ),
- // ],
- // ),
- ],
- ),
- const SizedBox(width: 10),
- InkWell(
- onTap: () {
- // context.read().createAutoTickets(numOfTicketsToCreate: 20);
- },
- child: Image.asset(
- AppAssets.cloudLogo,
- height: SizeConfig.getHeightMultiplier() * 0.6,
+ bool isPortrait = screenConfigVM.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitUp ||
+ screenConfigVM.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitDown;
+ return Padding(
+ padding: EdgeInsets.symmetric(
+ horizontal: SizeConfig.getWidthMultiplier() * 4,
+ vertical: SizeConfig.getHeightMultiplier() * 0.14,
+ ),
+ child: Row(
+ children: [
+ Expanded(
+ flex: 3,
+ child: customShadowSmoothContainer(
+ height: SizeConfig.getHeightMultiplier() * 0.8,
+ padding: EdgeInsets.symmetric(
+ horizontal: SizeConfig.getWidthMultiplier() * 3,
+ vertical: SizeConfig.getHeightMultiplier() * 0.1,
+ ),
+ child: Row(
+ crossAxisAlignment: CrossAxisAlignment.end,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Row(
+ crossAxisAlignment: CrossAxisAlignment.end,
+ children: [
+ Padding(
+ padding: EdgeInsets.only(top: SizeConfig.getHeightMultiplier()! * 0.1),
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ AppText(
+ AppStrings.poweredBy,
+ fontSize: SizeConfig.getWidthMultiplier()! * 1.5,
+ fontWeight: FontWeight.w400,
+ color: AppColors.darkGreyTextColor,
+ ),
+ AppText(
+ "v${screenConfigVM.currentScreenIP.replaceAll(".", "").replaceAll("0", "-")}(${AppConstants.currentBuildVersion})",
+ fontSize: SizeConfig.getWidthMultiplier()! * 1,
+ fontWeight: FontWeight.w400,
+ color: AppColors.darkGreyTextColor,
+ ),
+ ],
+ ),
+ ),
+ SizedBox(width: SizeConfig.getWidthMultiplier()!),
+ Padding(
+ padding: EdgeInsets.only(bottom: SizeConfig.getHeightMultiplier()! * 0.06),
+ child: Image.asset(
+ AppAssets.cloudLogo,
+ height: isPortrait ? SizeConfig.getHeightMultiplier()! * 0.6 : SizeConfig.getHeightMultiplier()! * 0.4,
+ ),
+ ),
+ ],
),
- ),
- ],
+ Padding(
+ padding: isPortrait
+ ? EdgeInsets.only(
+ top: SizeConfig.getHeightMultiplier()! * 0.3,
+ )
+ : EdgeInsets.only(
+ top: SizeConfig.getHeightMultiplier()! * 0.15,
+ ),
+ child: isPortrait
+ ? Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ _buildStatusRow("Hub Status ", screenConfigVM.isHubConnected),
+ SizedBox(width: SizeConfig.getWidthMultiplier()! * 2),
+ _buildStatusRow("Network Status ", screenConfigVM.isInternetConnected),
+ ],
+ )
+ : Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ _buildStatusRow("Hub Status ", screenConfigVM.isHubConnected),
+ SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.05),
+ _buildStatusRow("Network Status ", screenConfigVM.isInternetConnected),
+ ],
+ ),
+ ),
+ ],
+ ),
),
- if (screenConfigVM.globalConfigurationsModel.isRssFeedReq && screenConfigVM.rssFeedModel.rssFeed != null && screenConfigVM.rssFeedModel.rssFeed!.isNotEmpty) ...[
- Expanded(
- child: Container(
- padding: const EdgeInsets.symmetric(horizontal: 10),
- child: Marquee(
- text: screenConfigVM.rssFeedModel.rssFeed ?? "",
- style: TextStyle(
- fontWeight: FontWeight.w500,
- fontSize: SizeConfig.getWidthMultiplier() * 4,
- fontFamily: AppStrings.fontNamePoppins,
- ),
- scrollAxis: Axis.horizontal,
- crossAxisAlignment: CrossAxisAlignment.center,
- blankSpace: 20.0,
- velocity: 100.0,
- pauseAfterRound: const Duration(seconds: 1),
- startPadding: 10.0,
- accelerationDuration: const Duration(seconds: 1),
- accelerationCurve: Curves.linear,
- decelerationDuration: const Duration(milliseconds: 500),
- decelerationCurve: Curves.easeOut,
+ ),
+ if (screenConfigVM.globalConfigurationsModel.isPrayerTimeReq) ...[
+ SizedBox(width: SizeConfig.getWidthMultiplier()! * 1.7),
+ Directionality(
+ textDirection: screenConfigVM.globalConfigurationsModel.textDirection,
+ child: Expanded(
+ flex: isPortrait ? 2 : 3,
+ child: customShadowSmoothContainer(
+ height: SizeConfig.getHeightMultiplier() * 0.8,
+ padding: EdgeInsets.symmetric(
+ horizontal: isPortrait ? SizeConfig.getWidthMultiplier() * 3 : SizeConfig.getWidthMultiplier() * 1.5,
+ vertical: SizeConfig.getHeightMultiplier() * 0.1,
+ ),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ AppText(
+ screenConfigVM.nextPrayerTime,
+ fontSize: SizeConfig.getWidthMultiplier()! * 3,
+ fontWeight: FontWeight.bold,
+ color: AppColors.newRedColor,
+ letterSpacing: 1.5,
+ ),
+ Row(
+ children: [
+ if (screenConfigVM.nextPrayerToShowEng.isNotEmpty) ...[
+ _buildPrayerColumn(screenConfigVM.globalConfigurationsModel.nextPrayerTextEng, "${screenConfigVM.nextPrayerToShowEng} "),
+ ],
+ if (screenConfigVM.nextPrayerToShowEng.isNotEmpty && screenConfigVM.nextPrayerToShowArb.isNotEmpty) ...[
+ Padding(
+ padding: EdgeInsets.fromLTRB(
+ SizeConfig.getWidthMultiplier()! * 0.1,
+ SizeConfig.getHeightMultiplier()! * 0.18,
+ SizeConfig.getWidthMultiplier()! * 0.1,
+ 0,
+ ),
+ child: AppText("|", fontSize: SizeConfig.getWidthMultiplier()! * 1.8, color: AppColors.darkGreyTextColor),
+ ),
+ ],
+ if (screenConfigVM.nextPrayerToShowArb.isNotEmpty) ...[
+ _buildPrayerColumn(screenConfigVM.globalConfigurationsModel.nextPrayerTextArb, screenConfigVM.nextPrayerToShowArb, isForArabic: true),
+ ],
+ ],
+ ),
+ if (isPortrait) ...[
+ SvgPicture.asset(
+ AppAssets.salahTimeIcon,
+ height: SizeConfig.getHeightMultiplier() * 0.5,
+ ),
+ ],
+ ],
),
),
- )
- ]
+ ),
+ ),
],
- ));
+ ],
+ ),
+ );
});
}
}
diff --git a/lib/views/common_widgets/app_general_widgets.dart b/lib/views/common_widgets/app_general_widgets.dart
index 48a4537..9f47ce5 100644
--- a/lib/views/common_widgets/app_general_widgets.dart
+++ b/lib/views/common_widgets/app_general_widgets.dart
@@ -1,12 +1,13 @@
-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/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';
+import 'package:marquee/marquee.dart';
+import 'package:zo_animated_border/zo_animated_border.dart';
Widget getWeatherWidget(ScreenConfigViewModel screenConfigViewModel) {
if (screenConfigViewModel.weathersWidgetModel.maxTemp == null || screenConfigViewModel.weathersWidgetModel.minTemp == null || screenConfigViewModel.weathersWidgetModel.iconPhrase == null) {
@@ -55,7 +56,7 @@ Widget getWeatherWidget(ScreenConfigViewModel screenConfigViewModel) {
}
Widget getPrayerWidget(ScreenConfigViewModel screenConfigViewModel) {
- if (screenConfigViewModel.nextPrayerToShowWithTime.isEmpty) {
+ if (screenConfigViewModel.nextPrayerTime.isEmpty) {
return const SizedBox.shrink();
}
return SizedBox(
@@ -77,13 +78,13 @@ Widget getPrayerWidget(ScreenConfigViewModel screenConfigViewModel) {
mainAxisAlignment: MainAxisAlignment.center,
children: [
AppText(
- screenConfigViewModel.globalConfigurationsModel.nextPrayerText,
+ screenConfigViewModel.globalConfigurationsModel.nextPrayerTextEng,
color: Colors.grey,
fontSize: SizeConfig.getWidthMultiplier() * 1.5,
fontFamily: screenConfigViewModel.globalConfigurationsModel.screenLanguageEnum == LanguageEnum.arabic ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins,
),
AppText(
- screenConfigViewModel.nextPrayerToShowWithTime,
+ screenConfigViewModel.nextPrayerTime,
fontSize: SizeConfig.getWidthMultiplier() * 2.7,
fontHeight: 1,
fontFamily: screenConfigViewModel.globalConfigurationsModel.screenLanguageEnum == LanguageEnum.arabic ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins,
@@ -268,3 +269,204 @@ Widget customShadowTextField({
),
);
}
+
+Widget engArabicTextWithSeparatorWidget({
+ required String englishText,
+ required String arabicText,
+ double? fontSize,
+ Color? color,
+ MainAxisAlignment? mainAxisAlignment,
+}) {
+ return Row(
+ mainAxisAlignment: mainAxisAlignment ?? MainAxisAlignment.start,
+ children: [
+ AppText(
+ englishText,
+ fontSize: fontSize ?? SizeConfig.getWidthMultiplier() * 2.6,
+ color: color ?? AppColors.darkGreyTextColor,
+ ),
+ AppText(
+ " | ",
+ fontSize: fontSize ?? SizeConfig.getWidthMultiplier() * 2.6,
+ color: color ?? AppColors.darkGreyTextColor,
+ ),
+ AppText(
+ arabicText,
+ color: color ?? AppColors.darkGreyTextColor,
+ fontSize: fontSize ?? SizeConfig.getWidthMultiplier() * 2.6,
+ fontFamily: AppStrings.fontNameGesTwo,
+ fontWeight: FontWeight.bold,
+ ),
+ ],
+ );
+}
+
+Widget customShadowSmoothContainer({
+ EdgeInsetsGeometry? padding,
+ EdgeInsetsGeometry? margin,
+ required Widget child,
+ double? height,
+ double? width,
+}) {
+ return Container(
+ padding: padding,
+ margin: margin,
+ height: height,
+ width: width,
+ alignment: Alignment.center,
+ decoration: BoxDecoration(
+ color: AppColors.whiteColor,
+ borderRadius: BorderRadius.circular(SizeConfig.widthMultiplier! * 1.2),
+ boxShadow: [
+ BoxShadow(
+ color: AppColors.smoothContainerShadow,
+ offset: const Offset(0, 4), // X: 0, Y: 4
+ blurRadius: 14,
+ spreadRadius: 0,
+ ),
+ ],
+ ),
+ child: child,
+ );
+}
+
+Widget customShadowSmoothContainerWithBackground({
+ EdgeInsetsGeometry? padding,
+ EdgeInsetsGeometry? margin,
+ required Widget child,
+ double? height,
+ double? width,
+ CallTypeEnum? callTypeEnum,
+}) {
+ callTypeEnum ??= CallTypeEnum.vitalSign;
+
+ List borderGradientCombo = [];
+ if (callTypeEnum == CallTypeEnum.vitalSign) {
+ borderGradientCombo = [
+ const Color(0xFFFFFFFF), // start
+ const Color(0xFFF2F3F4),
+ const Color(0xFFF2F3F4),
+ const Color(0xFFA5ADB4),
+ const Color(0xFFA5ADB4),
+ const Color(0xFF78848F),
+ ];
+ } else {
+ borderGradientCombo = [
+ const Color(0xFFFFFFFF), // start
+ const Color(0xFFAFEAD4), // start
+ const Color(0xFFAFEAD4), // start
+ const Color(0xFF42BB8D), // end
+ const Color(0xFF42BB8D), // end
+ const Color(0xFF42BB8D),
+ ];
+ }
+ return ZoAnimatedGradientBorder(
+ animationDuration: const Duration(seconds: 4),
+ glowOpacity: 0.0,
+ borderThickness: 8,
+ gradientColor: borderGradientCombo,
+ borderRadius: SizeConfig.getWidthMultiplier()! * 1.2,
+ child: Container(
+ padding: padding,
+ margin: margin,
+ height: height,
+ width: width,
+ alignment: Alignment.center,
+ decoration: BoxDecoration(
+ gradient: const LinearGradient(
+ begin: Alignment.topLeft,
+ end: Alignment.bottomRight,
+ colors: [
+ Color(0xFFECF1F4), // #ECF1F4 (0deg)
+ Color(0x71B1B7BC), // rgba(177, 183, 188, 0.445) (90deg)
+ Color(0x89BEBDC7), // rgba(190, 195, 199, 0.5375) (135deg)
+ Color(0xA1CBCFD3), // rgba(203, 207, 211, 0.63) (178.66deg)
+ Color(0xFFE5E7E9), // #E5E7E9 (270deg)
+ Color(0xFFF2F3F4), // #F2F3F4 (315deg)
+ Color(0xFFECF1F4), // #ECF1F4 (360deg)
+ ],
+ stops: [0.0, 0.25, 0.375, 0.496, 0.75, 0.875, 1.0],
+ ),
+ color: AppColors.whiteColor,
+ borderRadius: BorderRadius.circular(SizeConfig.getWidthMultiplier()! * 1.2),
+ boxShadow: [
+ BoxShadow(
+ color: AppColors.smoothContainerShadow,
+ offset: const Offset(0, 4), // X: 0, Y: 4
+ blurRadius: 14,
+ spreadRadius: 0,
+ ),
+ ],
+ ),
+ child: child),
+ );
+}
+
+Widget rssFeedWidget({required String feed}) {
+ return Expanded(
+ child: Container(
+ padding: const EdgeInsets.fromLTRB(10, 30, 10, 0),
+ child: Marquee(
+ text: feed,
+ style: TextStyle(
+ fontWeight: FontWeight.w400,
+ fontSize: SizeConfig.getWidthMultiplier() * 2,
+ fontFamily: AppStrings.fontNamePoppins,
+ ),
+ scrollAxis: Axis.horizontal,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ blankSpace: 20.0,
+ velocity: 100.0,
+ pauseAfterRound: const Duration(seconds: 1),
+ startPadding: 10.0,
+ accelerationDuration: const Duration(seconds: 1),
+ accelerationCurve: Curves.linear,
+ decelerationDuration: const Duration(milliseconds: 500),
+ decelerationCurve: Curves.easeOut,
+ ),
+ ),
+ );
+}
+
+Widget callTypeContainer({
+ EdgeInsetsGeometry? padding,
+ EdgeInsetsGeometry? margin,
+ required Widget child,
+ double? height,
+ double? width,
+ required Color color,
+ required TextDirection textDirection,
+ bool isDisableRightBorderRadius = true,
+}) {
+ final border = SizeConfig.getWidthMultiplier()! * 1;
+ return Container(
+ padding: padding,
+ margin: margin,
+ height: height,
+ width: width,
+ alignment: Alignment.center,
+ decoration: BoxDecoration(
+ color: color,
+ borderRadius: isDisableRightBorderRadius
+ ? textDirection == TextDirection.ltr
+ ? BorderRadius.only(
+ topLeft: Radius.circular(border),
+ bottomLeft: Radius.circular(border),
+ )
+ : BorderRadius.only(
+ topRight: Radius.circular(border),
+ bottomRight: Radius.circular(border),
+ )
+ : BorderRadius.circular(border),
+ boxShadow: [
+ BoxShadow(
+ color: AppColors.smoothContainerShadow,
+ offset: const Offset(0, 4), // X: 0, Y: 4
+ blurRadius: 14,
+ spreadRadius: 0,
+ ),
+ ],
+ ),
+ child: child,
+ );
+}
diff --git a/lib/views/common_widgets/app_header.dart b/lib/views/common_widgets/app_header.dart
index c52921d..9470370 100644
--- a/lib/views/common_widgets/app_header.dart
+++ b/lib/views/common_widgets/app_header.dart
@@ -5,6 +5,7 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:hmg_qline/models/global_config_model.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_general_widgets.dart';
import 'package:provider/provider.dart';
import 'package:hmg_qline/constants/app_constants.dart';
@@ -14,89 +15,41 @@ import 'package:hmg_qline/views/view_helpers/size_config.dart';
class AppHeader extends StatelessWidget implements PreferredSizeWidget {
const AppHeader({super.key});
- Widget networkStatusBar() {
- return Consumer(builder: (BuildContext context, ScreenConfigViewModel screenConfigVM, Widget? child) {
- return Container(
- color: Colors.grey.withOpacity(0.1),
- padding: EdgeInsets.symmetric(horizontal: SizeConfig.getWidthMultiplier() * 3),
- child: Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Row(
- children: [
- AppText(
- "Network Status :",
- fontSize: SizeConfig.getWidthMultiplier() * 2,
- ),
- AppText(
- " ${screenConfigVM.isInternetConnected ? "Connected" : "Disconnected"}",
- fontSize: SizeConfig.getWidthMultiplier() * 2.5,
- color: screenConfigVM.isInternetConnected ? AppColors.greenColor : AppColors.redColor,
- ),
- ],
- ),
- Row(
- children: [
- Row(
- children: [
- AppText(
- "Hub Status :",
- fontSize: SizeConfig.getWidthMultiplier() * 2,
- ),
- AppText(
- " ${screenConfigVM.isHubConnected ? "Connected" : "Disconnected"}",
- fontSize: SizeConfig.getWidthMultiplier() * 2.5,
- color: screenConfigVM.isHubConnected ? AppColors.greenColor : AppColors.redColor,
- ),
- ],
- ),
- ],
- ),
- ],
- ),
- );
- });
- }
-
@override
Widget build(BuildContext context) {
return Selector(
selector: (context, screenConfigViewModel) => screenConfigViewModel.globalConfigurationsModel,
builder: (BuildContext context, GlobalConfigurationsModel globalConfigurationsModel, Widget? child) {
- return Column(
- children: [
- Container(
- alignment: Alignment.center,
- height: SizeConfig.getHeightMultiplier() * 0.6,
- padding: const EdgeInsets.symmetric(horizontal: 20),
- decoration: BoxDecoration(color: globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment ? AppColors.redColor : AppColors.greenColor),
- child: Directionality(
- textDirection: globalConfigurationsModel.textDirection,
- child: Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- crossAxisAlignment: CrossAxisAlignment.center,
+ return Directionality(
+ textDirection: globalConfigurationsModel.textDirection,
+ child: Padding(
+ padding: EdgeInsets.symmetric(horizontal: SizeConfig.getWidthMultiplier() * 4),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.end,
children: [
- AppText(
- globalConfigurationsModel.currentServeText ?? "",
- color: Colors.white,
- fontSize: SizeConfig.getHeightMultiplier() * 0.4,
- fontFamily: globalConfigurationsModel.screenLanguageEnum == LanguageEnum.arabic ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins,
- ),
SvgPicture.asset(
- globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment ? AppAssets.hmgLogo : AppAssets.hmgLogoPharmacy,
- height: SizeConfig.getHeightMultiplier() * 0.5,
+ globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment ? AppAssets.hmgLogoFull : AppAssets.hmgLogoPharmacy,
+ height: SizeConfig.getHeightMultiplier() * 0.48,
),
],
),
- ),
+ engArabicTextWithSeparatorWidget(
+ englishText: globalConfigurationsModel.currentServeTextEng ?? "",
+ arabicText: globalConfigurationsModel.currentServeTextArb ?? "",
+ ),
+
+ // networkStatusBar(),
+ ],
),
- networkStatusBar(),
- ],
+ ),
);
},
);
}
@override
- Size get preferredSize => Size(double.maxFinite, SizeConfig.getHeightMultiplier());
+ Size get preferredSize => Size(double.maxFinite, SizeConfig.getHeightMultiplier() * 1.1);
}
diff --git a/lib/views/common_widgets/app_texts_widget.dart b/lib/views/common_widgets/app_texts_widget.dart
index 13a4d85..7c03a58 100644
--- a/lib/views/common_widgets/app_texts_widget.dart
+++ b/lib/views/common_widgets/app_texts_widget.dart
@@ -5,7 +5,7 @@ import 'package:hmg_qline/views/view_helpers/size_config.dart';
class AppText extends StatefulWidget {
final String text;
final String? variant;
- final Color color;
+ final Color? color;
final FontWeight? fontWeight;
final double? fontSize;
final double? fontHeight;
@@ -35,7 +35,7 @@ class AppText extends StatefulWidget {
const AppText(
this.text, {
super.key,
- this.color = Colors.black,
+ this.color,
this.fontWeight,
this.variant,
this.fontSize,
@@ -112,14 +112,14 @@ class AppTextState extends State {
style: widget.style != null
? _getFontStyle()?.copyWith(
fontStyle: widget.italic ? FontStyle.italic : null,
- color: widget.color,
+ color: widget.color ?? AppColors.darkGreyTextColor,
fontFamily: widget.fontFamily,
fontWeight: widget.fontWeight ?? _getFontWeight(),
height: widget.fontHeight,
)
: TextStyle(
fontStyle: widget.italic ? FontStyle.italic : null,
- color: widget.color,
+ color: widget.color ?? AppColors.darkGreyTextColor,
fontSize: widget.fontSize ?? _getFontSize(),
letterSpacing: widget.letterSpacing ?? (widget.variant == "overline" ? 1.5 : null),
fontWeight: widget.fontWeight ?? _getFontWeight(),
diff --git a/lib/views/main_queue_screen/components/priority_tickets.dart b/lib/views/main_queue_screen/components/priority_tickets.dart
index 3e2f8b3..9768d87 100644
--- a/lib/views/main_queue_screen/components/priority_tickets.dart
+++ b/lib/views/main_queue_screen/components/priority_tickets.dart
@@ -1,64 +1,421 @@
+// import 'dart:developer';
+//
+// import 'package:flutter/material.dart';
+// import 'package:hmg_qline/constants/app_constants.dart';
+// import 'package:hmg_qline/models/global_config_model.dart';
+// import 'package:hmg_qline/models/ticket_model.dart';
+// import 'package:hmg_qline/utilities/enums.dart';
+// import 'package:hmg_qline/views/common_widgets/app_general_widgets.dart';
+// import 'package:hmg_qline/views/main_queue_screen/components/ticket_item.dart';
+// import 'package:hmg_qline/views/main_queue_screen/components/ticket_item_calling_card.dart';
+// import 'package:hmg_qline/views/main_queue_screen/components/ticket_item_normal_card.dart';
+// import 'package:hmg_qline/views/view_helpers/size_config.dart';
+// import 'package:zo_animated_border/widget/zo_color_change_border.dart';
+//
+// class PriorityTickets extends StatelessWidget {
+// final List tickets;
+// final GlobalConfigurationsModel globalConfigurationsModel;
+//
+// const PriorityTickets({required this.tickets, required this.globalConfigurationsModel, super.key});
+//
+// @override
+// Widget build(BuildContext context) {
+// final TicketData firstTicket = tickets[0].ticketModel!;
+// TicketData? secondTicket;
+// List otherTickets = [];
+// if (tickets.length > 1) {
+// secondTicket = tickets[1].ticketModel!;
+// }
+//
+// if (tickets.length > 3) {
+// otherTickets = tickets.sublist(2, tickets.length);
+// }
+//
+// log("tickets: ${tickets.length}");
+//
+// return Directionality(
+// textDirection: globalConfigurationsModel.textDirection,
+// child: Column(
+// mainAxisAlignment: MainAxisAlignment.center,
+// crossAxisAlignment: CrossAxisAlignment.center,
+// children: [
+// if (tickets.length == 1) ...[
+// QueueItemCallingCard(
+// isGradientRequired: true,
+// isBorderRequired: true,
+// ticketNo: firstTicket.queueNo ?? '',
+// scale: globalConfigurationsModel.screenTypeEnum == ScreenTypeEnum.roomLevelScreen ? 2 : 1.2,
+// blink: true,
+// roomNo: firstTicket.roomNo ?? '',
+// roomText: (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment ? globalConfigurationsModel.roomTextEng : globalConfigurationsModel.counterTextEng) ?? "",
+// roomTextAr: (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment ? globalConfigurationsModel.roomTextArb : globalConfigurationsModel.counterTextArb) ?? "",
+// isClinicAdded: false,
+// callTypeEnum: firstTicket.callTypeEnum,
+// textDirection: globalConfigurationsModel.textDirection,
+// screenTypeEnum: globalConfigurationsModel.screenTypeEnum,
+// langTypeEnum: globalConfigurationsModel.screenLanguageEnum,
+// globalConfigurationsModel: globalConfigurationsModel,
+// ),
+// ],
+// if (tickets.length == 2) ...[
+// Row(
+// children: [
+// Expanded(
+// flex: 2,
+// child: QueueItemCallingCard(
+// isGradientRequired: true,
+// isBorderRequired: true,
+// ticketNo: firstTicket.queueNo ?? '',
+// scale: globalConfigurationsModel.screenTypeEnum == ScreenTypeEnum.roomLevelScreen ? 2 : 1.2,
+// blink: true,
+// roomNo: firstTicket.roomNo ?? '',
+// roomText: (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment ? globalConfigurationsModel.roomTextEng : globalConfigurationsModel.counterTextEng) ?? "",
+// roomTextAr: (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment ? globalConfigurationsModel.roomTextArb : globalConfigurationsModel.counterTextArb) ?? "",
+// isClinicAdded: false,
+// callTypeEnum: firstTicket.callTypeEnum,
+// textDirection: globalConfigurationsModel.textDirection,
+// screenTypeEnum: globalConfigurationsModel.screenTypeEnum,
+// langTypeEnum: globalConfigurationsModel.screenLanguageEnum,
+// globalConfigurationsModel: globalConfigurationsModel,
+// ),
+// ),
+// SizedBox(width: SizeConfig.getWidthMultiplier() * 2),
+// Expanded(
+// flex: 1,
+// child: QueueItemNormalCard(
+// ticketNo: secondTicket!.queueNo ?? '',
+// roomNo: secondTicket.roomNo ?? '',
+// roomText: (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment ? globalConfigurationsModel.roomTextEng : globalConfigurationsModel.counterTextEng) ?? "",
+// roomTextAr: (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment ? globalConfigurationsModel.roomTextArb : globalConfigurationsModel.counterTextArb) ?? "",
+// isClinicAdded: false,
+// callTypeEnum: secondTicket.callTypeEnum,
+// textDirection: globalConfigurationsModel.textDirection,
+// screenTypeEnum: globalConfigurationsModel.screenTypeEnum,
+// langTypeEnum: globalConfigurationsModel.screenLanguageEnum,
+// globalConfigurationsModel: globalConfigurationsModel,
+// ),
+// ),
+// ],
+// ),
+// ],
+// if (tickets.length > 2) ...[
+// Column(
+// children: [
+// Row(
+// children: [
+// Expanded(
+// flex: 2,
+// child: QueueItemCallingCard(
+// isGradientRequired: true,
+// isBorderRequired: true,
+// ticketNo: firstTicket.queueNo ?? '',
+// scale: globalConfigurationsModel.screenTypeEnum == ScreenTypeEnum.roomLevelScreen ? 2 : 1.2,
+// blink: true,
+// roomNo: firstTicket.roomNo ?? '',
+// roomText: (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment ? globalConfigurationsModel.roomTextEng : globalConfigurationsModel.counterTextEng) ?? "",
+// roomTextAr: (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment ? globalConfigurationsModel.roomTextArb : globalConfigurationsModel.counterTextArb) ?? "",
+// isClinicAdded: false,
+// callTypeEnum: firstTicket.callTypeEnum,
+// textDirection: globalConfigurationsModel.textDirection,
+// screenTypeEnum: globalConfigurationsModel.screenTypeEnum,
+// langTypeEnum: globalConfigurationsModel.screenLanguageEnum,
+// globalConfigurationsModel: globalConfigurationsModel,
+// ),
+// ),
+// SizedBox(width: SizeConfig.getWidthMultiplier() * 2),
+// Expanded(
+// flex: 1,
+// child: QueueItemNormalCard(
+// ticketNo: secondTicket!.queueNo ?? '',
+// roomNo: secondTicket.roomNo ?? '',
+// roomText: (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment ? globalConfigurationsModel.roomTextEng : globalConfigurationsModel.counterTextEng) ?? "",
+// roomTextAr: (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment ? globalConfigurationsModel.roomTextArb : globalConfigurationsModel.counterTextArb) ?? "",
+// isClinicAdded: false,
+// callTypeEnum: secondTicket.callTypeEnum,
+// textDirection: globalConfigurationsModel.textDirection,
+// screenTypeEnum: globalConfigurationsModel.screenTypeEnum,
+// langTypeEnum: globalConfigurationsModel.screenLanguageEnum,
+// globalConfigurationsModel: globalConfigurationsModel,
+// ),
+// ),
+// ],
+// ),
+// Padding(
+// padding: EdgeInsets.symmetric(vertical: SizeConfig.getHeightMultiplier() * 0.1),
+// child: engArabicTextWithSeparatorWidget(
+// englishText: globalConfigurationsModel.currentServeTextEng ?? "",
+// arabicText: globalConfigurationsModel.currentServeTextArb ?? "",
+// ),
+// ),
+// Row(
+// children: List.generate(
+// otherTickets.length,
+// (index) => Expanded(
+// child: Padding(
+// padding: EdgeInsets.only(right: index != otherTickets.length - 1 ? SizeConfig.getWidthMultiplier() * 2 : 0),
+// child: QueueItemNormalCard(
+// ticketNo: otherTickets[index].ticketModel!.queueNo ?? '',
+// roomNo: otherTickets[index].ticketModel!.roomNo ?? '',
+// roomText: (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment ? globalConfigurationsModel.roomTextEng : globalConfigurationsModel.counterTextEng) ?? "",
+// roomTextAr: (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment ? globalConfigurationsModel.roomTextArb : globalConfigurationsModel.counterTextArb) ?? "",
+// isClinicAdded: false,
+// callTypeEnum: otherTickets[index].ticketModel!.callTypeEnum,
+// textDirection: globalConfigurationsModel.textDirection,
+// screenTypeEnum: globalConfigurationsModel.screenTypeEnum,
+// langTypeEnum: globalConfigurationsModel.screenLanguageEnum,
+// globalConfigurationsModel: globalConfigurationsModel,
+// ),
+// ),
+// ),
+// ),
+// ),
+// ],
+// ),
+// ],
+// ],
+// ),
+// );
+// }
+// }
+
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:hmg_qline/models/global_config_model.dart';
import 'package:hmg_qline/models/ticket_model.dart';
import 'package:hmg_qline/utilities/enums.dart';
-import 'package:hmg_qline/views/main_queue_screen/components/ticket_item.dart';
+import 'package:hmg_qline/views/common_widgets/app_general_widgets.dart';
+import 'package:hmg_qline/views/main_queue_screen/components/ticket_item_calling_card.dart';
+import 'package:hmg_qline/views/main_queue_screen/components/ticket_item_normal_card.dart';
import 'package:hmg_qline/views/view_helpers/size_config.dart';
class PriorityTickets extends StatelessWidget {
final List tickets;
final GlobalConfigurationsModel globalConfigurationsModel;
- const PriorityTickets({required this.tickets, required this.globalConfigurationsModel, super.key});
+ const PriorityTickets({
+ required this.tickets,
+ required this.globalConfigurationsModel,
+ super.key,
+ });
@override
Widget build(BuildContext context) {
- final TicketData firstTicket = tickets[0].ticketModel!;
- final List otherTickets = tickets.sublist(1, tickets.length);
- return Column(
- mainAxisAlignment: MainAxisAlignment.center,
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- TicketItem(
- ticketNo: firstTicket.queueNo ?? '',
- scale: globalConfigurationsModel.screenTypeEnum == ScreenTypeEnum.roomLevelScreen ? 2 : 1.2,
- blink: true,
- roomNo: firstTicket.roomNo ?? '',
- roomText: (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment ? globalConfigurationsModel.roomText : globalConfigurationsModel.counterText) ?? "",
- isClinicAdded: false,
- callTypeEnum: firstTicket.callTypeEnum,
- textDirection: globalConfigurationsModel.textDirection,
- screenTypeEnum: globalConfigurationsModel.screenTypeEnum,
- langTypeEnum: globalConfigurationsModel.screenLanguageEnum,
- globalConfigurationsModel: globalConfigurationsModel,
+ log("tickets: ${tickets.length}");
+ return Directionality(
+ textDirection: globalConfigurationsModel.textDirection,
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: _buildTicketLayout(context),
+ ),
+ );
+ }
+
+ Widget _buildAnimatedTicket({required Widget child, required int delay, String? key}) {
+ return TweenAnimationBuilder(
+ key: key != null ? ValueKey(key) : null,
+ duration: Duration(milliseconds: 400 + delay),
+ tween: Tween(begin: 0.0, end: 1.0),
+ curve: Curves.easeOutCubic,
+ // Changed from elasticOut to prevent overshoot
+ builder: (context, value, child) {
+ final clampedValue = value.clamp(0.0, 1.0);
+
+ return Transform.scale(
+ scale: 0.8 + (clampedValue * 0.2), // Scale from 0.8 to 1.0 instead of 0 to 1
+ child: Opacity(
+ opacity: clampedValue,
+ child: child,
+ ),
+ );
+ },
+ child: child,
+ );
+ }
+
+ Widget _buildAnimatedOtherTicketsRow() {
+ final otherTickets = tickets.length > 2 ? tickets.sublist(2) : [];
+ if (otherTickets.isEmpty) return const SizedBox.shrink();
+
+ return Row(
+ children: List.generate(
+ otherTickets.length,
+ (index) => Expanded(
+ child: _buildAnimatedTicket(
+ key: 'other_ticket_${otherTickets[index].ticketModel?.queueNo ?? index}',
+ child: Padding(
+ padding: EdgeInsets.only(
+ right: (index != otherTickets.length - 1 && globalConfigurationsModel.textDirection == TextDirection.ltr) ? SizeConfig.getWidthMultiplier() * 2 : 0,
+ left: (index != otherTickets.length - 1 && globalConfigurationsModel.textDirection == TextDirection.rtl) ? SizeConfig.getWidthMultiplier() * 2 : 0,
+ ),
+ child: _buildSecondaryTicket(otherTickets[index]),
+ ),
+ delay: 200 + (index * 100),
+ ),
),
- if (tickets.length > 1) ...[
- Column(
- mainAxisAlignment: MainAxisAlignment.spaceAround,
- children: otherTickets.map((ticketDetailsModel) {
- TicketData ticketData = ticketDetailsModel.ticketModel!;
-
- return Padding(
- padding: EdgeInsets.only(top: SizeConfig.getHeightMultiplier() * 0.5),
- child: TicketItem(
- ticketNo: ticketData.queueNo ?? '',
- scale: 0.8,
- roomNo: ticketData.roomNo ?? '',
- roomText: (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment ? globalConfigurationsModel.roomText : globalConfigurationsModel.counterText) ?? "",
- isClinicAdded: false,
- callTypeEnum: ticketData.callTypeEnum,
- textDirection: globalConfigurationsModel.textDirection,
- screenTypeEnum: globalConfigurationsModel.screenTypeEnum,
- langTypeEnum: globalConfigurationsModel.screenLanguageEnum,
- globalConfigurationsModel: globalConfigurationsModel,
+ ),
+ );
+ }
+
+ List _buildTicketLayout(BuildContext context) {
+ if (tickets.isEmpty) return [];
+ log("tickets.length: ${tickets.length}");
+ switch (tickets.length) {
+ case 1:
+ return [
+ _buildAnimatedTicket(
+ child: _buildPrimaryTicket(context, tickets[0], isFullWidth: true),
+ delay: 0,
+ ),
+ ];
+
+ case 2:
+ return [
+ Row(
+ children: [
+ Expanded(
+ flex: 3,
+ child: _buildAnimatedTicket(
+ child: _buildPrimaryTicket(context, tickets[0]),
+ delay: 0,
+ ),
+ ),
+ _buildSpacing(),
+ Expanded(
+ flex: 2,
+ child: _buildAnimatedTicket(
+ child: _buildSecondaryTicket(tickets[1]),
+ delay: 150,
+ ),
+ ),
+ ],
+ ),
+ ];
+
+ default:
+ return [
+ Row(
+ children: [
+ Expanded(
+ flex: 2,
+ child: _buildAnimatedTicket(
+ child: _buildPrimaryTicket(context, tickets[0]),
+ delay: 0,
),
- );
- }).toList(),
- )
- ]
- ],
+ ),
+ _buildSpacing(),
+ Expanded(
+ flex: 1,
+ child: _buildAnimatedTicket(
+ child: _buildSecondaryTicket(tickets[1]),
+ delay: 100,
+ ),
+ ),
+ ],
+ ),
+ _buildCurrentServeText(),
+ _buildAnimatedOtherTicketsRow(),
+ ];
+ }
+ }
+
+ Widget _buildPrimaryTicket(BuildContext context, TicketDetailsModel ticket, {bool isFullWidth = false}) {
+ Widget primaryCallingCard = QueueItemCallingCard(
+ isGradientRequired: true,
+ isBorderRequired: true,
+ isSingleTicket: isFullWidth,
+ ticketNo: ticket.ticketModel?.queueNo ?? '',
+ scale: _getTicketScale(),
+ blink: true,
+ roomNo: ticket.ticketModel?.roomNo ?? '',
+ roomText: _getRoomText(),
+ roomTextAr: _getRoomTextAr(),
+ isClinicAdded: false,
+ callTypeEnum: ticket.ticketModel?.callTypeEnum ?? CallTypeEnum.vitalSign,
+ textDirection: globalConfigurationsModel.textDirection,
+ screenTypeEnum: globalConfigurationsModel.screenTypeEnum,
+ langTypeEnum: globalConfigurationsModel.screenLanguageEnum,
+ globalConfigurationsModel: globalConfigurationsModel,
);
+
+ if (isFullWidth) {
+ return Center(
+ child: ConstrainedBox(
+ constraints: BoxConstraints(
+ maxWidth: MediaQuery.of(context).size.width * 0.6, // 60% of screen width
+ minHeight: SizeConfig.getHeightMultiplier() * 2.5, // Minimum height
+ ),
+ child: Transform.scale(
+ scale: _getTicketScale() + 0.2,
+ child: primaryCallingCard,
+ ),
+ ),
+ );
+ }
+
+ return primaryCallingCard;
+ }
+
+ Widget _buildSecondaryTicket(TicketDetailsModel ticket) {
+ return QueueItemNormalCard(
+ ticketNo: ticket.ticketModel?.queueNo ?? '',
+ roomNo: ticket.ticketModel?.roomNo ?? '',
+ roomText: _getRoomText(),
+ roomTextAr: _getRoomTextAr(),
+ isClinicAdded: false,
+ callTypeEnum: ticket.ticketModel?.callTypeEnum ?? CallTypeEnum.vitalSign,
+ textDirection: globalConfigurationsModel.textDirection,
+ screenTypeEnum: globalConfigurationsModel.screenTypeEnum,
+ langTypeEnum: globalConfigurationsModel.screenLanguageEnum,
+ globalConfigurationsModel: globalConfigurationsModel,
+ );
+ }
+
+ Widget _buildOtherTicketsRow(TextDirection textDirection) {
+ final otherTickets = tickets.length > 2 ? tickets.sublist(2) : [];
+ if (otherTickets.isEmpty) return const SizedBox.shrink();
+
+ return Row(
+ children: List.generate(
+ otherTickets.length,
+ (index) => Expanded(
+ child: Padding(
+ padding: EdgeInsets.only(
+ right: (index != otherTickets.length - 1 && textDirection == TextDirection.ltr) ? SizeConfig.getWidthMultiplier() * 2 : 0,
+ left: (index != otherTickets.length - 1 && textDirection == TextDirection.rtl) ? SizeConfig.getWidthMultiplier() * 2 : 0,
+ ),
+ child: _buildSecondaryTicket(otherTickets[index]),
+ ),
+ ),
+ ),
+ );
+ }
+
+ Widget _buildCurrentServeText() {
+ return Padding(
+ padding: EdgeInsets.symmetric(vertical: SizeConfig.getHeightMultiplier() * 0.13),
+ child: engArabicTextWithSeparatorWidget(
+ englishText: globalConfigurationsModel.currentServeTextEng ?? "",
+ arabicText: globalConfigurationsModel.currentServeTextArb ?? "",
+ ),
+ );
+ }
+
+ Widget _buildSpacing() {
+ return SizedBox(width: SizeConfig.getWidthMultiplier() * 2);
+ }
+
+ // Helper methods to reduce repetition
+ double _getTicketScale() {
+ return globalConfigurationsModel.screenTypeEnum == ScreenTypeEnum.roomLevelScreen ? 2.0 : 1.2;
+ }
+
+ String _getRoomText() {
+ return globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment ? globalConfigurationsModel.roomTextEng ?? "" : globalConfigurationsModel.counterTextEng ?? "";
+ }
+
+ String _getRoomTextAr() {
+ return globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment ? globalConfigurationsModel.roomTextArb ?? "" : globalConfigurationsModel.counterTextArb ?? "";
}
}
diff --git a/lib/views/main_queue_screen/components/priority_tickets_sidelist.dart b/lib/views/main_queue_screen/components/priority_tickets_sidelist.dart
index 64a9019..c3777da 100644
--- a/lib/views/main_queue_screen/components/priority_tickets_sidelist.dart
+++ b/lib/views/main_queue_screen/components/priority_tickets_sidelist.dart
@@ -4,6 +4,7 @@ import 'package:hmg_qline/models/global_config_model.dart';
import 'package:hmg_qline/models/ticket_model.dart';
import 'package:hmg_qline/utilities/enums.dart';
import 'package:hmg_qline/utilities/extensions.dart';
+import 'package:hmg_qline/views/common_widgets/app_general_widgets.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/view_helpers/size_config.dart';
@@ -20,87 +21,68 @@ class PriorityTicketsWithSidelist extends StatelessWidget {
required this.screenOrientationEnum,
});
- @override
- Widget build(BuildContext context) {
- final priorityTickets = tickets.sublist(0, AppConstants.thresholdForListUI);
- final otherTickets = tickets.sublist(AppConstants.thresholdForListUI, tickets.length);
+ Widget ticketListItem({required TicketData? ticketModel}) {
+ final callMessageEng = (ticketModel?.callTypeEnum.getMessageByCallTypeForEnglish(globalConfigurationsModel, isListView: true)) ?? "";
+ final callMessageAr = (ticketModel?.callTypeEnum.getMessageByCallTypeForArabic(globalConfigurationsModel, isListView: true)) ?? "";
- final List children = [
- Expanded(flex: 7, child: PriorityTickets(globalConfigurationsModel: globalConfigurationsModel, tickets: priorityTickets)),
- Container(color: Colors.grey.withOpacity(0.1), width: 10, margin: const EdgeInsets.symmetric(horizontal: 10, vertical: 50)),
- Expanded(
- flex: 6,
- child: ListView(
- children: [
- Padding(
- padding: const EdgeInsets.fromLTRB(10, 0, 10, 10),
- child: Directionality(
- textDirection: globalConfigurationsModel.textDirection,
+ return Directionality(
+ textDirection: globalConfigurationsModel.textDirection,
+ child: Row(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Expanded(
+ flex: 3,
+ child: Center(
+ child: AppText(
+ ticketModel!.queueNo ?? "",
+ fontWeight: FontWeight.w500,
+ color: AppColors.greyTextColor,
+ fontSize: SizeConfig.getWidthMultiplier() * 2,
+ textAlign: TextAlign.center,
+ fontFamily: AppStrings.fontNamePoppins,
+ ),
+ ),
+ ),
+ if (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment) ...[
+ Expanded(
+ flex: 8,
+ child: SizedBox(
+ height: SizeConfig.getHeightMultiplier() * 0.25,
child: Row(
- crossAxisAlignment: CrossAxisAlignment.center,
- mainAxisAlignment: MainAxisAlignment.spaceAround,
+ mainAxisAlignment: MainAxisAlignment.center,
children: [
Expanded(
- flex: 5,
+ flex: 2,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
- AppText(
- globalConfigurationsModel.queueNoText ?? "",
- letterSpacing: -2,
- fontHeight: 0.5,
- fontWeight: FontWeight.bold,
- fontSize: SizeConfig.getWidthMultiplier() * 3.8,
- textAlign: TextAlign.center,
- fontFamily: globalConfigurationsModel.screenLanguageEnum == LanguageEnum.arabic ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins,
- ),
+ ticketModel.callTypeEnum.getIconByCallType(SizeConfig.getHeightMultiplier() * 0.2),
],
),
),
- Container(
- color: Colors.grey.withOpacity(0.5),
- width: 5,
- height: SizeConfig.getHeightMultiplier() * 0.3,
- margin: const EdgeInsets.symmetric(horizontal: 15),
- ),
- if (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment) ...[
- Expanded(
- flex: 5,
- child: Row(
- mainAxisAlignment: MainAxisAlignment.center,
- children: [
- AppText(
- globalConfigurationsModel.callForText ?? "",
- letterSpacing: -2,
- fontHeight: 0.5,
- fontWeight: FontWeight.bold,
- fontSize: SizeConfig.getWidthMultiplier() * 3.8,
- textAlign: TextAlign.center,
- ),
- ],
- ),
- ),
- Container(
- color: Colors.grey.withOpacity(0.5),
- width: 5,
- height: SizeConfig.getHeightMultiplier() * 0.3,
- margin: const EdgeInsets.symmetric(horizontal: 15),
- ),
- ],
Expanded(
- flex: 3,
+ flex: 9,
child: Row(
- mainAxisAlignment: MainAxisAlignment.center,
+ mainAxisAlignment: MainAxisAlignment.start,
children: [
AppText(
- (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment ? globalConfigurationsModel.roomText : globalConfigurationsModel.counterText) ?? "",
- letterSpacing: -2,
- fontHeight: 0.5,
+ callMessageAr,
+ color: ticketModel.callTypeEnum.getColorByCallType(),
+ fontSize: SizeConfig.getWidthMultiplier() * 2,
fontWeight: FontWeight.bold,
- fontSize: SizeConfig.getWidthMultiplier() * 3.8,
- textAlign: TextAlign.center,
- fontFamily: globalConfigurationsModel.screenLanguageEnum == LanguageEnum.arabic ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins,
+ fontFamily: AppStrings.fontNameGesTwo,
+ fontHeight: 1,
),
+ SizedBox(width: SizeConfig.getWidthMultiplier()),
+ if (callMessageEng.isNotEmpty) ...[
+ AppText(
+ "($callMessageEng)",
+ color: ticketModel.callTypeEnum.getColorByCallType(),
+ fontSize: SizeConfig.getWidthMultiplier() * 2,
+ fontFamily: AppStrings.fontNamePoppins,
+ fontHeight: 1,
+ ),
+ ]
],
),
),
@@ -108,100 +90,116 @@ class PriorityTicketsWithSidelist extends StatelessWidget {
),
),
),
- ListView.builder(
- shrinkWrap: true,
- itemCount: otherTickets.length,
- itemBuilder: (ctx, index) {
- final ticketModel = otherTickets[index].ticketModel;
- return Padding(
- padding: const EdgeInsets.all(8),
- child: Directionality(
- textDirection: globalConfigurationsModel.textDirection,
- child: Row(
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
+ ],
+ Expanded(
+ flex: 2,
+ child: Center(
+ child: AppText(
+ ticketModel.roomNo ?? "",
+ fontWeight: FontWeight.w500,
+ color: AppColors.greyTextColor,
+ fontSize: SizeConfig.getWidthMultiplier() * 2,
+ fontFamily: globalConfigurationsModel.screenLanguageEnum == LanguageEnum.arabic ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins,
+ ),
+ ),
+ )
+ ],
+ ),
+ );
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ final priorityTickets = tickets.sublist(0, AppConstants.thresholdForListUI);
+ final otherTickets = tickets.sublist(AppConstants.thresholdForListUI, tickets.length);
+ final List children = [
+ Expanded(flex: 5, child: PriorityTickets(globalConfigurationsModel: globalConfigurationsModel, tickets: priorityTickets)),
+ if (screenOrientationEnum == ScreenOrientationEnum.portraitUp || screenOrientationEnum == ScreenOrientationEnum.portraitDown) ...[
+ SizedBox(width: SizeConfig.getWidthMultiplier() * 2),
+ ],
+ Expanded(
+ flex: 5,
+ child: customShadowSmoothContainer(
+ child: Column(
+ children: [
+ Directionality(
+ textDirection: globalConfigurationsModel.textDirection,
+ child: Padding(
+ padding: EdgeInsets.symmetric(
+ vertical: SizeConfig.getHeightMultiplier()! * 0.12,
+ horizontal: SizeConfig.getWidthMultiplier()! * 2,
+ ),
+ child: Row(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Expanded(
+ flex: 3,
+ child: engArabicTextWithSeparatorWidget(
+ englishText: globalConfigurationsModel.queueNoTextEng ?? "",
+ arabicText: globalConfigurationsModel.queueNoTextArb ?? "",
+ fontSize: SizeConfig.getWidthMultiplier()! * 2.2,
+ mainAxisAlignment: MainAxisAlignment.start,
+ ),
+ ),
+ if (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment) ...[
Expanded(
flex: 5,
- child: Row(
+ child: engArabicTextWithSeparatorWidget(
mainAxisAlignment: MainAxisAlignment.center,
- children: [
- AppText(
- ticketModel!.queueNo ?? "",
- letterSpacing: -1,
- fontWeight: FontWeight.bold,
- fontSize: SizeConfig.getWidthMultiplier() * 3.5,
- textAlign: TextAlign.center,
- fontHeight: 0.5,
- fontFamily: globalConfigurationsModel.screenLanguageEnum == LanguageEnum.arabic ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins,
- ),
- ],
+ englishText: globalConfigurationsModel.callForTextEng ?? "",
+ arabicText: globalConfigurationsModel.callForTextArb ?? "",
+ fontSize: SizeConfig.getWidthMultiplier()! * 2.2,
),
),
- Container(
- color: Colors.grey.withOpacity(0.5),
- width: 5,
- height: SizeConfig.getHeightMultiplier() * 0.3,
- margin: const EdgeInsets.symmetric(horizontal: 15),
- ),
- if (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment) ...[
- Expanded(
- flex: 5,
- child: Row(
- mainAxisAlignment: MainAxisAlignment.center,
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- Padding(
- padding: const EdgeInsets.only(bottom: 8.0),
- child: SizedBox(
- height: SizeConfig.getWidthMultiplier() * 3,
- child: ticketModel.callTypeEnum.getIconByCallType(SizeConfig.getHeightMultiplier() * 0.3),
- ),
- ),
- const SizedBox(width: 15),
- AppText(
- ticketModel.callTypeEnum.getMessageByCallType(globalConfigurationsModel, isListView: true),
- color: ticketModel.callTypeEnum.getColorByCallType(),
- fontSize: SizeConfig.getWidthMultiplier() * 3,
- fontWeight: FontWeight.w600,
- fontHeight: 0.5,
- ),
- ],
- ),
- ),
- Container(
- color: Colors.grey.withOpacity(0.5),
- width: 5,
- height: SizeConfig.getHeightMultiplier() * 0.3,
- margin: const EdgeInsets.symmetric(horizontal: 15),
- ),
- ],
- Expanded(
- flex: 3,
- child: Row(
- mainAxisAlignment: MainAxisAlignment.center,
- children: [
- AppText(
- ticketModel.roomNo ?? "",
- color: AppColors.blackColor,
- letterSpacing: -1.5,
- fontHeight: 0.5,
- fontSize: SizeConfig.getWidthMultiplier() * 3.3,
- fontWeight: FontWeight.w600,
- fontFamily: globalConfigurationsModel.screenLanguageEnum == LanguageEnum.arabic ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins,
- ),
- ],
- ),
- )
],
+ Expanded(
+ flex: 3,
+ child: Container(
+ child: engArabicTextWithSeparatorWidget(
+ mainAxisAlignment: MainAxisAlignment.end,
+ englishText: (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment ? globalConfigurationsModel.roomTextEng : globalConfigurationsModel.counterTextEng) ?? "",
+ arabicText: (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment ? globalConfigurationsModel.roomTextArb : globalConfigurationsModel.counterTextArb) ?? "",
+ fontSize: SizeConfig.getWidthMultiplier()! * 2.2,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.06),
+ Expanded(
+ child: Padding(
+ padding: EdgeInsets.symmetric(horizontal: SizeConfig.getWidthMultiplier() * 6),
+ child: ListView.separated(
+ separatorBuilder: (context, int index) => Divider(
+ color: AppColors.lightBorderColor,
+ thickness: SizeConfig.getHeightMultiplier()! * 0.01,
+ height: SizeConfig.getHeightMultiplier()! * 0.14,
),
+ itemCount: otherTickets.length,
+ itemBuilder: (ctx, index) {
+ final ticketModel = otherTickets[index].ticketModel;
+ return ticketListItem(ticketModel: ticketModel);
+ },
),
- );
- },
- ),
- ],
+ ),
+ ),
+ ],
+ ),
),
)
];
- return (screenOrientationEnum == ScreenOrientationEnum.portraitUp || screenOrientationEnum == ScreenOrientationEnum.portraitDown) ? Row(children: children) : Column(children: children);
+
+ return (screenOrientationEnum == ScreenOrientationEnum.portraitUp || screenOrientationEnum == ScreenOrientationEnum.portraitDown)
+ ? Directionality(
+ textDirection: globalConfigurationsModel.textDirection,
+ child: Row(children: children),
+ )
+ : Directionality(
+ textDirection: globalConfigurationsModel.textDirection,
+ child: Column(children: children),
+ );
}
}
diff --git a/lib/views/main_queue_screen/components/ticket_item.dart b/lib/views/main_queue_screen/components/ticket_item.dart
index 133d4c4..30898eb 100644
--- a/lib/views/main_queue_screen/components/ticket_item.dart
+++ b/lib/views/main_queue_screen/components/ticket_item.dart
@@ -84,7 +84,7 @@ class TicketItem extends StatelessWidget {
),
const SizedBox(width: 13),
AppText(
- callTypeEnum.getMessageByCallType(globalConfigurationsModel, isListView: false),
+ callTypeEnum.getMessageByCallTypeForEnglish(globalConfigurationsModel, isListView: false),
color: callTypeEnum.getColorByCallType(),
fontSize: SizeConfig.getWidthMultiplier() * 3.8,
fontWeight: FontWeight.w600,
diff --git a/lib/views/main_queue_screen/components/ticket_item_calling_card.dart b/lib/views/main_queue_screen/components/ticket_item_calling_card.dart
new file mode 100644
index 0000000..e9ae6dc
--- /dev/null
+++ b/lib/views/main_queue_screen/components/ticket_item_calling_card.dart
@@ -0,0 +1,163 @@
+import 'package:blinking_text/blinking_text.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_svg/flutter_svg.dart';
+import 'package:hmg_qline/constants/app_constants.dart';
+import 'package:hmg_qline/models/global_config_model.dart';
+import 'package:hmg_qline/utilities/enums.dart';
+import 'package:hmg_qline/utilities/extensions.dart';
+import 'package:hmg_qline/views/common_widgets/app_general_widgets.dart';
+import 'package:hmg_qline/views/common_widgets/app_texts_widget.dart';
+import 'package:hmg_qline/views/view_helpers/size_config.dart';
+
+class QueueItemCallingCard extends StatelessWidget {
+ final String ticketNo;
+ final String roomNo;
+ final bool blink;
+ final double scale;
+ final bool isClinicAdded;
+ final bool isGradientRequired;
+ final bool isBorderRequired;
+ final TextDirection textDirection;
+ final String roomText;
+ final String roomTextAr;
+ final GlobalConfigurationsModel globalConfigurationsModel;
+ final CallTypeEnum callTypeEnum;
+ final ScreenTypeEnum screenTypeEnum;
+ final LanguageEnum langTypeEnum;
+ final bool isSingleTicket;
+
+ const QueueItemCallingCard({
+ super.key,
+ required this.isClinicAdded,
+ required this.ticketNo,
+ required this.roomNo,
+ required this.scale,
+ required this.textDirection,
+ required this.roomText,
+ required this.roomTextAr,
+ required this.globalConfigurationsModel,
+ required this.callTypeEnum,
+ required this.screenTypeEnum,
+ required this.langTypeEnum,
+ this.isGradientRequired = false,
+ this.isBorderRequired = false,
+ this.isSingleTicket = false,
+ this.blink = false,
+ });
+
+ String getFormattedTicket(String ticketNo, bool isClinicAdded) {
+ if (isClinicAdded) {
+ var formattedString = ticketNo.split(" ");
+ if (formattedString.length > 1) {
+ return "${formattedString[0]} ${formattedString[1]}";
+ } else {
+ return ticketNo;
+ }
+ }
+ return ticketNo;
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ final text = "${callTypeEnum.getMessageByCallTypeForEnglish(globalConfigurationsModel, isListView: false)} | $roomText $roomNo";
+
+ return Stack(
+ children: [
+ customShadowSmoothContainerWithBackground(
+ padding: EdgeInsets.symmetric(vertical: SizeConfig.getHeightMultiplier() * 0.1),
+ callTypeEnum: callTypeEnum,
+ child: Directionality(
+ textDirection: textDirection,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.end,
+ children: [
+ Padding(
+ padding: EdgeInsets.only(
+ right: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 3.5 : 0,
+ left: textDirection == TextDirection.rtl ? SizeConfig.getWidthMultiplier() * 3.5 : 0,
+ ),
+ child: callTypeEnum.getIconByCallType(SizeConfig.getHeightMultiplier() * 0.5),
+ ),
+ SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.15),
+ IntrinsicWidth(
+ child: callTypeContainer(
+ textDirection: textDirection,
+ padding: EdgeInsets.all(SizeConfig.getHeightMultiplier() * 0.1),
+ color: callTypeEnum.getColorByCallType(),
+ child: engArabicTextWithSeparatorWidget(
+ englishText: roomNo,
+ arabicText: roomTextAr,
+ color: AppColors.whiteColor,
+ mainAxisAlignment: MainAxisAlignment.center,
+ ),
+ ),
+ ),
+ SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.15),
+ Padding(
+ padding: EdgeInsets.only(
+ right: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 3.5 : 0,
+ left: textDirection == TextDirection.rtl ? SizeConfig.getWidthMultiplier() * 3.5 : 0,
+ ),
+ child: AppText(
+ callTypeEnum.getMessageByCallTypeForArabic(globalConfigurationsModel, isListView: false),
+ color: callTypeEnum.getColorByCallType(),
+ fontSize: SizeConfig.getWidthMultiplier() * 2.5,
+ fontHeight: 1,
+ fontFamily: AppStrings.fontNameGesTwo,
+ ),
+ ),
+ SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.15),
+ Padding(
+ padding: EdgeInsets.only(
+ right: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 3.5 : 0,
+ left: textDirection == TextDirection.rtl ? SizeConfig.getWidthMultiplier() * 3.5 : 0,
+ ),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.end,
+ children: [
+ ClipRRect(
+ child: AppText(
+ text,
+ color: callTypeEnum.getColorByCallType(),
+ fontSize: SizeConfig.getWidthMultiplier() * 2.4,
+ fontFamily: AppStrings.fontNamePoppins,
+ textAlign: TextAlign.left,
+ textOverflow: TextOverflow.clip,
+ maxLines: 1,
+ ),
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsets.only(
+ top: SizeConfig.getHeightMultiplier() * 0.1,
+ left: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 2 : 0,
+ right: textDirection == TextDirection.rtl ? SizeConfig.getWidthMultiplier() * 2 : 0,
+ ),
+ child: SvgPicture.asset(AppAssets.hmgLogoPatternDarkIcon, height: SizeConfig.getHeightMultiplier() * 1),
+ ),
+ Padding(
+ padding: EdgeInsets.only(
+ left: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 6 : 0,
+ right: textDirection == TextDirection.rtl ? SizeConfig.getWidthMultiplier() * 6 : 0,
+ top: SizeConfig.getHeightMultiplier() * 0.4,
+ ),
+ child: AppText(
+ getFormattedTicket(ticketNo, isClinicAdded),
+ fontSize: SizeConfig.getWidthMultiplier() * 7.4,
+ letterSpacing: -1,
+ fontHeight: 0.5,
+ color: AppColors.greyTextColor,
+ fontWeight: FontWeight.bold,
+ fontFamily: AppStrings.fontNamePoppins,
+ ),
+ ),
+ ],
+ );
+ }
+}
diff --git a/lib/views/main_queue_screen/components/ticket_item_normal_card.dart b/lib/views/main_queue_screen/components/ticket_item_normal_card.dart
new file mode 100644
index 0000000..f0706fe
--- /dev/null
+++ b/lib/views/main_queue_screen/components/ticket_item_normal_card.dart
@@ -0,0 +1,144 @@
+import 'package:blinking_text/blinking_text.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_svg/flutter_svg.dart';
+import 'package:hmg_qline/constants/app_constants.dart';
+import 'package:hmg_qline/models/global_config_model.dart';
+import 'package:hmg_qline/utilities/enums.dart';
+import 'package:hmg_qline/utilities/extensions.dart';
+import 'package:hmg_qline/views/common_widgets/app_general_widgets.dart';
+import 'package:hmg_qline/views/common_widgets/app_texts_widget.dart';
+import 'package:hmg_qline/views/view_helpers/size_config.dart';
+
+class QueueItemNormalCard extends StatelessWidget {
+ final String ticketNo;
+ final String roomNo;
+ final bool isClinicAdded;
+ final TextDirection textDirection;
+ final String roomText;
+ final String roomTextAr;
+ final GlobalConfigurationsModel globalConfigurationsModel;
+ final CallTypeEnum callTypeEnum;
+ final ScreenTypeEnum screenTypeEnum;
+ final LanguageEnum langTypeEnum;
+
+ const QueueItemNormalCard({
+ super.key,
+ required this.isClinicAdded,
+ required this.ticketNo,
+ required this.roomNo,
+ required this.textDirection,
+ required this.roomText,
+ required this.roomTextAr,
+ required this.globalConfigurationsModel,
+ required this.callTypeEnum,
+ required this.screenTypeEnum,
+ required this.langTypeEnum,
+ });
+
+ String getFormattedTicket(String ticketNo, bool isClinicAdded) {
+ if (isClinicAdded) {
+ var formattedString = ticketNo.split(" ");
+ if (formattedString.length > 1) {
+ return "${formattedString[0]} ${formattedString[1]}";
+ } else {
+ return ticketNo;
+ }
+ }
+ return ticketNo;
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ final text = "${callTypeEnum.getMessageByCallTypeForEnglish(globalConfigurationsModel, isListView: false)} | $roomText $roomNo";
+ return Stack(
+ children: [
+ customShadowSmoothContainer(
+ padding: EdgeInsets.symmetric(
+ vertical: SizeConfig.getHeightMultiplier() * 0.1,
+ horizontal: SizeConfig.getWidthMultiplier() * 1.5,
+ ),
+ child: Directionality(
+ textDirection: textDirection,
+ child: Column(
+ children: [
+ SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.14),
+ AppText(
+ getFormattedTicket(ticketNo, isClinicAdded),
+ fontSize: SizeConfig.getWidthMultiplier() * 5,
+ letterSpacing: -1,
+ fontHeight: 0.5,
+ color: AppColors.greyTextColor,
+ fontWeight: FontWeight.bold,
+ fontFamily: AppStrings.fontNamePoppins,
+ ),
+ SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.15),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.end,
+ children: [
+ callTypeEnum.getIconByCallType(SizeConfig.getHeightMultiplier() * 0.35),
+ ],
+ ),
+ SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.14),
+ IntrinsicWidth(
+ child: callTypeContainer(
+ textDirection: textDirection,
+ isDisableRightBorderRadius: false,
+ padding: EdgeInsets.all(SizeConfig.getHeightMultiplier() * 0.05),
+ color: callTypeEnum.getColorByCallType(),
+ child: engArabicTextWithSeparatorWidget(
+ fontSize: SizeConfig.getWidthMultiplier()! * 1.8,
+ englishText: roomNo,
+ arabicText: roomTextAr,
+ color: AppColors.whiteColor,
+ mainAxisAlignment: MainAxisAlignment.center,
+ ),
+ ),
+ ),
+ SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.14),
+ AppText(
+ textAlign: TextAlign.center,
+ callTypeEnum.getMessageByCallTypeForArabic(globalConfigurationsModel, isListView: false),
+ color: callTypeEnum.getColorByCallType(),
+ fontSize: SizeConfig.getWidthMultiplier() * 2,
+ fontHeight: 1,
+ fontFamily: AppStrings.fontNameGesTwo,
+ maxLines: 2,
+ textOverflow: TextOverflow.clip,
+ ),
+ SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.14),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Expanded(
+ child: Center(
+ child: ClipRRect(
+ child: AppText(
+ text,
+ color: callTypeEnum.getColorByCallType(),
+ fontSize: SizeConfig.getWidthMultiplier() * 1.6,
+ fontFamily: AppStrings.fontNamePoppins,
+ textAlign: TextAlign.left,
+ textOverflow: TextOverflow.clip,
+ maxLines: 1,
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsets.only(
+ left: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 2 : 0,
+ right: textDirection == TextDirection.rtl ? SizeConfig.getWidthMultiplier() * 2 : 0,
+ top: SizeConfig.getHeightMultiplier() * 0.1,
+ ),
+ child: SvgPicture.asset(AppAssets.hmgLogoPatternLightIcon, height: SizeConfig.getHeightMultiplier() * 0.8),
+ ),
+ ],
+ );
+ }
+}
diff --git a/lib/views/main_queue_screen/main_queue_screen.dart b/lib/views/main_queue_screen/main_queue_screen.dart
index 74e3264..8a3ca0d 100644
--- a/lib/views/main_queue_screen/main_queue_screen.dart
+++ b/lib/views/main_queue_screen/main_queue_screen.dart
@@ -1,4 +1,3 @@
-
import 'package:flutter/material.dart';
import 'package:hmg_qline/constants/app_constants.dart';
import 'package:hmg_qline/utilities/enums.dart';
@@ -12,6 +11,7 @@ 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/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 StatefulWidget {
@@ -27,11 +27,11 @@ class _MainQueueScreenState extends State {
@override
void initState() {
super.initState();
-
final ScreenConfigViewModel screenConfigViewModel = context.read();
lifecycleHandler = LifecycleHandler(
onResumed: () => screenConfigViewModel.onAppResumed(),
onPaused: () => screenConfigViewModel.onAppPaused(),
+ onDetached: () => screenConfigViewModel.onAppDetached(),
);
lifecycleHandler.register();
}
@@ -86,7 +86,7 @@ class _MainQueueScreenState extends State {
isForRoomLevel: isForRoomLevel,
isRoomNoRequired: screenConfigViewModel.globalConfigurationsModel.isRoomNoRequired ?? true,
counterNo: screenConfigViewModel.globalConfigurationsModel.roomNo ?? 0,
- roomText: screenConfigViewModel.globalConfigurationsModel.roomText ?? AppStrings.counterNo,
+ roomText: screenConfigViewModel.globalConfigurationsModel.roomTextEng ?? AppStrings.counterNo,
);
} else if (screenConfigViewModel.globalConfigurationsModel.screenTypeEnum == ScreenTypeEnum.roomLevelScreen) {
widget = Row(
@@ -98,7 +98,7 @@ class _MainQueueScreenState extends State {
children: [
counterNoText(
counterNo: screenConfigViewModel.globalConfigurationsModel.roomNo ?? 0,
- roomText: screenConfigViewModel.globalConfigurationsModel.roomText ?? AppStrings.counterNo,
+ roomText: screenConfigViewModel.globalConfigurationsModel.roomTextEng ?? AppStrings.counterNo,
isRoomNoRequired: screenConfigViewModel.globalConfigurationsModel.isRoomNoRequired ?? true,
),
PriorityTickets(
@@ -133,30 +133,31 @@ class _MainQueueScreenState extends State {
builder: (BuildContext context, ScreenConfigViewModel screenConfigVM, Widget? child) {
return Column(
children: [
- if (screenConfigVM.globalConfigurationsModel.screenTypeEnum != ScreenTypeEnum.roomLevelScreen) ...[
- Expanded(
- flex: getFlexForScreenTypes(screenConfigVM),
+ // 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),
+ // ],
+ // ],
+ // ),
+ // ),
+ // )
+ // ],
+ Expanded(
+ flex: 10,
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: dataContent(context: context)),
- if (!screenConfigVM.globalConfigurationsModel.isWeatherReq && !screenConfigVM.globalConfigurationsModel.isPrayerTimeReq) ...[
- const SizedBox(height: 100),
- ],
+ padding: EdgeInsets.symmetric(horizontal: SizeConfig.getWidthMultiplier()! * 4),
+ child: dataContent(context: context),
+ )),
],
);
},
@@ -174,6 +175,7 @@ class _MainQueueScreenState extends State {
return RotatedBox(
quarterTurns: screenOrientationEnum.getTurnsByOrientation(),
child: AppScaffold(
+ backgroundColor: AppColors.backgroundColor,
appBar: const AppHeader(),
body: getBody(context: context),
bottomNavigationBar: const AppFooter(),
diff --git a/lib/views/view_helpers/size_config.dart b/lib/views/view_helpers/size_config.dart
index 0ccc600..ea8b872 100644
--- a/lib/views/view_helpers/size_config.dart
+++ b/lib/views/view_helpers/size_config.dart
@@ -88,4 +88,12 @@ class SizeConfig {
}
return heightMultiplier! * 8;
}
+
+ static double getTextMultiplier({double? height}) {
+ // TODO handel LandScape case
+ if (height != null) {
+ return height / 100;
+ }
+ return textMultiplier!;
+ }
}
diff --git a/pubspec.lock b/pubspec.lock
index 7348769..946f3b5 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -45,26 +45,26 @@ packages:
dependency: transitive
description:
name: characters
- sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
+ sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
url: "https://pub.dev"
source: hosted
- version: "1.3.0"
+ version: "1.4.0"
clock:
dependency: transitive
description:
name: clock
- sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
+ sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.dev"
source: hosted
- version: "1.1.1"
+ version: "1.1.2"
collection:
dependency: transitive
description:
name: collection
- sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
+ sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
url: "https://pub.dev"
source: hosted
- version: "1.19.0"
+ version: "1.19.1"
connectivity_plus:
dependency: "direct main"
description:
@@ -125,10 +125,10 @@ packages:
dependency: transitive
description:
name: fake_async
- sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
+ sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44"
url: "https://pub.dev"
source: hosted
- version: "1.3.1"
+ version: "1.3.3"
ffi:
dependency: transitive
description:
@@ -268,26 +268,26 @@ packages:
dependency: transitive
description:
name: leak_tracker
- sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06"
+ sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de"
url: "https://pub.dev"
source: hosted
- version: "10.0.7"
+ version: "11.0.2"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
- sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379"
+ sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
url: "https://pub.dev"
source: hosted
- version: "3.0.8"
+ version: "3.0.10"
leak_tracker_testing:
dependency: transitive
description:
name: leak_tracker_testing
- sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
+ sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
url: "https://pub.dev"
source: hosted
- version: "3.0.1"
+ version: "3.0.2"
lints:
dependency: transitive
description:
@@ -324,10 +324,10 @@ packages:
dependency: transitive
description:
name: matcher
- sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
+ sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
url: "https://pub.dev"
source: hosted
- version: "0.12.16+1"
+ version: "0.12.17"
material_color_utilities:
dependency: transitive
description:
@@ -340,10 +340,10 @@ packages:
dependency: transitive
description:
name: meta
- sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
+ sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
url: "https://pub.dev"
source: hosted
- version: "1.15.0"
+ version: "1.16.0"
nested:
dependency: transitive
description:
@@ -380,10 +380,10 @@ packages:
dependency: transitive
description:
name: path
- sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
+ sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
url: "https://pub.dev"
source: hosted
- version: "1.9.0"
+ version: "1.9.1"
path_parsing:
dependency: transitive
description:
@@ -593,26 +593,26 @@ packages:
dependency: transitive
description:
name: stack_trace
- sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
+ sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
url: "https://pub.dev"
source: hosted
- version: "1.12.0"
+ version: "1.12.1"
stream_channel:
dependency: transitive
description:
name: stream_channel
- sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
+ sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
url: "https://pub.dev"
source: hosted
- version: "2.1.2"
+ version: "2.1.4"
string_scanner:
dependency: transitive
description:
name: string_scanner
- sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
+ sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
url: "https://pub.dev"
source: hosted
- version: "1.3.0"
+ version: "1.2.0"
synchronized:
dependency: transitive
description:
@@ -633,10 +633,10 @@ packages:
dependency: transitive
description:
name: test_api
- sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
+ sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00"
url: "https://pub.dev"
source: hosted
- version: "0.7.3"
+ version: "0.7.6"
tuple:
dependency: transitive
description:
@@ -689,18 +689,18 @@ packages:
dependency: transitive
description:
name: vector_math
- sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
+ sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
url: "https://pub.dev"
source: hosted
- version: "2.1.4"
+ version: "2.2.0"
vm_service:
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:
@@ -757,6 +757,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "6.5.0"
+ zo_animated_border:
+ dependency: "direct main"
+ description:
+ name: zo_animated_border
+ sha256: cff6eb92b3b714618fa9fd6f268d1cf1daf30190ef23b4da085c97ca35ffa03d
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.1"
sdks:
- dart: ">=3.5.4 <4.0.0"
+ dart: ">=3.8.0-0 <4.0.0"
flutter: ">=3.24.0"
diff --git a/pubspec.yaml b/pubspec.yaml
index 04bd6f3..a586f40 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -55,6 +55,7 @@ dependencies:
path_provider: ^2.1.5
flutter_foreground_task: ^9.1.0
restart_app: ^1.3.2
+ zo_animated_border: ^1.0.1
# esc_pos_printer: ^4.0.0 # Ensure you are using the latest version
# esc_pos_utils: ^1.0.0
@@ -90,6 +91,7 @@ flutter:
- assets/images/
- assets/tones/
- assets/icons/
+ - assets/new_design_icons/
fonts:
@@ -103,9 +105,9 @@ flutter:
weight: 600
- asset: assets/fonts/Poppins/Poppins-Bold.ttf
weight: 700
- - asset: assets/fonts/Poppins/Poppins-Bold.ttf
+ - asset: assets/fonts/Poppins/Poppins-ExtraBold.ttf
weight: 800
- - asset: assets/fonts/Poppins/Poppins-Bold.ttf
+ - asset: assets/fonts/Poppins/Poppins-Black.ttf
weight: 900
- family: Cairo
fonts:
@@ -117,6 +119,11 @@ flutter:
- asset: assets/fonts/Cairo/Cairo-Bold/Cairo-Bold.otf
- asset: assets/fonts/Cairo/Cairo-Bold/Cairo-Bold.ttf
weight: 700
-
-
-
+ - family: GE_SS_Two
+ fonts:
+ - asset: assets/fonts/Ge_SS_Two/GE_SS_Two_Light.otf
+ weight: 300
+ - asset: assets/fonts/Ge_SS_Two/GE_SS_Two_Medium.otf
+ weight: 400
+ - asset: assets/fonts/Ge_SS_Two/GE_SS_Two_Bold.otf
+ weight: 700