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