From a109e65c11376a1524d1b05ed392a06fe8d354cb Mon Sep 17 00:00:00 2001 From: SurendarSuri30 Date: Tue, 24 Jun 2025 11:06:42 +0530 Subject: [PATCH] Dark / light Mode added --- ...on => index-2025-06-16T09-40-14-0099.json} | 0 .../arm64-v8a/configure_fingerprint.bin | 26 +- ...on => index-2025-06-16T09-40-37-0424.json} | 0 .../armeabi-v7a/configure_fingerprint.bin | 26 +- ...on => index-2025-06-16T09-40-37-0760.json} | 0 .../4y161to1/x86/configure_fingerprint.bin | 26 +- ...on => index-2025-06-16T09-40-38-0034.json} | 0 .../4y161to1/x86_64/configure_fingerprint.bin | 26 +- .../arm64-v8a/configure_fingerprint.bin | 24 +- .../armeabi-v7a/configure_fingerprint.bin | 24 +- .../574gs2w4/x86/configure_fingerprint.bin | 24 +- .../574gs2w4/x86_64/configure_fingerprint.bin | 24 +- android/app/build.gradle | 4 +- android/app/src/main/AndroidManifest.xml | 2 +- assets/banners/FCSCLogo_dark.png | Bin 0 -> 11480 bytes .../banners/{fcsc.png => FCSCLogo_light.png} | Bin assets/dark_bg.png | Bin 0 -> 138670 bytes assets/icons/misc/lockDark.png | Bin 0 -> 497 bytes assets/icons/misc/{lock.png => lockLight.png} | Bin assets/icons/misc/personDark.png | Bin 0 -> 727 bytes .../misc/{person.png => personLight.png} | Bin ios/Podfile.lock | 12 + ios/Runner.xcodeproj/project.pbxproj | 12 +- lib/config/api_config.dart | 2 +- lib/config/theme/app_theme.dart | 12 + lib/config/theme/service.dart | 94 ++ lib/config/theme/themeDialog.dart | 49 + lib/config/theme/theme_provider.dart | 31 + .../img_asset_paths/banner_asset_path.dart | 3 +- .../icons/misc_icon_asset_path.dart | 6 +- lib/main.dart | 10 +- .../UAE_Numbers/uae_numbers.dart | 104 +- .../Screens/app_tour/WelcomePage.dart | 2 +- .../auth_verification/create_new_pw.dart | 8 +- .../auth_verification/forgot_password.dart | 6 +- .../auth_verification/privacy_policy.dart | 2 +- .../auth_verification/registration.dart | 161 +- .../auth_verification/terms&conditions.dart | 2 +- .../Screens/charts/screens/chart_screen.dart | 183 ++- .../Screens/charts/services/api_service.dart | 4 +- .../Screens/charts/widgets/chart_widget.dart | 82 +- .../components/constant/constant.dart | 4 +- lib/presentation/components/dialogs.dart | 5 +- .../components/themed_text_field.dart | 35 +- .../routes/auth_routes/login_route.dart | 101 +- .../routes/auth_routes/register_route.dart | 10 +- .../tab_routes/home_route.dart | 304 ++-- .../Drawer Items/edit_profile.dart | 1433 +++++++++-------- .../drawer_routes/custom_drawer_routes.dart | 476 ++++-- pubspec.yaml | 5 +- 50 files changed, 2110 insertions(+), 1254 deletions(-) rename android/app/.cxx/Debug/4y161to1/arm64-v8a/.cmake/api/v1/reply/{index-2025-05-27T06-43-53-0853.json => index-2025-06-16T09-40-14-0099.json} (100%) rename android/app/.cxx/Debug/4y161to1/armeabi-v7a/.cmake/api/v1/reply/{index-2025-05-27T06-44-23-0234.json => index-2025-06-16T09-40-37-0424.json} (100%) rename android/app/.cxx/Debug/4y161to1/x86/.cmake/api/v1/reply/{index-2025-05-27T06-44-23-0626.json => index-2025-06-16T09-40-37-0760.json} (100%) rename android/app/.cxx/Debug/4y161to1/x86_64/.cmake/api/v1/reply/{index-2025-05-27T06-44-23-0928.json => index-2025-06-16T09-40-38-0034.json} (100%) create mode 100644 assets/banners/FCSCLogo_dark.png rename assets/banners/{fcsc.png => FCSCLogo_light.png} (100%) create mode 100644 assets/dark_bg.png create mode 100644 assets/icons/misc/lockDark.png rename assets/icons/misc/{lock.png => lockLight.png} (100%) create mode 100644 assets/icons/misc/personDark.png rename assets/icons/misc/{person.png => personLight.png} (100%) create mode 100644 lib/config/theme/app_theme.dart create mode 100644 lib/config/theme/service.dart create mode 100644 lib/config/theme/themeDialog.dart create mode 100644 lib/config/theme/theme_provider.dart diff --git a/android/app/.cxx/Debug/4y161to1/arm64-v8a/.cmake/api/v1/reply/index-2025-05-27T06-43-53-0853.json b/android/app/.cxx/Debug/4y161to1/arm64-v8a/.cmake/api/v1/reply/index-2025-06-16T09-40-14-0099.json similarity index 100% rename from android/app/.cxx/Debug/4y161to1/arm64-v8a/.cmake/api/v1/reply/index-2025-05-27T06-43-53-0853.json rename to android/app/.cxx/Debug/4y161to1/arm64-v8a/.cmake/api/v1/reply/index-2025-06-16T09-40-14-0099.json diff --git a/android/app/.cxx/Debug/4y161to1/arm64-v8a/configure_fingerprint.bin b/android/app/.cxx/Debug/4y161to1/arm64-v8a/configure_fingerprint.bin index a8d57fa4..7888f3a4 100644 --- a/android/app/.cxx/Debug/4y161to1/arm64-v8a/configure_fingerprint.bin +++ b/android/app/.cxx/Debug/4y161to1/arm64-v8a/configure_fingerprint.bin @@ -2,27 +2,27 @@ C/C++ Structured Log} { y/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/arm64-v8a/additional_project_files.txtC A -?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  ބ2  2z +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  2  2z x -v/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/arm64-v8a/android_gradle_build.json  ބ2 2 +v/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/arm64-v8a/android_gradle_build.json  2 2 } -{/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/arm64-v8a/android_gradle_build_mini.json  ބ2 2l +{/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/arm64-v8a/android_gradle_build_mini.json  2 2l j -h/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/arm64-v8a/build.ninja  ބ2 2p +h/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/arm64-v8a/build.ninja  2 2p n -l/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/arm64-v8a/build.ninja.txt  ބ2u +l/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/arm64-v8a/build.ninja.txt  2u s -q/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/arm64-v8a/build_file_index.txt  ބ2 _ 2v +q/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/arm64-v8a/build_file_index.txt  2 _ 2v t -r/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/arm64-v8a/compile_commands.json  ބ2z +r/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/arm64-v8a/compile_commands.json  2z x -v/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/arm64-v8a/compile_commands.json.bin  ބ2  +v/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/arm64-v8a/compile_commands.json.bin  2  ~ -|/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/arm64-v8a/metadata_generation_command.txt  ބ2 - 2s +|/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/arm64-v8a/metadata_generation_command.txt  2 + 2s q -o/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/arm64-v8a/prefab_config.json  ބ2  ( 2x +o/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/arm64-v8a/prefab_config.json  2  ( 2x v -t/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/arm64-v8a/symbol_folder_index.txt  ބ2  k 2c +t/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/arm64-v8a/symbol_folder_index.txt  2  k 2c a -_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  ބ2  ހ2 \ No newline at end of file +_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  2  ހ2 \ No newline at end of file diff --git a/android/app/.cxx/Debug/4y161to1/armeabi-v7a/.cmake/api/v1/reply/index-2025-05-27T06-44-23-0234.json b/android/app/.cxx/Debug/4y161to1/armeabi-v7a/.cmake/api/v1/reply/index-2025-06-16T09-40-37-0424.json similarity index 100% rename from android/app/.cxx/Debug/4y161to1/armeabi-v7a/.cmake/api/v1/reply/index-2025-05-27T06-44-23-0234.json rename to android/app/.cxx/Debug/4y161to1/armeabi-v7a/.cmake/api/v1/reply/index-2025-06-16T09-40-37-0424.json diff --git a/android/app/.cxx/Debug/4y161to1/armeabi-v7a/configure_fingerprint.bin b/android/app/.cxx/Debug/4y161to1/armeabi-v7a/configure_fingerprint.bin index b1abbfe7..88f59953 100644 --- a/android/app/.cxx/Debug/4y161to1/armeabi-v7a/configure_fingerprint.bin +++ b/android/app/.cxx/Debug/4y161to1/armeabi-v7a/configure_fingerprint.bin @@ -2,27 +2,27 @@ C/C++ Structured Log } {/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/additional_project_files.txtC A -?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  ބ2  2| +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  2  2| z -x/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/android_gradle_build.json  ބ2 2 +x/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/android_gradle_build.json  2 2  -}/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/android_gradle_build_mini.json  ބ2 2n +}/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/android_gradle_build_mini.json  2 2n l -j/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/build.ninja  ބ2 2r +j/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/build.ninja  2 2r p -n/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/build.ninja.txt  ބ2w +n/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/build.ninja.txt  2w u -s/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/build_file_index.txt  ބ2 _ 2x +s/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/build_file_index.txt  2 _ 2x v -t/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/compile_commands.json  ބ2| +t/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/compile_commands.json  2| z -x/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/compile_commands.json.bin  ބ2  +x/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/compile_commands.json.bin  2   -~/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/metadata_generation_command.txt  ބ2 - 2u +~/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/metadata_generation_command.txt  2 + 2u s -q/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/prefab_config.json  ބ2  ( 2z +q/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/prefab_config.json  2  ( 2z x -v/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/symbol_folder_index.txt  ބ2  m 2c +v/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/symbol_folder_index.txt  2  m 2c a -_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  ބ2  ހ2 \ No newline at end of file +_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  2  ހ2 \ No newline at end of file diff --git a/android/app/.cxx/Debug/4y161to1/x86/.cmake/api/v1/reply/index-2025-05-27T06-44-23-0626.json b/android/app/.cxx/Debug/4y161to1/x86/.cmake/api/v1/reply/index-2025-06-16T09-40-37-0760.json similarity index 100% rename from android/app/.cxx/Debug/4y161to1/x86/.cmake/api/v1/reply/index-2025-05-27T06-44-23-0626.json rename to android/app/.cxx/Debug/4y161to1/x86/.cmake/api/v1/reply/index-2025-06-16T09-40-37-0760.json diff --git a/android/app/.cxx/Debug/4y161to1/x86/configure_fingerprint.bin b/android/app/.cxx/Debug/4y161to1/x86/configure_fingerprint.bin index 0a209c84..0854c404 100644 --- a/android/app/.cxx/Debug/4y161to1/x86/configure_fingerprint.bin +++ b/android/app/.cxx/Debug/4y161to1/x86/configure_fingerprint.bin @@ -2,27 +2,27 @@ C/C++ Structured Logw u s/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86/additional_project_files.txtC A -?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  ބ2  2t +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  2  2t r -p/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86/android_gradle_build.json  ބ2 2y +p/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86/android_gradle_build.json  2 2y w -u/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86/android_gradle_build_mini.json  ބ2 2f +u/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86/android_gradle_build_mini.json  2 2f d -b/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86/build.ninja  ބ2 2j +b/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86/build.ninja  2 2j h -f/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86/build.ninja.txt  ބ2o +f/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86/build.ninja.txt  2o m -k/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86/build_file_index.txt  ބ2 _ 2p +k/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86/build_file_index.txt  2 _ 2p n -l/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86/compile_commands.json  ބ2t +l/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86/compile_commands.json  2t r -p/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86/compile_commands.json.bin  ބ2 z +p/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86/compile_commands.json.bin  2 z x -v/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86/metadata_generation_command.txt  ބ2 - 2m +v/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86/metadata_generation_command.txt  2 + 2m k -i/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86/prefab_config.json  ބ2  ( 2r +i/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86/prefab_config.json  2  ( 2r p -n/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86/symbol_folder_index.txt  ބ2  e 2c +n/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86/symbol_folder_index.txt  2  e 2c a -_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  ބ2  ހ2 \ No newline at end of file +_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  2  ހ2 \ No newline at end of file diff --git a/android/app/.cxx/Debug/4y161to1/x86_64/.cmake/api/v1/reply/index-2025-05-27T06-44-23-0928.json b/android/app/.cxx/Debug/4y161to1/x86_64/.cmake/api/v1/reply/index-2025-06-16T09-40-38-0034.json similarity index 100% rename from android/app/.cxx/Debug/4y161to1/x86_64/.cmake/api/v1/reply/index-2025-05-27T06-44-23-0928.json rename to android/app/.cxx/Debug/4y161to1/x86_64/.cmake/api/v1/reply/index-2025-06-16T09-40-38-0034.json diff --git a/android/app/.cxx/Debug/4y161to1/x86_64/configure_fingerprint.bin b/android/app/.cxx/Debug/4y161to1/x86_64/configure_fingerprint.bin index a60585b5..6967c255 100644 --- a/android/app/.cxx/Debug/4y161to1/x86_64/configure_fingerprint.bin +++ b/android/app/.cxx/Debug/4y161to1/x86_64/configure_fingerprint.bin @@ -2,27 +2,27 @@ C/C++ Structured Logz x v/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86_64/additional_project_files.txtC A -?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  ބ2  2w +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  2  2w u -s/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86_64/android_gradle_build.json  ބ2 2| +s/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86_64/android_gradle_build.json  2 2| z -x/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86_64/android_gradle_build_mini.json  ބ2 2i +x/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86_64/android_gradle_build_mini.json  2 2i g -e/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86_64/build.ninja  ބ2 2m +e/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86_64/build.ninja  2 2m k -i/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86_64/build.ninja.txt  ބ2r +i/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86_64/build.ninja.txt  2r p -n/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86_64/build_file_index.txt  ބ2 _ 2s +n/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86_64/build_file_index.txt  2 _ 2s q -o/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86_64/compile_commands.json  ބ2w +o/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86_64/compile_commands.json  2w u -s/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86_64/compile_commands.json.bin  ބ2 } +s/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86_64/compile_commands.json.bin  2 } { -y/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86_64/metadata_generation_command.txt  ބ2 - 2p +y/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86_64/metadata_generation_command.txt  2 + 2p n -l/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86_64/prefab_config.json  ބ2  ( 2u +l/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86_64/prefab_config.json  2  ( 2u s -q/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86_64/symbol_folder_index.txt  ބ2  h 2c +q/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/x86_64/symbol_folder_index.txt  2  h 2c a -_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  ބ2  ހ2 \ No newline at end of file +_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  2  ހ2 \ No newline at end of file diff --git a/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/configure_fingerprint.bin b/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/configure_fingerprint.bin index ebf3a42d..60f372c0 100644 --- a/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/configure_fingerprint.bin +++ b/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/configure_fingerprint.bin @@ -2,27 +2,27 @@ C/C++ Structured Log  /Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/additional_project_files.txtC A -?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  2  ǟ2 +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  Ă2  ǟ2  -/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/android_gradle_build.json  2 ǟ2 +/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/android_gradle_build.json  Ă2 ǟ2  -/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/android_gradle_build_mini.json  2 ǟ2u +/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/android_gradle_build_mini.json  Ă2 ǟ2u s -q/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/build.ninja  2 ǟ2y +q/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/build.ninja  Ă2 ǟ2y w -u/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/build.ninja.txt  2~ +u/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/build.ninja.txt  Ă2~ | -z/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/build_file_index.txt  2 _ ǟ2 +z/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/build_file_index.txt  Ă2 _ ǟ2 } -{/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/compile_commands.json  2 +{/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/compile_commands.json  Ă2  -/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/compile_commands.json.bin  2  +/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/compile_commands.json.bin  Ă2   -/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/metadata_generation_command.txt  2 +/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/metadata_generation_command.txt  Ă2  ǟ2| z -x/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/prefab_config.json  2  ( ǟ2 +x/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/prefab_config.json  Ă2  ( ǟ2  -}/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/symbol_folder_index.txt  2  t ǟ2c +}/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/symbol_folder_index.txt  Ă2  t ǟ2c a -_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  2  ހ2 \ No newline at end of file +_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  Ă2  ހ2 \ No newline at end of file diff --git a/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/configure_fingerprint.bin b/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/configure_fingerprint.bin index 5d6f19ad..3ecd5db8 100644 --- a/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/configure_fingerprint.bin +++ b/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/configure_fingerprint.bin @@ -2,27 +2,27 @@ C/C++ Structured Log  /Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/additional_project_files.txtC A -?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  2  ǟ2 +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  էĂ2  ǟ2  -/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/android_gradle_build.json  2 ǟ2 +/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/android_gradle_build.json  էĂ2 ǟ2  -/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/android_gradle_build_mini.json  2 ǟ2w +/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/android_gradle_build_mini.json  էĂ2 ǟ2w u -s/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/build.ninja  2 ǟ2{ +s/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/build.ninja  էĂ2 ǟ2{ y -w/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/build.ninja.txt  2 +w/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/build.ninja.txt  էĂ2 ~ -|/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/build_file_index.txt  2 _ ǟ2 +|/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/build_file_index.txt  էĂ2 _ ǟ2  -}/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/compile_commands.json  2 +}/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/compile_commands.json  էĂ2  -/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/compile_commands.json.bin  2  +/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/compile_commands.json.bin  էĂ2   -/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/metadata_generation_command.txt  2 +/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/metadata_generation_command.txt  էĂ2  ǟ2~ | -z/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/prefab_config.json  2  ( ǟ2 +z/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/prefab_config.json  էĂ2  ( ǟ2  -/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/symbol_folder_index.txt  2  v ǟ2c +/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/symbol_folder_index.txt  էĂ2  v ǟ2c a -_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  2  ހ2 \ No newline at end of file +_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  էĂ2  ހ2 \ No newline at end of file diff --git a/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/configure_fingerprint.bin b/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/configure_fingerprint.bin index d676e93c..0630bb48 100644 --- a/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/configure_fingerprint.bin +++ b/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/configure_fingerprint.bin @@ -2,27 +2,27 @@ C/C++ Structured Log ~ |/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/additional_project_files.txtC A -?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  2  ǟ2} +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  ާĂ2  ǟ2} { -y/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/android_gradle_build.json  2 ǟ2 +y/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/android_gradle_build.json  ާĂ2 ǟ2  -~/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/android_gradle_build_mini.json  2 ǟ2o +~/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/android_gradle_build_mini.json  ާĂ2 ǟ2o m -k/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/build.ninja  2 ǟ2s +k/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/build.ninja  ާĂ2 ǟ2s q -o/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/build.ninja.txt  2x +o/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/build.ninja.txt  ާĂ2x v -t/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/build_file_index.txt  2 _ ǟ2y +t/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/build_file_index.txt  ާĂ2 _ ǟ2y w -u/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/compile_commands.json  2} +u/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/compile_commands.json  ާĂ2} { -y/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/compile_commands.json.bin  2  +y/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/compile_commands.json.bin  ާĂ2   -/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/metadata_generation_command.txt  2 +/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/metadata_generation_command.txt  ާĂ2  ǟ2v t -r/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/prefab_config.json  2  ( ǟ2{ +r/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/prefab_config.json  ާĂ2  ( ǟ2{ y -w/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/symbol_folder_index.txt  2  n ǟ2c +w/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86/symbol_folder_index.txt  ާĂ2  n ǟ2c a -_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  2  ހ2 \ No newline at end of file +_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  ާĂ2  ހ2 \ No newline at end of file diff --git a/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/configure_fingerprint.bin b/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/configure_fingerprint.bin index 7ef9c856..ad995a25 100644 --- a/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/configure_fingerprint.bin +++ b/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/configure_fingerprint.bin @@ -2,27 +2,27 @@ C/C++ Structured Log  /Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/additional_project_files.txtC A -?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  2  ǟ2 +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  Ă2  ǟ2 ~ -|/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/android_gradle_build.json  2 ǟ2 +|/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/android_gradle_build.json  Ă2 ǟ2  -/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/android_gradle_build_mini.json  2 ǟ2r +/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/android_gradle_build_mini.json  Ă2 ǟ2r p -n/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/build.ninja  2 ǟ2v +n/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/build.ninja  Ă2 ǟ2v t -r/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/build.ninja.txt  2{ +r/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/build.ninja.txt  Ă2{ y -w/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/build_file_index.txt  2 _ ǟ2| +w/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/build_file_index.txt  Ă2 _ ǟ2| z -x/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/compile_commands.json  2 +x/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/compile_commands.json  Ă2 ~ -|/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/compile_commands.json.bin  2  +|/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/compile_commands.json.bin  Ă2   -/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/metadata_generation_command.txt  2 +/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/metadata_generation_command.txt  Ă2  ǟ2y w -u/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/prefab_config.json  2  ( ǟ2~ +u/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/prefab_config.json  Ă2  ( ǟ2~ | -z/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/symbol_folder_index.txt  2  q ǟ2c +z/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/symbol_folder_index.txt  Ă2  q ǟ2c a -_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  2  ހ2 \ No newline at end of file +_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  Ă2  ހ2 \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle index abb7fae1..59a83dd5 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -20,12 +20,12 @@ if (project.hasProperty('google-services.json')) { def flutterVersionCode = localProperties.getProperty("flutter.versionCode") if (flutterVersionCode == null) { - flutterVersionCode = "60" + flutterVersionCode = "61" } def flutterVersionName = localProperties.getProperty("flutter.versionName") if (flutterVersionName == null) { - flutterVersionName = "1.0.59" + flutterVersionName = "1.0.60" } def keystorePropertiesFile = rootProject.file("key.properties") diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index a4b15385..58e2264e 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -36,7 +36,7 @@ - + diff --git a/assets/banners/FCSCLogo_dark.png b/assets/banners/FCSCLogo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..8f693c5e21844b9534378539c1b297208d945fd3 GIT binary patch literal 11480 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 literal 0 HcmV?d00001 diff --git a/assets/icons/misc/lockDark.png b/assets/icons/misc/lockDark.png new file mode 100644 index 0000000000000000000000000000000000000000..8334474d3a24708e53039c4089f29a1262118e97 GIT binary patch literal 497 zcmVP000^Y1^@s6LVfqm00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yP&c$8z9P$M_6Zz|n(oQ)9*Hne3U z5Ar4L{>{v{JNtDCumfOGL+3F%Ve3mow1_AKg8SgyoD}gbMBf?8tQ)6>hCt2%=bjOWVACnE+k}QL1At;~_i7HmqCDRipX7^`IKo-AT?oL>` zvvp^dvdxW@wugX=)9RYue?D8<8)+vI8v}N2NSUT~AdPLH-+5oG6Ex(OzBh)Jh=sI0 z%_QOAHlXHBo8}d430C8fZ{avSx05^BQxd7Z+DHuYK0YN95$i6?wi72@k^hP$XjN_~ z!S=LS8J6)YeJ3v$hF8|-|ESAYpOE#cta{QAi8w&oK*DuL)*+W`j|(b57_JW2aP%Nt nO;0RPKr}bKSsRu9L3@lZ>Pn2_=)b3>00000NkvXXu0mjfYSPfw literal 0 HcmV?d00001 diff --git a/assets/icons/misc/lock.png b/assets/icons/misc/lockLight.png similarity index 100% rename from assets/icons/misc/lock.png rename to assets/icons/misc/lockLight.png diff --git a/assets/icons/misc/personDark.png b/assets/icons/misc/personDark.png new file mode 100644 index 0000000000000000000000000000000000000000..8f378b9442408e2effe8dceea1e7994e53167ad4 GIT binary patch literal 727 zcmV;|0x127P)P000^Y1^@s6LVfqm00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yP1}JvT0Fl~Hp9`H`KD=$45~|kb0SFodI0T>{?D#@P z-X0O*b*XD#cBNcxBXG{YXXgQvRG+`-{>qWo(I0z`UfgsJ?m6O0S_)Gmaj~v5L8yFH z*+7us?^ksL2oV7Vy5O2=zPz+3h--j|oySv2Q#!aN1CF#U=cRs`NsQ6u=`3zT1}J4a zGIBKMnMt^~<;7cOz~kwMp^Ox7Zh*}-K}rgk7JgoACLv5B;53vW1B$oiBr%)WWg@Xw z$>9-qP8~7;J**+$BX0SAW|E}exnp>GQtXbeU<+7aFQv2i_bc~3;k(h`p%36Ui+85J zdaI>gEG_h|?sHPdJC5Wiu;{^RrQTNvR?UMFgkkqljR(;R^xmbLUuN4p80ZKl;_8E=%{|}yZM7zgazs>*v002ov JPDHLkV1nvCMeqOs literal 0 HcmV?d00001 diff --git a/assets/icons/misc/person.png b/assets/icons/misc/personLight.png similarity index 100% rename from assets/icons/misc/person.png rename to assets/icons/misc/personLight.png diff --git a/ios/Podfile.lock b/ios/Podfile.lock index e99ecab3..601f0ada 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -3,6 +3,12 @@ PODS: - Flutter - app_settings (5.1.1): - Flutter + - appsflyer_sdk (6.16.2): + - AppsFlyerFramework (= 6.16.2) + - Flutter + - AppsFlyerFramework (6.16.2): + - AppsFlyerFramework/Main (= 6.16.2) + - AppsFlyerFramework/Main (6.16.2) - connectivity_plus (0.0.1): - Flutter - device_info_plus (0.0.1): @@ -104,6 +110,7 @@ PODS: DEPENDENCIES: - app_links (from `.symlinks/plugins/app_links/ios`) - app_settings (from `.symlinks/plugins/app_settings/ios`) + - appsflyer_sdk (from `.symlinks/plugins/appsflyer_sdk/ios`) - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`) - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - firebase_core (from `.symlinks/plugins/firebase_core/ios`) @@ -123,6 +130,7 @@ DEPENDENCIES: SPEC REPOS: trunk: + - AppsFlyerFramework - Firebase - FirebaseCore - FirebaseCoreInternal @@ -138,6 +146,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/app_links/ios" app_settings: :path: ".symlinks/plugins/app_settings/ios" + appsflyer_sdk: + :path: ".symlinks/plugins/appsflyer_sdk/ios" connectivity_plus: :path: ".symlinks/plugins/connectivity_plus/ios" device_info_plus: @@ -174,6 +184,8 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: app_links: 76b66b60cc809390ca1ad69bfd66b998d2387ac7 app_settings: 5127ae0678de1dcc19f2293271c51d37c89428b2 + appsflyer_sdk: ebe94dc3f00b07bdd001251dbc87879bda3c494a + AppsFlyerFramework: fe5303bffcdfd941d5f570c2d21eaaea982e7bdc connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe Firebase: 1fe1c0a7d9aaea32efe01fbea5f0ebd8d70e53a2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 0e4a5edc..44733890 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -506,7 +506,7 @@ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 6; + CURRENT_PROJECT_VERSION = 7; DEVELOPMENT_ASSET_PATHS = Runner/Assets.xcassets; DEVELOPMENT_TEAM = 9N5SRFUGK2; ENABLE_BITCODE = NO; @@ -517,7 +517,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.5; + MARKETING_VERSION = 1.0.6; PRODUCT_BUNDLE_IDENTIFIER = ae.gov.fcsc.frontend.ios; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -705,7 +705,7 @@ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 6; + CURRENT_PROJECT_VERSION = 7; DEVELOPMENT_ASSET_PATHS = Runner/Assets.xcassets; DEVELOPMENT_TEAM = 9N5SRFUGK2; ENABLE_BITCODE = NO; @@ -716,7 +716,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.5; + MARKETING_VERSION = 1.0.6; PRODUCT_BUNDLE_IDENTIFIER = ae.gov.fcsc.frontend.ios; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -742,7 +742,7 @@ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 6; + CURRENT_PROJECT_VERSION = 7; DEVELOPMENT_ASSET_PATHS = Runner/Assets.xcassets; DEVELOPMENT_TEAM = 9N5SRFUGK2; ENABLE_BITCODE = NO; @@ -753,7 +753,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.5; + MARKETING_VERSION = 1.0.6; PRODUCT_BUNDLE_IDENTIFIER = ae.gov.fcsc.frontend.ios; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/lib/config/api_config.dart b/lib/config/api_config.dart index 6ec553f9..4aec2242 100644 --- a/lib/config/api_config.dart +++ b/lib/config/api_config.dart @@ -1,4 +1,4 @@ // api_config.dart -// const String apiUrl = 'http://192.168.1.26:8090'; +// const String apiUrl = 'http://127.0.0.1:8090'; // const String apiUrl = 'https://pbdev.venbait.in/'; const String apiUrl = 'https://pb.venbait.in/'; diff --git a/lib/config/theme/app_theme.dart b/lib/config/theme/app_theme.dart new file mode 100644 index 00000000..f99414a8 --- /dev/null +++ b/lib/config/theme/app_theme.dart @@ -0,0 +1,12 @@ +enum AppTheme { light, dark, system } + +extension AppThemeExtension on AppTheme { + String get name => toString().split('.').last; + + static AppTheme fromString(String value) { + return AppTheme.values.firstWhere( + (e) => e.name == value, + orElse: () => AppTheme.system, + ); + } +} \ No newline at end of file diff --git a/lib/config/theme/service.dart b/lib/config/theme/service.dart new file mode 100644 index 00000000..c115ad31 --- /dev/null +++ b/lib/config/theme/service.dart @@ -0,0 +1,94 @@ +import 'dart:convert'; +import 'package:http/http.dart' as http; +import 'package:pocketbase/pocketbase.dart'; +import 'package:uae_stat/config/api_config.dart'; + +class ThemeBaseService { + final pb = PocketBase(apiUrl); + dynamic themeData; + + + + // Future getUserTheme(String userId) async { + // final prefs = await SharedPreferences.getInstance(); + // final userId = prefs.getString('userId') ?? ''; + // + // // Authenticate admin d + // final adminAuth = await pb.admins.authWithPassword( + // 'pb@venbainfotech.com', + // 'pb@venbainfotech.com', + // ); + // final String adminToken = adminAuth.token; + // print('adminToken: $adminToken'); + // + // // Fetch user details + // final userDetailsResponse = await pb.collection('users').getOne( + // userId, + // headers: { + // 'Authorization': 'Bearer $adminToken', + // }, + // ); + // + // print('userDetailsLogin: $userDetailsResponse'); + // + // + // // if (response.statusCode == 200) { + // return userDetailsResponse.data['theme'] ?? 'system'; + // // } else { + // // return 'system'; + // // } + // } + + Future getUserTheme(String userId) async { + final url = "${pb.baseUrl}/api/collections/users/records/$userId"; + + final adminAuth = await pb.admins.authWithPassword( + 'pb@venbainfotech.com', + 'pb@venbainfotech.com', + ); + final String adminToken = adminAuth.token; + print('adminToken: $adminToken'); + final response = await http.get( + Uri.parse(url), + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer $adminToken' + }, + ); + + if (response.statusCode == 200) { + return jsonDecode(response.body)['theme'] ?? 'system'; + } else { + return 'system'; + } + } + + Future updateUserTheme(String userId, String theme) async { + // Authenticate admin d + final url = "${pb.baseUrl}/api/collections/users/records/$userId"; + final adminAuth = await pb.admins.authWithPassword( + 'pb@venbainfotech.com', + 'pb@venbainfotech.com', + ); + final String adminToken = adminAuth.token; + print('adminToken: $adminToken'); + + final response = await http.patch( + Uri.parse(url), + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer $adminToken', + }, + body: jsonEncode({ + 'theme': theme, // light, dark, or system + }), + ); + + if (response.statusCode == 200) { + print("Theme updated successfully"); + } else { + print("Failed to update theme: ${response.body}"); + throw Exception('Failed to update theme'); + } + } +} diff --git a/lib/config/theme/themeDialog.dart b/lib/config/theme/themeDialog.dart new file mode 100644 index 00000000..dcfbbc4b --- /dev/null +++ b/lib/config/theme/themeDialog.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:uae_stat/config/theme/app_theme.dart'; + +class ThemeSelectorDialog extends StatefulWidget { + final AppTheme initialTheme; + + const ThemeSelectorDialog({super.key, required this.initialTheme}); + + @override + State createState() => _ThemeSelectorDialogState(); +} + +class _ThemeSelectorDialogState extends State { + late AppTheme _selectedTheme; + + @override + void initState() { + super.initState(); + _selectedTheme = widget.initialTheme; + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: const Text("Choose Theme"), + content: Column( + mainAxisSize: MainAxisSize.min, + children: AppTheme.values.map((theme) { + return RadioListTile( + title: Text(theme.name[0].toUpperCase() + theme.name.substring(1)), + value: theme, + groupValue: _selectedTheme, + onChanged: (value) => setState(() => _selectedTheme = value!), + ); + }).toList(), + ), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(null), + child: const Text("Cancel"), + ), + ElevatedButton( + onPressed: () => Navigator.of(context).pop(_selectedTheme), + child: const Text("OK"), + ), + ], + ); + } +} \ No newline at end of file diff --git a/lib/config/theme/theme_provider.dart b/lib/config/theme/theme_provider.dart new file mode 100644 index 00000000..b699bb6e --- /dev/null +++ b/lib/config/theme/theme_provider.dart @@ -0,0 +1,31 @@ +// lib/config/theme/theme_provider.dart + +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:uae_stat/config/theme/app_theme.dart'; + +final themeProvider = StateNotifierProvider((ref) { + return ThemeNotifier(); +}); + +class ThemeNotifier extends StateNotifier { + ThemeNotifier() : super(ThemeMode.system); + + void updateTheme(AppTheme theme,Brightness platformBrightness) { + switch (theme) { + case AppTheme.light: + state = ThemeMode.light; + break; + case AppTheme.dark: + state = ThemeMode.dark; + break; + case AppTheme.system: + // Set based on actual system brightness + final systemTheme = platformBrightness == Brightness.dark + ? ThemeMode.dark + : ThemeMode.light; + state = systemTheme; + break; + } + } +} diff --git a/lib/infrastructure/services/img_asset_paths/banner_asset_path.dart b/lib/infrastructure/services/img_asset_paths/banner_asset_path.dart index 2aeda0fc..856c3952 100644 --- a/lib/infrastructure/services/img_asset_paths/banner_asset_path.dart +++ b/lib/infrastructure/services/img_asset_paths/banner_asset_path.dart @@ -1,4 +1,5 @@ abstract class BannerAssetPath { static const _basePath = 'assets/banners'; - static const fcsc = '$_basePath/fcsc.png'; + static const fcscLogoDark = '$_basePath/FCSCLogo_dark.png'; + static const fcscLogoLight = '$_basePath/FCSCLogo_light.png'; } diff --git a/lib/infrastructure/services/img_asset_paths/icons/misc_icon_asset_path.dart b/lib/infrastructure/services/img_asset_paths/icons/misc_icon_asset_path.dart index 3b1a35a7..b81891fc 100644 --- a/lib/infrastructure/services/img_asset_paths/icons/misc_icon_asset_path.dart +++ b/lib/infrastructure/services/img_asset_paths/icons/misc_icon_asset_path.dart @@ -2,9 +2,11 @@ abstract class MiscIconAssetPath { static const _basePath = 'assets/icons/misc'; static const rightChevronInSemiCircle = '$_basePath/right_chevron_in_semicircle.png'; - static const lock = '$_basePath/lock.png'; + static const lockDark = '$_basePath/lockDark.png'; + static const lockLight = '$_basePath/lockLight.png'; static const menu = '$_basePath/menu.png'; - static const person = '$_basePath/person.png'; + static const personDark = '$_basePath/personDark.png'; + static const personLight = '$_basePath/personLight.png'; static const back = '$_basePath/back.png'; static const vector = '$_basePath/vector.png'; static const visibleOn = '$_basePath/visible_on.png'; diff --git a/lib/main.dart b/lib/main.dart index 4908ab6d..5ca01697 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -10,6 +10,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:uae_stat/config/injector.dart'; import 'package:uae_stat/config/my_router.dart'; +import 'package:uae_stat/config/theme/theme_provider.dart'; import 'package:uae_stat/presentation/components/indicators/locale_provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -140,6 +141,10 @@ void main() async { print('User tapped on notification'); }); + // final themeProvider = ThemeProvider(); + // themeProvider.setUserId("USER_ID_FROM_LOGIN"); // set this properly + // await themeProvider.loadThemeFromPocketBase(); + // // Request permission for notifications @@ -224,11 +229,14 @@ class _MainAppState extends ConsumerState { handleConnectivityChange(context, hasInternet); } }); - + final themeMode = ref.watch(themeProvider); return MaterialApp.router( debugShowCheckedModeBanner: false, routerConfig: router, locale: locale, + theme: ThemeData.light(), + darkTheme: ThemeData.dark(), + themeMode: themeMode, localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, ); diff --git a/lib/presentation/Screens/Bottom Navigation Pages/UAE_Numbers/uae_numbers.dart b/lib/presentation/Screens/Bottom Navigation Pages/UAE_Numbers/uae_numbers.dart index 029e0301..28929176 100644 --- a/lib/presentation/Screens/Bottom Navigation Pages/UAE_Numbers/uae_numbers.dart +++ b/lib/presentation/Screens/Bottom Navigation Pages/UAE_Numbers/uae_numbers.dart @@ -7,6 +7,7 @@ import 'package:go_router/go_router.dart'; import 'package:pocketbase/pocketbase.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:uae_stat/config/connectivity_provider.dart'; +import 'package:uae_stat/config/theme/theme_provider.dart'; import 'package:uae_stat/config/toggle_lang_service.dart'; import 'package:uae_stat/domain/use_cases/language.dart'; import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/misc_icon_asset_path.dart'; @@ -18,7 +19,7 @@ import 'package:http/http.dart' as http; import 'package:uae_stat/config/api_config.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -class UaeNumbers extends StatelessWidget { +class UaeNumbers extends ConsumerWidget { const UaeNumbers({super.key}); @override @@ -34,7 +35,11 @@ class UaeNumbers extends StatelessWidget { // } @override - Widget build(BuildContext context) { + Widget build(BuildContext context,WidgetRef ref) { + + final isDarkTheme = ref.watch(themeProvider) == ThemeMode.dark || + (ref.watch(themeProvider) == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); double myheight = MediaQuery.of(context).size.height; double mywidth = MediaQuery.of(context).size.width; @@ -45,6 +50,7 @@ class UaeNumbers extends StatelessWidget { context.go('/myhomepage'); // Show exit confirmation dialog }, child: BaseScaffold( + backgroundColor: isDarkTheme ? Color(0xFF333333) : Color(0xFF414042), title: Text( context.translate( 'UAE Numbers', @@ -54,7 +60,8 @@ class UaeNumbers extends StatelessWidget { fontFamily: context.translate( 'Roboto', 'NotoKufi', - ) + ), + color: isDarkTheme ? Color(0xFFFFFFFF) : Color(0xFF414042), ), ), body: uaenumberWidget(), @@ -78,13 +85,22 @@ class _UaenumberWidgetState extends ConsumerState { int? expandedIndex = 0; final _pb = PocketBase(apiUrl); late UserService _userService; + late ThemeMode currentTheme; @override void initState() { super.initState(); _userService = UserService(); final locale = ref.read(localeProvider); - fetchData(locale?.languageCode ?? 'en'); + currentTheme = ref.read(themeProvider); + print('123456789'); + print(currentTheme); + final isDark = currentTheme == ThemeMode.dark || + (currentTheme == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + + final themeMode = (isDark ? 'dark' : 'light'); + fetchData(locale?.languageCode ?? 'en',themeMode); _searchController.addListener(() { setState(() { filterData(_searchController.text); @@ -98,10 +114,10 @@ class _UaenumberWidgetState extends ConsumerState { super.dispose(); } - Future fetchData(locale) async { + Future fetchData(locale,themeMode) async { const baseUrl = '$apiUrl/api/getUAENumbersData'; try { - final response = await http.get(Uri.parse(baseUrl + '?language=$locale')); + final response = await http.get(Uri.parse(baseUrl + '?language=$locale&color_mode=$themeMode')); if (response.statusCode == 200) { setState(() { homePageData = (json.decode(response.body) as List) @@ -193,9 +209,39 @@ class _UaenumberWidgetState extends ConsumerState { isLoading = true; }); await _userService.updateLanguage(localeCode); - fetchData(localeCode); + final currentTheme = ref.read(themeProvider); + final isDark = currentTheme == ThemeMode.dark || + (currentTheme == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + + final themeString = isDark ? 'dark' : 'light'; + fetchData(localeCode,themeString); }); + ref.listen(themeProvider, (previous, next) async { + final localeCode = ref.watch(localeProvider)?.languageCode ?? 'en'; + print(localeCode); + + // Default to 'en' if null + setState(() { + isLoading = true; + print('isLoadingref $isLoading'); + }); + + final currentTheme = ref.read(themeProvider); + final isDark = currentTheme == ThemeMode.dark || + (currentTheme == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + + final themeString = isDark ? 'dark' : 'light'; + fetchData(localeCode,themeString); + }); + + final themeMode = ref.watch(themeProvider); + final isDarkTheme = themeMode == ThemeMode.dark || + (themeMode == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + double myheight = MediaQuery.of(context).size.height; double mywidth = MediaQuery.of(context).size.width; @@ -218,14 +264,16 @@ class _UaenumberWidgetState extends ConsumerState { ); } - return Padding( + return Container( + color: isDarkTheme ? Color(0xFF333333) : Color(0xFFFFFFFF), // Set background here + child: Padding( padding: const EdgeInsets.only(left: 16.0, right: 16.0, top: 5.0, bottom: 5.0), child: Column( children: [ Container( height: 40, decoration: BoxDecoration( - color: Colors.white, + color: isDarkTheme ? Color(0xFF000000) : Colors.white, borderRadius: BorderRadius.circular(30.0), border: Border.all(width: 1, color: Color(0xFFAA8E83)), ), @@ -239,7 +287,7 @@ class _UaenumberWidgetState extends ConsumerState { decoration: InputDecoration( hintText: AppLocalizations.of(context)!.search, hintStyle: TextStyle( - color: Color(0xFFAA8E83), + color: isDarkTheme ? Color(0xFFBBBBBB) : Color(0xFFAA8E83), fontFamily: context.translate('Roboto', 'NotoKufi'), fontSize: 14, // height: 1.8, @@ -272,7 +320,7 @@ class _UaenumberWidgetState extends ConsumerState { }, ) : null, - contentPadding: EdgeInsets.symmetric(vertical: 12, horizontal: 18.0), + contentPadding: EdgeInsets.symmetric(vertical: 15, horizontal: 18.0), border: InputBorder.none, // contentPadding: // EdgeInsets.symmetric(vertical: 9, horizontal: 18.0), @@ -303,6 +351,7 @@ class _UaenumberWidgetState extends ConsumerState { }, title: mainTopic['main_topic'], titleBackgroundColor: backgroundColor, + // currentTheme: currentTheme, children: _buildSubTopics( mainTopic['sub_topics'] ?? [], mywidth, @@ -317,6 +366,7 @@ class _UaenumberWidgetState extends ConsumerState { ), ], ), + ) ); } @@ -431,6 +481,11 @@ class _UaenumberWidgetState extends ConsumerState { : 0.0; bool isPositive = parsedValue >= 0; + final themeMode = ref.watch(themeProvider); + final isDarkTheme = themeMode == ThemeMode.dark || + (themeMode == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + return GestureDetector( onTap: () { final encodedMainTopic = Uri.encodeComponent(mainTopic); @@ -444,7 +499,7 @@ class _UaenumberWidgetState extends ConsumerState { child: Container( width: mywidth, decoration: BoxDecoration( - color: Colors.white, + color: isDarkTheme ? Color(0xFF111111) : Colors.white, border: Border.all( color: bordercolor, width: 1, @@ -459,7 +514,7 @@ class _UaenumberWidgetState extends ConsumerState { Text( title, textAlign: TextAlign.center, - style: robotoRegular11(context), + style: robotoRegular11(context,isDarkTheme), ), SizedBox(height: 0.1), Text(subtitle, textAlign: TextAlign.center, style: subtitleStyle(context)), @@ -499,7 +554,7 @@ class _UaenumberWidgetState extends ConsumerState { } } -class CustomExpandableTile extends StatefulWidget { +class CustomExpandableTile extends ConsumerStatefulWidget { final String title; final Color titleBackgroundColor; final List children; @@ -517,21 +572,31 @@ class CustomExpandableTile extends StatefulWidget { }); @override - _CustomExpandableTileState createState() => _CustomExpandableTileState(); + ConsumerState createState() => _CustomExpandableTileState(); } -class _CustomExpandableTileState extends State { +class _CustomExpandableTileState extends ConsumerState { bool isExpanded = false; // late bool isExpanded; + @override void initState() { super.initState(); // Initialize isExpanded based on widget's property + print('123456789'); } @override Widget build(BuildContext context) { double myheight = MediaQuery.of(context).size.height; + final themeMode = ref.watch(themeProvider); + final isDarkTheme = themeMode == ThemeMode.dark || + (themeMode == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + print('123456789000'); + print(isDarkTheme); + + return Card( elevation: 0, child: Column( @@ -540,8 +605,7 @@ class _CustomExpandableTileState extends State { onTap: () => widget.onTap(widget.index), child: Container( decoration: BoxDecoration( - color: Colors - .white, // Ensuring the background outside the rounded container is white + color: isDarkTheme ? Color(0xFF333333) : Colors.white, ), child: Container( decoration: BoxDecoration( @@ -581,13 +645,13 @@ class _CustomExpandableTileState extends State { duration: Duration(milliseconds: 300), curve: Curves.easeInOut, width: double.infinity, - color: Colors.white, + color: isDarkTheme ? Color(0xFF333333) : Colors.white, height: widget.isExpanded ? myheight * 0.52 : 0, child: widget.isExpanded ? SingleChildScrollView( child: Container( decoration: BoxDecoration( - color: Colors.white, + color: isDarkTheme ? Color(0xFF333333) : Colors.white, // borderRadius: BorderRadius.all(Radius.circular(20)) ), padding: const EdgeInsets.all(1), diff --git a/lib/presentation/Screens/app_tour/WelcomePage.dart b/lib/presentation/Screens/app_tour/WelcomePage.dart index 34fa76d2..037bc508 100644 --- a/lib/presentation/Screens/app_tour/WelcomePage.dart +++ b/lib/presentation/Screens/app_tour/WelcomePage.dart @@ -12,7 +12,7 @@ class Welcomepage extends StatelessWidget { double myheight = MediaQuery.of(context).size.height; double mywidth = MediaQuery.of(context).size.width; final fcscBanner = Image.asset( - BannerAssetPath.fcsc, + BannerAssetPath.fcscLogoLight, height: 40, ); final uaestat = Image.asset( diff --git a/lib/presentation/Screens/auth_verification/create_new_pw.dart b/lib/presentation/Screens/auth_verification/create_new_pw.dart index 7e817d16..e69213d8 100644 --- a/lib/presentation/Screens/auth_verification/create_new_pw.dart +++ b/lib/presentation/Screens/auth_verification/create_new_pw.dart @@ -48,7 +48,7 @@ class _CreateNewPwState extends ConsumerState { String? _confirmPassword; final fcscBanner = Image.asset( - BannerAssetPath.fcsc, + BannerAssetPath.fcscLogoLight, height: 40, ); @@ -426,7 +426,7 @@ class _CreateNewPwState extends ConsumerState { end: 10, ), child: Image.asset( - MiscIconAssetPath.lock, + MiscIconAssetPath.lockLight, fit: BoxFit.fitHeight, height: 25, width: 25, @@ -510,7 +510,7 @@ class _CreateNewPwState extends ConsumerState { end: 10, ), child: Image.asset( - MiscIconAssetPath.lock, + MiscIconAssetPath.lockLight, fit: BoxFit.fitHeight, height: 25, width: 25, @@ -592,7 +592,7 @@ class _CreateNewPwState extends ConsumerState { end: 10, ), child: Image.asset( - MiscIconAssetPath.lock, + MiscIconAssetPath.lockLight, fit: BoxFit.fitHeight, height: 25, width: 25, diff --git a/lib/presentation/Screens/auth_verification/forgot_password.dart b/lib/presentation/Screens/auth_verification/forgot_password.dart index 82523409..7e5f039d 100644 --- a/lib/presentation/Screens/auth_verification/forgot_password.dart +++ b/lib/presentation/Screens/auth_verification/forgot_password.dart @@ -41,7 +41,7 @@ class _ForgotPasswordState extends ConsumerState { String? _confirmPassword; final fcscBanner = Image.asset( - BannerAssetPath.fcsc, + BannerAssetPath.fcscLogoLight, height: 40, ); @@ -445,7 +445,7 @@ class _ForgotPasswordState extends ConsumerState { end: 10, ), child: Image.asset( - MiscIconAssetPath.lock, + MiscIconAssetPath.lockLight, fit: BoxFit.fitHeight, height: 25, width: 25, @@ -528,7 +528,7 @@ class _ForgotPasswordState extends ConsumerState { end: 10, ), child: Image.asset( - MiscIconAssetPath.lock, + MiscIconAssetPath.lockLight, fit: BoxFit.fitHeight, height: 25, width: 25, diff --git a/lib/presentation/Screens/auth_verification/privacy_policy.dart b/lib/presentation/Screens/auth_verification/privacy_policy.dart index 2a5d0b77..541bc238 100644 --- a/lib/presentation/Screens/auth_verification/privacy_policy.dart +++ b/lib/presentation/Screens/auth_verification/privacy_policy.dart @@ -7,7 +7,7 @@ import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes. class PrivacyPolicy extends StatelessWidget { PrivacyPolicy({super.key}); final fcscBanner = Image.asset( - BannerAssetPath.fcsc, + BannerAssetPath.fcscLogoLight, height: 40, alignment: Alignment.center, ); diff --git a/lib/presentation/Screens/auth_verification/registration.dart b/lib/presentation/Screens/auth_verification/registration.dart index bc08fc6a..91b6a911 100644 --- a/lib/presentation/Screens/auth_verification/registration.dart +++ b/lib/presentation/Screens/auth_verification/registration.dart @@ -8,6 +8,7 @@ import 'package:pocketbase/pocketbase.dart'; import 'package:uae_stat/config/api_config.dart'; import 'package:uae_stat/config/connectivity_provider.dart'; import 'package:uae_stat/config/my_theme.dart'; +import 'package:uae_stat/config/theme/theme_provider.dart'; import 'package:uae_stat/domain/use_cases/language.dart'; import 'package:uae_stat/infrastructure/services/img_asset_paths/banner_asset_path.dart'; import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/misc_icon_asset_path.dart'; @@ -359,10 +360,7 @@ class _RegisterScreenState extends ConsumerState { } } - final fcscBanner = Image.asset( - BannerAssetPath.fcsc, - height: 40, - ); + @override Widget build(BuildContext context) { @@ -376,6 +374,18 @@ class _RegisterScreenState extends ConsumerState { } }); + final themeMode = ref.read(themeProvider); + final isDarkTheme = themeMode == ThemeMode.dark || + (themeMode == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + + final fcscBanner = Image.asset( + isDarkTheme + ? BannerAssetPath.fcscLogoDark + : BannerAssetPath.fcscLogoLight, + height: 40, + ); + Widget buildIconContainer(IconData icon, Color iconColor) { return Container( width: 60, @@ -406,7 +416,7 @@ class _RegisterScreenState extends ConsumerState { context.go('/login'); // Show exit confirmation dialog }, child:Scaffold( - backgroundColor: Colors.white, + backgroundColor: isDarkTheme ? Color(0xFF111111) : Colors.white, body: SafeArea( child: Stack(children: [ SingleChildScrollView( @@ -452,7 +462,7 @@ class _RegisterScreenState extends ConsumerState { children: [ SizedBox(height: screenheight / 4), buildIconContainer( - Icons.report, Color(0xFF7DAFBC)), + Icons.check_circle_rounded, Color(0xFF7DAFBC)), SizedBox(height: 20), Text( context.translate( @@ -466,7 +476,8 @@ class _RegisterScreenState extends ConsumerState { ), fontSize: 16, fontWeight: FontWeight.w500, - color: Color(0xFF414042)), + color: isDarkTheme ? Color(0xFFFFFFFF) : Color(0xFF414042) + ), ), SizedBox(height: 10), Text( @@ -480,15 +491,14 @@ class _RegisterScreenState extends ConsumerState { 'NotoKufi', ), fontSize: 14, - color: Color(0xFF898C81), + color: isDarkTheme ? Color(0xFFFFFFFF) : Color(0xFF898C81), ), ), SizedBox(height: 10), ElevatedButton( onPressed: () => {context.go('/login')}, style: ElevatedButton.styleFrom( - backgroundColor: - Color(0xFFAA8E83), // Background color + backgroundColor: isDarkTheme ? Color(0xFF24B4FB) : Color(0xFFAA8E83), // Background color shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular( 12), // Border radius @@ -514,7 +524,9 @@ class _RegisterScreenState extends ConsumerState { decoration: BoxDecoration( image: DecorationImage( image: AssetImage( - "assets/splash_screen/logo.png"), // Background image asset + isDarkTheme + ? BannerAssetPath.fcscLogoDark + : BannerAssetPath.fcscLogoLight), // Background image asset fit: BoxFit.fill, ), ), @@ -544,7 +556,7 @@ class _RegisterScreenState extends ConsumerState { ), fontSize: 16, fontWeight: FontWeight.w500, - color: Color(0xFF414042)), + color: isDarkTheme ? Color(0xFFFFFFFF) : Color(0xFF414042)), ), SizedBox(height: 10), Text( @@ -558,7 +570,7 @@ class _RegisterScreenState extends ConsumerState { 'NotoKufi', ), fontSize: 14, - color: Color(0xFF898C81), + color: isDarkTheme ? Color(0xFFEEEEEE) : Color(0xFF898C81), ), ), SizedBox(height: 10), @@ -581,7 +593,8 @@ class _RegisterScreenState extends ConsumerState { fontFamily: context.translate( 'Roboto', 'NotoKufi', - ) + ), + color: isDarkTheme ? Color(0xFF24B4FB) : Color(0xFFAA8E83), ), ), ), @@ -593,7 +606,9 @@ class _RegisterScreenState extends ConsumerState { decoration: BoxDecoration( image: DecorationImage( image: AssetImage( - "assets/splash_screen/logo.png"), // Background image asset + isDarkTheme + ? BannerAssetPath.fcscLogoDark + : BannerAssetPath.fcscLogoLight), // Background image asset fit: BoxFit.fill, ), ), @@ -619,7 +634,9 @@ class _RegisterScreenState extends ConsumerState { 'NotoKufi', ), fontSize: 32, - fontWeight: FontWeight.w400), + fontWeight: FontWeight.w400, + color: isDarkTheme ? Color(0xFFFFFFFF) : null, + ), ), SizedBox(height: 10), Text( @@ -632,7 +649,7 @@ class _RegisterScreenState extends ConsumerState { ), fontSize: context.translate(18.0, 14.0), - color: const Color(0xff898C81), + color: isDarkTheme ? Color(0xFFFFFFFF) : Color(0xff898C81), fontWeight: FontWeight.w600, ), ), @@ -649,7 +666,10 @@ class _RegisterScreenState extends ConsumerState { controller: _usernameController, // focusNode: _focusNodes[0], decoration: InputDecoration( + filled: true, + fillColor: isDarkTheme ? const Color(0xFF000000) : Colors.white, errorStyle: TextStyle( + color: isDarkTheme ? Color(0xFFFFA200) : Color(0xFFb22222), fontFamily: context.translate( 'Roboto', 'NotoKufi', @@ -674,7 +694,7 @@ class _RegisterScreenState extends ConsumerState { end: 10, ), child: Image.asset( - MiscIconAssetPath.person, + MiscIconAssetPath.personLight, fit: BoxFit.fitHeight, height: 25, width: 25, @@ -695,10 +715,7 @@ class _RegisterScreenState extends ConsumerState { borderRadius: BorderRadius.circular(10), borderSide: BorderSide( - color: MyTheme.topicColor( - IndicatorTopic - .economy) - .shade400, + color: isDarkTheme ? Colors.white : MyTheme.topicColor(IndicatorTopic.economy).shade400, // ✅ border width: 1), // Enabled border ), focusedBorder: OutlineInputBorder( @@ -712,7 +729,7 @@ class _RegisterScreenState extends ConsumerState { borderRadius: BorderRadius.circular(10), borderSide: BorderSide( - color: Color(0xFFb22222), + color: isDarkTheme ? Color(0xFFFFA100) : Color(0xFFb22222), width: 1), // Error border ), focusedErrorBorder: @@ -720,7 +737,7 @@ class _RegisterScreenState extends ConsumerState { borderRadius: BorderRadius.circular(10), borderSide: BorderSide( - color: Color(0xFFb22222), + color: isDarkTheme ? Color(0xFFFFA100) : Color(0xFFb22222), width: 1), // Match the error color ), @@ -730,7 +747,7 @@ class _RegisterScreenState extends ConsumerState { 'Roboto', 'NotoKufi', ), - color: Color(0xFFC3C6CB), + color: isDarkTheme ? const Color(0xFFEEEEEE) : const Color(0xFFC3C6CB), fontSize: registerLocale ?.languageCode == 'ar' @@ -756,7 +773,10 @@ class _RegisterScreenState extends ConsumerState { controller: _emailController, // focusNode: _focusNodes[1], decoration: InputDecoration( + filled: true, + fillColor: isDarkTheme ? const Color(0xFF000000) : Colors.white, errorStyle: TextStyle( + color: isDarkTheme ? Color(0xFFFFA200) : Color(0xFFb22222), fontFamily: context.translate( 'Roboto', 'NotoKufi', @@ -798,10 +818,7 @@ class _RegisterScreenState extends ConsumerState { borderRadius: BorderRadius.circular(10), borderSide: BorderSide( - color: MyTheme.topicColor( - IndicatorTopic - .economy) - .shade400, + color: isDarkTheme ? Colors.white : MyTheme.topicColor(IndicatorTopic.economy).shade400, width: 1), ), focusedBorder: OutlineInputBorder( @@ -815,7 +832,7 @@ class _RegisterScreenState extends ConsumerState { borderRadius: BorderRadius.circular(10), borderSide: BorderSide( - color: Color(0xFFb22222), + color: isDarkTheme ? Color(0xFFFFA100) : Color(0xFFb22222), width: 1), // Error border ), focusedErrorBorder: @@ -823,7 +840,7 @@ class _RegisterScreenState extends ConsumerState { borderRadius: BorderRadius.circular(10), borderSide: BorderSide( - color: Color(0xFFb22222), + color: isDarkTheme ? Color(0xFFFFA100) : Color(0xFFb22222), width: 1), // Match the error color ), @@ -833,7 +850,7 @@ class _RegisterScreenState extends ConsumerState { 'Roboto', 'NotoKufi', ), - color: Color(0xFFC3C6CB), + color: isDarkTheme ? const Color(0xFFEEEEEE) : const Color(0xFFC3C6CB), fontSize: registerLocale ?.languageCode == 'ar' @@ -863,7 +880,10 @@ class _RegisterScreenState extends ConsumerState { // focusNode: _focusNodes[2], obscureText: _obscurePassword, decoration: InputDecoration( + filled: true, + fillColor: isDarkTheme ? const Color(0xFF000000) : Colors.white, errorStyle: TextStyle( + color: isDarkTheme ? Color(0xFFFFA200) : Color(0xFFb22222), fontFamily: context.translate( 'Roboto', 'NotoKufi', @@ -888,7 +908,7 @@ class _RegisterScreenState extends ConsumerState { end: 10, ), child: Image.asset( - MiscIconAssetPath.lock, + MiscIconAssetPath.lockLight, fit: BoxFit.fitHeight, height: 25, width: 25, @@ -936,10 +956,7 @@ class _RegisterScreenState extends ConsumerState { borderRadius: BorderRadius.circular(10), borderSide: BorderSide( - color: MyTheme.topicColor( - IndicatorTopic - .economy) - .shade400, + color: isDarkTheme ? Colors.white : MyTheme.topicColor(IndicatorTopic.economy).shade400, width: 1), ), focusedBorder: OutlineInputBorder( @@ -953,7 +970,7 @@ class _RegisterScreenState extends ConsumerState { borderRadius: BorderRadius.circular(10), borderSide: BorderSide( - color: Color(0xFFb22222), + color: isDarkTheme ? Color(0xFFFFA100) : Color(0xFFb22222), width: 1), // Error border ), focusedErrorBorder: @@ -961,7 +978,7 @@ class _RegisterScreenState extends ConsumerState { borderRadius: BorderRadius.circular(10), borderSide: BorderSide( - color: Color(0xFFb22222), + color: isDarkTheme ? Color(0xFFFFA100) : Color(0xFFb22222), width: 1), // Match the error color ), @@ -972,7 +989,7 @@ class _RegisterScreenState extends ConsumerState { 'Roboto', 'NotoKufi', ), - color: Color(0xFFC3C6CB), + color: isDarkTheme ? const Color(0xFFEEEEEE) : const Color(0xFFC3C6CB), fontSize: registerLocale ?.languageCode == 'ar' @@ -1000,7 +1017,10 @@ class _RegisterScreenState extends ConsumerState { obscureText: _obscureConfirmPassword, decoration: InputDecoration( + filled: true, + fillColor: isDarkTheme ? const Color(0xFF000000) : Colors.white, errorStyle: TextStyle( + color: isDarkTheme ? Color(0xFFFFA200) : Color(0xFFb22222), fontFamily: context.translate( 'Roboto', 'NotoKufi', @@ -1025,7 +1045,7 @@ class _RegisterScreenState extends ConsumerState { end: 10, ), child: Image.asset( - MiscIconAssetPath.lock, + MiscIconAssetPath.lockLight, fit: BoxFit.fitHeight, height: 25, width: 25, @@ -1063,10 +1083,7 @@ class _RegisterScreenState extends ConsumerState { borderRadius: BorderRadius.circular(10), borderSide: BorderSide( - color: MyTheme.topicColor( - IndicatorTopic - .economy) - .shade400, + color: isDarkTheme ? Colors.white : MyTheme.topicColor(IndicatorTopic.economy).shade400, width: 1), ), focusedBorder: OutlineInputBorder( @@ -1080,7 +1097,7 @@ class _RegisterScreenState extends ConsumerState { borderRadius: BorderRadius.circular(10), borderSide: BorderSide( - color: Color(0xFFb22222), + color: isDarkTheme ? Color(0xFFFFA100) : Color(0xFFb22222), width: 1), // Error border ), focusedErrorBorder: @@ -1088,7 +1105,7 @@ class _RegisterScreenState extends ConsumerState { borderRadius: BorderRadius.circular(10), borderSide: BorderSide( - color: Color(0xFFb22222), + color: isDarkTheme ? Color(0xFFFFA100) : Color(0xFFb22222), width: 1), // Match the error color ), @@ -1098,7 +1115,7 @@ class _RegisterScreenState extends ConsumerState { 'Roboto', 'NotoKufi', ), - color: Color(0xFFC3C6CB), + color: isDarkTheme ? const Color(0xFFEEEEEE) : const Color(0xFFC3C6CB), fontSize: registerLocale ?.languageCode == 'ar' @@ -1139,11 +1156,8 @@ class _RegisterScreenState extends ConsumerState { }, side: BorderSide( color: showError - ? Color(0xFFb22222) - : MyTheme.topicColor( - IndicatorTopic - .economy) - .shade400, + ? isDarkTheme ? Color(0xFFFFA200) : Color(0xFFb22222) + : isDarkTheme ? Colors.white : MyTheme.topicColor(IndicatorTopic.economy).shade400, width: 1, ), ), @@ -1172,9 +1186,7 @@ class _RegisterScreenState extends ConsumerState { 'ar' ? 12 : 14, - color: Color( - 0xFF898C81, - ), // Change to your desired color + color: isDarkTheme ? Color(0xFFEEEEEE) : Color(0xFF898C81), // Change to your desired color ), children: [ TextSpan( @@ -1201,8 +1213,7 @@ class _RegisterScreenState extends ConsumerState { fontWeight: FontWeight .bold, - color: Color( - 0xFF985400), + color:isDarkTheme ? Color(0xFF9EB3E4) : Color(0xFF985400), // Makes the text bold // decoration: // TextDecoration.underline, @@ -1221,8 +1232,7 @@ class _RegisterScreenState extends ConsumerState { 'Roboto', 'NotoKufi', ), - color: Color( - 0xFF898C81), // Change to your desired color + color: isDarkTheme ? Color(0xFFEEEEEE) : Color(0xFF898C81), ), ), TextSpan( @@ -1248,8 +1258,7 @@ class _RegisterScreenState extends ConsumerState { 'ar' ? 12 : 14, - color: Color( - 0xFF985400), + color: isDarkTheme ? Color(0xFF9EB3E4) : Color(0xFF985400), // decoration: // TextDecoration.underline, decorationColor: @@ -1274,8 +1283,7 @@ class _RegisterScreenState extends ConsumerState { 'ar' ? 12 : 14, - color: Color( - 0xFF898C81), // Change to your desired color + color: isDarkTheme ? Color(0xFFEEEEEE) : Color( 0xFF898C81), // Change to your desired color ), ), ], @@ -1312,7 +1320,7 @@ class _RegisterScreenState extends ConsumerState { 'Roboto', 'NotoKufi', ), - color: Color(0xFFb22222), + color: isDarkTheme ? Color(0xFFFFA200) : Color(0xFFb22222), fontSize: registerLocale ?.languageCode == 'ar' @@ -1337,8 +1345,7 @@ class _RegisterScreenState extends ConsumerState { ? null : _registerUser, style: ElevatedButton.styleFrom( - backgroundColor: Color( - 0xFFA7887A), // Brownish color for Register + backgroundColor: isDarkTheme ? Color(0xFF9EB3E4) : Color(0xFFA7887A), // Brownish color for Register shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), @@ -1362,14 +1369,14 @@ class _RegisterScreenState extends ConsumerState { 'ar' ? 14 : 16, - color: Colors.white), + color: isDarkTheme ? Color(0xFF000000) : Colors.white + ), ), SizedBox(width: 8), - const Icon( + Icon( Icons .chevron_right_outlined, - color: Colors - .white, // Set your desired color here + color: isDarkTheme ? Color(0xFF000000) : Colors.white, // Set your desired color here ) ], ), @@ -1391,7 +1398,7 @@ class _RegisterScreenState extends ConsumerState { 'ar' ? 12 : 14, - color: Color(0xFF898C81), + color: isDarkTheme ? Color(0xFFEEEEEE) : Color(0xFF898C81), ), ), SizedBox(height: 15), @@ -1408,8 +1415,7 @@ class _RegisterScreenState extends ConsumerState { context.pop(); }, style: ElevatedButton.styleFrom( - backgroundColor: Color( - 0xFF82AFCB), // Blueish color for Login + backgroundColor: isDarkTheme ? Color(0xFF24B4FB) : Color(0xFF82AFCB), // Blueish color for Login shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), @@ -1432,14 +1438,13 @@ class _RegisterScreenState extends ConsumerState { 'ar' ? 14 : 16, - color: Colors.white), + color: isDarkTheme ? Color(0xFF000000) : Colors.white), ), SizedBox(width: 8), - const Icon( + Icon( Icons .chevron_right_outlined, - color: Colors - .white, // Set your desired color here + color: isDarkTheme ? Color(0xFF000000) : Colors.white, // Set your desired color here ) ], ), diff --git a/lib/presentation/Screens/auth_verification/terms&conditions.dart b/lib/presentation/Screens/auth_verification/terms&conditions.dart index 75de14cb..2a50cd1b 100644 --- a/lib/presentation/Screens/auth_verification/terms&conditions.dart +++ b/lib/presentation/Screens/auth_verification/terms&conditions.dart @@ -7,7 +7,7 @@ import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes. class TermsOfUse extends StatelessWidget { TermsOfUse({super.key}); final fcscBanner = Image.asset( - BannerAssetPath.fcsc, + BannerAssetPath.fcscLogoLight, height: 40, alignment: Alignment.center, ); diff --git a/lib/presentation/Screens/charts/screens/chart_screen.dart b/lib/presentation/Screens/charts/screens/chart_screen.dart index 73b8a011..072b0762 100644 --- a/lib/presentation/Screens/charts/screens/chart_screen.dart +++ b/lib/presentation/Screens/charts/screens/chart_screen.dart @@ -13,6 +13,7 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:tutorial_coach_mark/tutorial_coach_mark.dart'; import 'package:uae_stat/config/api_config.dart'; import 'package:uae_stat/config/connectivity_provider.dart'; +import 'package:uae_stat/config/theme/theme_provider.dart'; import 'package:uae_stat/config/toast_util.dart'; import 'package:uae_stat/config/toggle_lang_service.dart'; import 'package:uae_stat/domain/use_cases/language.dart'; @@ -97,9 +98,11 @@ class _ChartScreen1State extends ConsumerState { bool isBookmarked = false; // Track bookmark state String? bookmarkId; // Stores the ID of the bookmark record in PocketBase late final Locale locale; + late ThemeMode currentTheme; late String mainTopic; late UserService _userService; late double tourCard; + late bool isDarkTheme; @override void initState() { @@ -110,9 +113,17 @@ class _ChartScreen1State extends ConsumerState { checkIfBookmarked(); locale = ref.read(localeProvider) ?? const Locale('en'); print('locale-$locale'); + currentTheme = ref.read(themeProvider); + print('123456789'); + print(currentTheme); + final isDark = currentTheme == ThemeMode.dark || + (currentTheme == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + + final themeMode = (isDark ? 'dark' : 'light'); fetchChartData(widget.dataSets, locale?.languageCode ?? 'en', widget.kpi, - widget.filter_data) + widget.filter_data,themeMode) .then((_) { if (_tabsData.isNotEmpty) { // Call onTabSelected for the first tab @@ -1399,13 +1410,13 @@ class _ChartScreen1State extends ConsumerState { }); } - Future fetchChartData(String dataSets, locale, kpi, filter_data) async { + Future fetchChartData(String dataSets, locale, kpi, filter_data,themeMode) async { var data = - await apiService.fetchChartData(dataSets, locale, kpi, filter_data); + await apiService.fetchChartData(dataSets, locale, kpi, filter_data,themeMode); tabFilteredKpi = kpi; print('FETCH KPI- $kpi'); - print('FETCH KFilter- $filter_data'); + print('FETCH KFilter- $filter_data'); print('locale1 - $locale'); // print('locale11 - $loacleData'); @@ -1502,12 +1513,19 @@ class _ChartScreen1State extends ConsumerState { print('locale2- $locale'); + final isDark = currentTheme == ThemeMode.dark || + (currentTheme == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + + final themeMode = (isDark ? 'dark' : 'light'); + // Call fetchChartData with correct parameters fetchChartData( widget.dataSets, locale, tabWiseKpi, // Ensure you are passing the correct KPI here - formattedFilters // Pass the formatted filter data here + formattedFilters, // Pass the formatted filter data here + themeMode ); // Navigator.pop(context); @@ -1677,7 +1695,7 @@ class _ChartScreen1State extends ConsumerState { child: Container( width: MediaQuery.of(context).size.width * 0.7, height: MediaQuery.of(context).size.height, - color: Colors.white, + color: isDarkTheme ? Color(0xFF111111) : Colors.white, child: Column( children: [ // Header Section @@ -1693,7 +1711,7 @@ class _ChartScreen1State extends ConsumerState { UaeNumbersAssetPath.filterCharts, semanticsLabel: 'Filter', colorFilter: ColorFilter.mode( - Color(0xFF8E8E8E), BlendMode.srcIn), + isDarkTheme ? Color(0xFFFFFFFF) : Color(0xFF8E8E8E), BlendMode.srcIn), width: 25, height: 25, ), @@ -1704,7 +1722,7 @@ class _ChartScreen1State extends ConsumerState { 'المرشحات', ), style: TextStyle( - color: Color(0xFF8E8E8E), + color: isDarkTheme ? Color(0xFFFFFFFF) : Color(0xFF8E8E8E), fontSize: 20, fontWeight: FontWeight.w500, fontFamily: context.translate( @@ -1763,7 +1781,7 @@ class _ChartScreen1State extends ConsumerState { 'Roboto', 'NotoKufi', ), - color: Color(0xFF8E8E8E), + color: isDarkTheme ? Color(0xFFFFFFFF) : Color(0xFF8E8E8E), ), ), InkWell( @@ -1838,7 +1856,9 @@ class _ChartScreen1State extends ConsumerState { fontFamily: context.translate( 'Roboto', 'NotoKufi', - ) + ), + color: isDarkTheme ? Color(0xFFFFFFFF) : null, + ), ), ), @@ -1868,7 +1888,7 @@ class _ChartScreen1State extends ConsumerState { // "${locale == 'ar' ? 'يختار ' : 'Select '}" "${context.translate(filter_text_and_order['en'], filter_text_and_order['ar'])}", style: TextStyle( - color: Colors.grey, + color: isDarkTheme ? Color(0xFFFFFFFF) : Colors.grey, fontFamily: context.translate( 'Roboto', 'NotoKufi', @@ -1931,12 +1951,18 @@ class _ChartScreen1State extends ConsumerState { ref.watch(localeProvider)?.languageCode ?? 'en'; print('locale22- $locale'); + final isDark = currentTheme == ThemeMode.dark || + (currentTheme == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + + final themeMode = (isDark ? 'dark' : 'light'); fetchChartData( widget.dataSets, locale, tabWiseKpi, // Ensure you are passing the correct KPI here - formattedFilters // Pass the formatted filter data here + formattedFilters, // Pass the formatted filter data here + themeMode ); Navigator.pop(context); }, @@ -1993,12 +2019,17 @@ class _ChartScreen1State extends ConsumerState { ref.watch(localeProvider)?.languageCode ?? 'en'; print('locale22- $locale'); + final isDark = currentTheme == ThemeMode.dark || + (currentTheme == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + final themeMode = (isDark ? 'dark' : 'light'); fetchChartData( widget.dataSets, locale, tabWiseKpi, // Ensure you are passing the correct KPI here - formattedFilters // Pass the formatted filter data here + formattedFilters, // Pass the formatted filter data here + themeMode ); Navigator.pop(context); } else { @@ -2310,6 +2341,7 @@ class _ChartScreen1State extends ConsumerState { // return 1.0; // Default fallback (should never be reached) // } + @override Widget build(BuildContext context) { final locale = ref.watch(localeProvider); @@ -2342,10 +2374,17 @@ class _ChartScreen1State extends ConsumerState { currentTab = tabWiseKpi; print('Saving currentTab: $currentTab After locale change'); + final currentTheme = ref.read(themeProvider); + final isDark = currentTheme == ThemeMode.dark || + (currentTheme == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + + final themeString = isDark ? 'dark' : 'light'; + final List> safeFilterData = widget.filter_data ?? []; final String safeKpi = widget.kpi ?? ''; - fetchChartData(widget.dataSets, localeCode, safeKpi, safeFilterData) + fetchChartData(widget.dataSets, localeCode, safeKpi, safeFilterData,themeString) .then((_) { print('DEBUG KPI: $safeKpi'); @@ -2362,6 +2401,55 @@ class _ChartScreen1State extends ConsumerState { } }); }); + + ref.listen(themeProvider, (previous, next) async { + final localeCode = ref.watch(localeProvider)?.languageCode ?? 'en'; + print(localeCode); + + // Default to 'en' if null + setState(() { + isLoading = true; + print('isLoadingref $isLoading'); + }); + + // fetchChartData(widget.dataSets, localeCode); + print('Saving currentTab: $tabWiseKpi before locale change'); + print('localeCodeWgt- $localeCode'); + currentTab = tabWiseKpi; + print('Saving currentTab: $currentTab After locale change'); + + final currentTheme = ref.read(themeProvider); + final isDark = currentTheme == ThemeMode.dark || + (currentTheme == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + + final themeString = isDark ? 'dark' : 'light'; + + final List> safeFilterData = + widget.filter_data ?? []; + final String safeKpi = widget.kpi ?? ''; + + /// 🔥 Call your API + fetchChartData(widget.dataSets, localeCode, safeKpi, safeFilterData, themeString) + .then((_) { + print('DEBUG KPI: $safeKpi'); + print('TAB11: $currentTab'); + + if (currentTab.isNotEmpty) { + onTabSelected(currentTab); + print('TAB1: $currentTab'); + } else if (_tabsData.isNotEmpty) { + print('TAB2: $_tabsData'); + onTabSelected(_tabsData[0]['id']); + } + }); + }); + + final themeMode = ref.watch(themeProvider); + isDarkTheme = themeMode == ThemeMode.dark || + (themeMode == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + double myheight = MediaQuery.of(context).size.height; double mywidth = MediaQuery.of(context).size.width; mainTopic = chartScreenData['main_topic'] ?? ''; @@ -2763,7 +2851,8 @@ class _ChartScreen1State extends ConsumerState { child: CardWidget( card: card, chartScreenData: - chartScreenData)), + chartScreenData, + themeMode: themeMode)), ], )); } else { @@ -2771,7 +2860,7 @@ class _ChartScreen1State extends ConsumerState { child: CardWidget( card: card, chartScreenData: - chartScreenData))); + chartScreenData,themeMode: themeMode))); if (tempRow.length == 2) { rows.add(Row(children: tempRow)); tempRow = []; @@ -2796,6 +2885,21 @@ class _ChartScreen1State extends ConsumerState { shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemBuilder: (context, index) { + final isDarkTheme = themeMode == ThemeMode.dark || + (themeMode == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + + final Map mainTopicColors = { + 'ECONOMY': Color(0xFF071F3B), + 'SOCIAL': Color(0xFF4F241B), + 'ENVIRONMENT': Color(0xFF16523C), + }; + + final String mainTopic = chartScreenData['main_topic']; + final Color backgroundColor = isDarkTheme + ? (mainTopicColors[mainTopic] ?? Colors.white) // fallback if key not found + : Colors.white; + return Card( margin: const EdgeInsets.all(10), child: Container( @@ -2811,7 +2915,7 @@ class _ChartScreen1State extends ConsumerState { ), // Border color width: 1, // Border width ), - color: Colors.white, + color: backgroundColor, borderRadius: BorderRadius.circular( 8), // Optional: Rounded corners ), @@ -2858,7 +2962,7 @@ class _ChartScreen1State extends ConsumerState { chartData: chartsData[index], bodyColor: bodyColor, - chartHeader: chartHeader), + chartHeader: chartHeader,isDarkTheme: isDarkTheme), ) ], ), @@ -2876,7 +2980,7 @@ class _ChartScreen1State extends ConsumerState { ), if (isLoading) Container( - color: Color(0x98FFFCE5), // Semi-transparent background + color: isDarkTheme ? Colors.transparent : Color(0x98FFFCE5), // Semi-transparent background child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -2885,8 +2989,7 @@ class _ChartScreen1State extends ConsumerState { horizontal: 40), // Left & Right space child: LinearProgressIndicator( minHeight: 5, // Adjust thickness - backgroundColor: - Colors.grey[100], // Optional: Background color + backgroundColor: isDarkTheme ? Colors.transparent : Colors.grey[100], // Optional: Background color valueColor: AlwaysStoppedAnimation( Color(0xFFAA8E83)), // Loader color ), @@ -2972,9 +3075,10 @@ Color _getColorFromHex(String hexColor) { class CardWidget extends StatelessWidget { final Map card; final Map chartScreenData; + final themeMode; const CardWidget( - {Key? key, required this.card, required this.chartScreenData}) + {Key? key, required this.card, required this.chartScreenData,required this.themeMode}) : super(key: key); @override @@ -2995,6 +3099,23 @@ class CardWidget extends StatelessWidget { ), ); + final isDarkTheme = themeMode == ThemeMode.dark || + (themeMode == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + + final Map mainTopicColors = { + 'ECONOMY': Color(0xFF071F3B), + 'SOCIAL': Color(0xFF4F241B), + 'ENVIRONMENT': Color(0xFF16523C), + }; + + final String mainTopic = chartScreenData['main_topic']; + final Color backgroundColor = isDarkTheme + ? (mainTopicColors[mainTopic] ?? Colors.white) // fallback if key not found + : Colors.white; + + + if (response.isEmpty) { return SizedBox.shrink(); } else if (response.length == 1) { @@ -3010,6 +3131,7 @@ class CardWidget extends StatelessWidget { // Dynamic border color width: 1, // Adjust border thickness ), + ), child: Card( margin: const EdgeInsets.all(0), @@ -3023,7 +3145,7 @@ class CardWidget extends StatelessWidget { padding: const EdgeInsets.only( left: 16.0, right: 16.0, bottom: 2.0, top: 1.0), decoration: BoxDecoration( - color: Colors.white, // Move color inside BoxDecoration + color: backgroundColor, // Move color inside BoxDecoration borderRadius: BorderRadius.circular( 12), // Ensure border radius is applied ), @@ -3061,7 +3183,9 @@ class CardWidget extends StatelessWidget { ), child: Text( chart_heading ?? 'NA', - style: TextStyle(color: Colors.white, fontFamily: context.translate( + style: TextStyle( + color: Colors.white, + fontFamily: context.translate( 'Roboto', 'NotoKufi', ),), @@ -3087,7 +3211,7 @@ class CardWidget extends StatelessWidget { ), fontSize: 11, fontWeight: FontWeight.w400, - color: Colors.black87, + color: isDarkTheme ? Color(0xFFFFFFFF) : Colors.black87, ), ), ), @@ -3170,7 +3294,7 @@ class CardWidget extends StatelessWidget { // padding: const EdgeInsets.only( // left: 10.0, right: 10.0, bottom: 5.0, top: 1.0), decoration: BoxDecoration( - color: Colors.white, // Move color inside BoxDecoration + color: backgroundColor, // Move color inside BoxDecoration borderRadius: BorderRadius.circular(12), // Ensure border radius is applied ), @@ -3209,7 +3333,10 @@ class CardWidget extends StatelessWidget { child: Text( chart_heading ?? 'NA', style: - TextStyle(color: Colors.white, fontSize: 10, fontFamily: context.translate( + TextStyle( + color: Colors.white, + fontSize: 10, + fontFamily: context.translate( 'Roboto', 'NotoKufi', ),), @@ -3235,7 +3362,7 @@ class CardWidget extends StatelessWidget { ), fontSize: 11, fontWeight: FontWeight.w400, - color: Colors.black87, + color: isDarkTheme ? Color(0xFFFFFFFF) : Colors.black87, ), ), ), diff --git a/lib/presentation/Screens/charts/services/api_service.dart b/lib/presentation/Screens/charts/services/api_service.dart index 634e0793..7bf35b69 100644 --- a/lib/presentation/Screens/charts/services/api_service.dart +++ b/lib/presentation/Screens/charts/services/api_service.dart @@ -17,7 +17,7 @@ class ApiService { static const String baseUrl = '$apiUrl/api/getDataSet'; Future> fetchChartData(String dataSets, locale, kpi, - List> filterData) async { + List> filterData,themeMode) async { List isChartData = []; List nonChartData = []; List originalChartsData = []; @@ -36,11 +36,13 @@ class ApiService { 'kpi': kpi.isNotEmpty ? kpi : null, // Avoid sending empty kpi 'filter_data': filterData.isNotEmpty ? filterData : [], // Avoid empty list + 'color_mode' : themeMode, }; // final url = Uri.https('$baseUrl?dataset=$dataSets&language=$locale'); print('APISErvice - $url'); + print('requestBody: $requestBody'); try { final response = await http.post( diff --git a/lib/presentation/Screens/charts/widgets/chart_widget.dart b/lib/presentation/Screens/charts/widgets/chart_widget.dart index 1e1cb772..5e19098a 100644 --- a/lib/presentation/Screens/charts/widgets/chart_widget.dart +++ b/lib/presentation/Screens/charts/widgets/chart_widget.dart @@ -15,10 +15,12 @@ class ChartWidget extends StatelessWidget { required this.chartData, required this.bodyColor, required this.chartHeader, + required this.isDarkTheme }) : super(key: key); final dynamic chartData; final Color bodyColor; final String chartHeader; + final isDarkTheme; List showingTooltipOnSpots = []; // To store indices of active tooltips late LineChartBarData tooltipsOnBar; // Needs proper initialization @@ -336,7 +338,7 @@ class ChartWidget extends StatelessWidget { ), fontSize: isTouched ? 12 : (percentage < 1 ? 10 : 11), fontWeight: FontWeight.bold, - color: Colors.black, + color: isDarkTheme ? Colors.white : Colors.black, // color: Colors.white, ), // titlePositionPercentageOffset: 1.4, @@ -514,7 +516,7 @@ class ChartWidget extends StatelessWidget { style: TextStyle(fontFamily: context.translate( 'Roboto', 'NotoKufi', - ),fontSize: 12), + ),fontSize: 12,color: isDarkTheme ? Colors.white : null), softWrap: true, maxLines: 2, ), @@ -706,7 +708,7 @@ class ChartWidget extends StatelessWidget { style: TextStyle(fontFamily: context.translate( 'Roboto', 'NotoKufi', - ),fontSize: 14, fontWeight: FontWeight.w400), + ),fontSize: 14, fontWeight: FontWeight.w400,color: isDarkTheme ? Colors.white : Colors.black), textAlign: TextAlign.center, ), SizedBox(height: 15), @@ -807,7 +809,7 @@ class ChartWidget extends StatelessWidget { style: TextStyle(fontFamily: context.translate( 'Roboto', 'NotoKufi', - ),fontSize: 14, fontWeight: FontWeight.w400), + ),fontSize: 14, fontWeight: FontWeight.w400,color: isDarkTheme ? Colors.white : Colors.black), textAlign: TextAlign.center, ), SizedBox(height: 5), @@ -1198,7 +1200,7 @@ class ChartWidget extends StatelessWidget { style: TextStyle(fontFamily: context.translate( 'Roboto', 'NotoKufi', - ),fontSize: 14, fontWeight: FontWeight.w400), + ),fontSize: 14, fontWeight: FontWeight.w400,color: isDarkTheme ? Colors.white : Colors.black), textAlign: TextAlign.center, ), SizedBox(height: 5), @@ -1432,7 +1434,7 @@ class ChartWidget extends StatelessWidget { }); return Scaffold( - backgroundColor: Colors.white, + backgroundColor: isDarkTheme ? Colors.transparent : Colors.white, body: Padding( padding: const EdgeInsets.all(10), child: LayoutBuilder( @@ -1464,7 +1466,7 @@ class ChartWidget extends StatelessWidget { style: TextStyle( fontFamily: context.translate('Roboto', 'NotoKufi'), fontSize: 14, - fontWeight: FontWeight.w400, + fontWeight: FontWeight.w400,color: isDarkTheme ? Colors.white : Colors.black, ), textAlign: TextAlign.center, ), @@ -1487,8 +1489,8 @@ class ChartWidget extends StatelessWidget { sideTitles: SideTitles( showTitles: true, getTitlesWidget: (value, meta) { - const style = TextStyle( - color: Colors.black, + var style = TextStyle( + color: isDarkTheme ? Colors.white : Colors.black, fontSize: 10, ); @@ -1501,7 +1503,7 @@ class ChartWidget extends StatelessWidget { Container( width: 1, height: 8, - color: Colors.black, + color: isDarkTheme ? Colors.white : Colors.black, margin: EdgeInsets.only(bottom: 2), ), Text(value.toInt().toString(), style: style), @@ -1528,9 +1530,9 @@ class ChartWidget extends StatelessWidget { ), borderData: FlBorderData( show: true, - border: const Border( + border: Border( left: BorderSide.none, - bottom: BorderSide(color: Colors.black), + bottom: BorderSide(color: isDarkTheme ? Colors.white : Colors.black), ), ), gridData: FlGridData(show: false), @@ -1546,7 +1548,7 @@ class ChartWidget extends StatelessWidget { // if (x == minX || x == maxX) return null; return LineTooltipItem( formatNumber(spot.y), - const TextStyle(color: Colors.white), + TextStyle(color: isDarkTheme ? Colors.white : Colors.white), ); }).toList(); }, @@ -1576,7 +1578,7 @@ class ChartWidget extends StatelessWidget { fontSize: 9, fontWeight: FontWeight.w500, // color: color, - color: Colors.black, + color: isDarkTheme ? Colors.white : Colors.black, ), ), ) @@ -1804,7 +1806,7 @@ class ChartWidget extends StatelessWidget { }); return Scaffold( - backgroundColor: Colors.white, + backgroundColor: isDarkTheme ? Colors.transparent : Colors.white, body: Padding( padding: const EdgeInsets.all(10), child: LayoutBuilder( @@ -1836,7 +1838,7 @@ class ChartWidget extends StatelessWidget { style: TextStyle( fontFamily: context.translate('Roboto', 'NotoKufi'), fontSize: 14, - fontWeight: FontWeight.w400, + fontWeight: FontWeight.w400,color: isDarkTheme ? Colors.white : Colors.black, ), textAlign: TextAlign.center, ), @@ -1859,8 +1861,8 @@ class ChartWidget extends StatelessWidget { sideTitles: SideTitles( showTitles: true, getTitlesWidget: (value, meta) { - const style = TextStyle( - color: Colors.black, + var style = TextStyle( + color: isDarkTheme ? Colors.white : Colors.black, fontSize: 10, ); @@ -1873,7 +1875,7 @@ class ChartWidget extends StatelessWidget { Container( width: 1, height: 8, - color: Colors.black, + color: isDarkTheme ? Colors.white : Colors.black, margin: EdgeInsets.only(bottom: 2), ), Text(value.toInt().toString(), style: style), @@ -1900,9 +1902,9 @@ class ChartWidget extends StatelessWidget { ), borderData: FlBorderData( show: true, - border: const Border( + border: Border( left: BorderSide.none, - bottom: BorderSide(color: Colors.black), + bottom: BorderSide(color: isDarkTheme ? Colors.white : Colors.black), ), ), gridData: FlGridData(show: false), @@ -1929,7 +1931,7 @@ class ChartWidget extends StatelessWidget { } return LineTooltipItem( formatNumber(spot.y), - const TextStyle(color: Colors.white), + TextStyle(color: isDarkTheme ? Colors.white : Colors.white), ); }).toList(); }, @@ -1959,7 +1961,7 @@ class ChartWidget extends StatelessWidget { fontSize: 9, fontWeight: FontWeight.w500, // color: color, - color: Colors.black, + color: isDarkTheme ? Colors.white : Colors.black, ), ), ) @@ -2105,7 +2107,7 @@ class ChartWidget extends StatelessWidget { style: TextStyle(fontFamily: context.translate( 'Roboto', 'NotoKufi', - ),fontSize: 14, fontWeight: FontWeight.w400), + ),fontSize: 14, fontWeight: FontWeight.w400,color: isDarkTheme ? Colors.white : Colors.black), textAlign: TextAlign.center, ), SizedBox(height: 5), @@ -2219,7 +2221,7 @@ class ChartWidget extends StatelessWidget { 'Roboto', 'NotoKufi', ), - color: Colors.black, + color: isDarkTheme ? Colors.white : Colors.black, fontSize: 12, fontWeight: FontWeight.w400, ), @@ -2460,7 +2462,7 @@ class ChartWidget extends StatelessWidget { style: TextStyle(fontFamily: context.translate( 'Roboto', 'NotoKufi', - ),fontSize: 14, fontWeight: FontWeight.w400), + ),fontSize: 14, fontWeight: FontWeight.w400,color: isDarkTheme ? Colors.white : Colors.black), textAlign: TextAlign.center, ), // SizedBox(height: 5), @@ -2511,7 +2513,7 @@ class ChartWidget extends StatelessWidget { 'Roboto', 'NotoKufi', ), - color: Colors.black, + color: isDarkTheme ? Colors.white : Colors.black, fontSize: 12, fontWeight: FontWeight.w400, ), @@ -2712,7 +2714,7 @@ class ChartWidget extends StatelessWidget { style: TextStyle(fontFamily: context.translate( 'Roboto', 'NotoKufi', - ),fontSize: 14, fontWeight: FontWeight.w400), + ),fontSize: 14, fontWeight: FontWeight.w400,color: isDarkTheme ? Colors.white : Colors.black), textAlign: TextAlign.center, ), SizedBox(height: 5), @@ -3028,7 +3030,7 @@ class ChartWidget extends StatelessWidget { style: TextStyle(fontFamily: context.translate( 'Roboto', 'NotoKufi', - ),fontSize: 14, fontWeight: FontWeight.w400), + ),fontSize: 14, fontWeight: FontWeight.w400,color: isDarkTheme ? Colors.white : Colors.black), textAlign: TextAlign.center, ), SizedBox(height: 5), @@ -3208,7 +3210,7 @@ class ChartWidget extends StatelessWidget { 'Roboto', 'NotoKufi', ), - color: Colors.black, + color: isDarkTheme ? Colors.white : Colors.black, fontSize: 12, ), ); @@ -3240,7 +3242,7 @@ class ChartWidget extends StatelessWidget { 'Roboto', 'NotoKufi', ), - color: Colors.black, + color: isDarkTheme ? Colors.white : Colors.black, fontSize: 12, ), ); @@ -3529,7 +3531,7 @@ class ChartWidget extends StatelessWidget { }); return Scaffold( - backgroundColor: Colors.white, + backgroundColor: isDarkTheme ? Colors.transparent : Colors.white, body: Padding( padding: const EdgeInsets.all(10), child: LayoutBuilder( @@ -3561,7 +3563,7 @@ class ChartWidget extends StatelessWidget { style: TextStyle( fontFamily: context.translate('Roboto', 'NotoKufi'), fontSize: 14, - fontWeight: FontWeight.w400, + fontWeight: FontWeight.w400,color: isDarkTheme ? Colors.white : Colors.black, ), textAlign: TextAlign.center, ), @@ -3584,8 +3586,8 @@ class ChartWidget extends StatelessWidget { sideTitles: SideTitles( showTitles: true, getTitlesWidget: (value, meta) { - const style = TextStyle( - color: Colors.black, + var style = TextStyle( + color: isDarkTheme ? Colors.white : Colors.black, fontSize: 10, ); @@ -3598,7 +3600,7 @@ class ChartWidget extends StatelessWidget { Container( width: 1, height: 8, - color: Colors.black, + color: isDarkTheme ? Colors.white : Colors.black, margin: EdgeInsets.only(bottom: 2), ), Text(value.toInt().toString(), style: style), @@ -3625,9 +3627,9 @@ class ChartWidget extends StatelessWidget { ), borderData: FlBorderData( show: true, - border: const Border( + border: Border( left: BorderSide.none, - bottom: BorderSide(color: Colors.black), + bottom: BorderSide(color: isDarkTheme ? Colors.white : Colors.black), ), ), gridData: FlGridData(show: false), @@ -3643,7 +3645,7 @@ class ChartWidget extends StatelessWidget { // if (x == minX || x == maxX) return null; return LineTooltipItem( formatNumber(spot.y), - const TextStyle(color: Colors.white), + TextStyle(color: isDarkTheme ? Colors.white : Colors.white), ); }).toList(); }, @@ -3719,7 +3721,7 @@ class ChartWidget extends StatelessWidget { fontSize: 9, fontWeight: FontWeight.w500, // color: color, - color: Colors.black, + color: isDarkTheme ? Colors.white : Colors.black, ), ), ) diff --git a/lib/presentation/components/constant/constant.dart b/lib/presentation/components/constant/constant.dart index 6fbc00ab..2b64b8c2 100644 --- a/lib/presentation/components/constant/constant.dart +++ b/lib/presentation/components/constant/constant.dart @@ -13,7 +13,7 @@ TextStyle subtitleStyle(BuildContext context) { color: const Color(0xFF8E8E8E), ); } -TextStyle robotoRegular11(BuildContext context) +TextStyle robotoRegular11(BuildContext context,isDarkTheme) {return TextStyle(fontFamily: context.translate('Roboto', 'NotoKufi'), fontWeight: FontWeight.w400, - fontSize: 12 * 1.1,color: Color(0xFF000000),);} + fontSize: 12 * 1.1,color: isDarkTheme ? Color(0xFFFFFFFF) : Color(0xFF000000),);} diff --git a/lib/presentation/components/dialogs.dart b/lib/presentation/components/dialogs.dart index 88430de5..198466b9 100644 --- a/lib/presentation/components/dialogs.dart +++ b/lib/presentation/components/dialogs.dart @@ -100,7 +100,10 @@ extension Dialogs on BuildContext { final contentText = Text(content); return AlertDialog( title: Text(title, - style: TextStyle(color: Color(0xFF898C81),fontWeight: FontWeight.w700),), + style: TextStyle( + color: Color(0xFF898C81), + fontWeight: FontWeight.w700) + ), content: content.length > 300 ? SingleChildScrollView( child:Text( diff --git a/lib/presentation/components/themed_text_field.dart b/lib/presentation/components/themed_text_field.dart index aa6aa5ae..a6feb982 100644 --- a/lib/presentation/components/themed_text_field.dart +++ b/lib/presentation/components/themed_text_field.dart @@ -13,6 +13,11 @@ class ThemedFormField extends HookWidget { required this.controller, this.validator, this.isObscurable = false, + this.hintColor, + this.backgroundColor, + this.borderColor, + this.errorBorderColor, + this.errorTextColor, }); final String hintText; @@ -20,6 +25,11 @@ class ThemedFormField extends HookWidget { final String? Function(String? text)? validator; final TextEditingController controller; final bool isObscurable; + final Color? hintColor; + final Color? backgroundColor; + final Color? borderColor; + final Color? errorBorderColor; + final Color? errorTextColor; @override Widget build(BuildContext context) { @@ -49,25 +59,40 @@ class ThemedFormField extends HookWidget { 'Roboto', 'NotoKufi', ), + color: errorTextColor ?? const Color(0xFFB22222), + ), + errorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: BorderSide( + color: errorBorderColor ?? const Color(0xFFB22222), + width: 1, + ), + ), + focusedErrorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: BorderSide( + color: errorBorderColor ?? const Color(0xFFB22222), + width: 1, + ), ), filled: true, - fillColor: Colors.white, + fillColor: backgroundColor ?? Colors.white, contentPadding: const EdgeInsets.symmetric(vertical: 14, horizontal: 15), border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), borderSide: BorderSide( - color: MyTheme.topicColor(IndicatorTopic.economy).shade300, + color: borderColor ?? MyTheme.topicColor(IndicatorTopic.economy).shade300, ), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(10), borderSide: BorderSide( - color: MyTheme.topicColor(IndicatorTopic.economy).shade300, + color: borderColor ?? MyTheme.topicColor(IndicatorTopic.economy).shade300, ), ), hintText: hintText, - hintStyle: const TextStyle( - color: Color(0xffC3C6CB), + hintStyle: TextStyle( // ✅ dynamic hint color + color: hintColor ?? const Color(0xffC3C6CB), ), prefixIconConstraints: const BoxConstraints( maxWidth: 25 + 16 + 10, diff --git a/lib/presentation/routes/auth_routes/login_route.dart b/lib/presentation/routes/auth_routes/login_route.dart index d879b490..3f549795 100644 --- a/lib/presentation/routes/auth_routes/login_route.dart +++ b/lib/presentation/routes/auth_routes/login_route.dart @@ -15,6 +15,9 @@ import 'package:the_validator/the_validator.dart'; import 'package:uae_stat/config/app_links_helper.dart'; import 'package:uae_stat/config/connectivity_provider.dart'; import 'package:uae_stat/config/my_theme.dart'; +import 'package:uae_stat/config/theme/app_theme.dart'; +import 'package:uae_stat/config/theme/service.dart'; +import 'package:uae_stat/config/theme/theme_provider.dart'; import 'package:uae_stat/domain/use_cases/auth_use_case.dart'; import 'package:uae_stat/domain/use_cases/language.dart'; import 'package:uae_stat/infrastructure/services/img_asset_paths/banner_asset_path.dart'; @@ -312,6 +315,16 @@ class LoginRoute extends HookConsumerWidget { } } + Future initializeTheme(BuildContext context,WidgetRef ref, String userId) async { + final themeService = ThemeBaseService(); + final theme = await themeService.getUserTheme(userId); // e.g., "dark" + final platformBrightness = MediaQuery.of(context).platformBrightness; + ref.read(themeProvider.notifier).updateTheme(AppThemeExtension.fromString(theme),platformBrightness); + final themeMode = ref.watch(themeProvider); + print('themeMode Login'); + print('themeMode $themeMode'); + } + @override Widget build(BuildContext context, WidgetRef ref) { @@ -321,6 +334,11 @@ class LoginRoute extends HookConsumerWidget { } }); + final themeMode = ref.read(themeProvider); + final isDarkTheme = themeMode == ThemeMode.dark || + (themeMode == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + // useEffect(() { // // Wait until first frame is rendered // Future.microtask(() { @@ -373,7 +391,7 @@ class LoginRoute extends HookConsumerWidget { 'NotoKufi', ), fontSize: locale?.languageCode == 'ar' ? 18 : 20, - color: Color(0xFF898C81), + color: isDarkTheme ? Color(0xFFFFFFFF) : Color(0xFF898C81), fontWeight: FontWeight.w600), ), content: Form( @@ -387,6 +405,7 @@ class LoginRoute extends HookConsumerWidget { 'Roboto', 'NotoKufi', ), + color: isDarkTheme ? Color(0xFFFFA100) : Colors.red, ), labelText: context.translate( 'Email address', @@ -398,9 +417,42 @@ class LoginRoute extends HookConsumerWidget { 'NotoKufi', ), fontSize: locale?.languageCode == 'ar' ? 13 : 16, - color: Color(0xFF898C81), // For label text color + color: isDarkTheme ? Color(0xFFFFFFFF) : Color(0xFF898C81), // For label text color // fontWeight: FontWeight.w600, ), + // ✅ Default Border + + + + + // ✅ Bottom border (no outline) + enabledBorder: UnderlineInputBorder( + borderSide: BorderSide( + color: isDarkTheme ? Colors.white : const Color(0xFF898C81), + width: 1, + ), + ), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide( + color: isDarkTheme ? const Color(0xFF24B4FB) : Colors.deepPurple, + width: 2, + ), + ), + errorBorder: UnderlineInputBorder( + borderSide: BorderSide( + color: isDarkTheme ? const Color(0xFFFFA100) : Colors.red, + width: 1, + ), + ), + focusedErrorBorder: UnderlineInputBorder( + borderSide: BorderSide( + color: isDarkTheme ? const Color(0xFFFFA100) : Colors.red, + width: 2, + ), + ), + + + ), ), ), @@ -409,9 +461,10 @@ class LoginRoute extends HookConsumerWidget { onPressed: Navigator.of(dialogCtx, rootNavigator: true).pop, style: TextButton.styleFrom( // backgroundColor: Colors.white, // Background color - foregroundColor: Color(0xFF92722A), // Font (text) color + foregroundColor: isDarkTheme ? Color(0xFF24B4FB) : Color(0xFF92722A), // Font (text) color side: BorderSide( - color: Color(0xFF92722A)), // Border outline color + color: isDarkTheme ? Color(0xFF24B4FB) : Color(0xFF92722A) + ), // Border outline color shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), // Optional: Rounded corners @@ -439,7 +492,7 @@ class LoginRoute extends HookConsumerWidget { ); }, style: ElevatedButton.styleFrom( - backgroundColor: Color(0xFF92722A), + backgroundColor: isDarkTheme ? Color(0xFF24B4FB) : Color(0xFF92722A), foregroundColor: Colors.white, padding: EdgeInsets.symmetric( horizontal: 10 , vertical: 10), // Optional: Adjusts size @@ -500,7 +553,7 @@ class LoginRoute extends HookConsumerWidget { ), fontWeight: FontWeight.bold, fontSize: locale?.languageCode == 'ar' ? 12 : 14, - color: Color(0xFF985400), + color: isDarkTheme ? Color(0xFF9EB3E4) : Color(0xFF985400), ), ), ); @@ -605,6 +658,7 @@ class LoginRoute extends HookConsumerWidget { await saveUserId(userId, loginCount); await getDeviceToken(context, userId); + await initializeTheme(context,ref,userId); } try { final bool isProfileComplete = await profileStatus(userId, ref); @@ -681,7 +735,8 @@ class LoginRoute extends HookConsumerWidget { ), ), backgroundColor: WidgetStatePropertyAll( - MyTheme.topicColor(IndicatorTopic.social), + isDarkTheme ? Color(0xFF24B4FB) : Color(0xFFAA8E83), + // MyTheme.topicColor(IndicatorTopic.social), ), // surfaceTintColor: MaterialStatePropertyAll( // MyTheme.economy[800], @@ -705,12 +760,13 @@ class LoginRoute extends HookConsumerWidget { ), fontSize: locale?.languageCode == 'ar' ? 12 : 18, fontWeight: FontWeight.w500, + color: isDarkTheme ? Color(0xFF000000) : null, ), ), 6.horizontalSpace, - const Icon( + Icon( Icons.chevron_right_outlined, - color: Colors.white, // Set your desired color here + color: isDarkTheme ? Color(0xFF000000) : Colors.white, // Set your desired color here ) ], ), @@ -725,6 +781,11 @@ class LoginRoute extends HookConsumerWidget { 'Email', 'بريد إلكتروني', ), + hintColor: isDarkTheme ? Color(0XFFEEEEEE) : Color(0xFFC3C6CB), + backgroundColor: isDarkTheme ? Color(0xFF000000) : Colors.white, + borderColor: isDarkTheme ? Colors.white : MyTheme.topicColor(IndicatorTopic.economy).shade300, + errorBorderColor: isDarkTheme ? const Color(0xFFFFA100) : const Color(0xFFB22222), + errorTextColor: isDarkTheme ? const Color(0xFFFFA100) : const Color(0xFFB22222), validator: (value) { final emailRegex = r'^[a-zA-Z0-9àèìòùÀÈÌÒÙéàç~!#$%^&*()_+=-{}|;,.?<>]+@[a-zA-Z0-9àèìòùÀÈÌÒÙéàç~!#$%^&*()_+=-{}|;,.?<>]+\.[a-zA-Z]{2,}$'; @@ -735,7 +796,7 @@ class LoginRoute extends HookConsumerWidget { } return null; }, - imgPath: MiscIconAssetPath.person, + imgPath: isDarkTheme ? MiscIconAssetPath.personDark : MiscIconAssetPath.personLight, controller: emailCtl, ), 15.verticalSpace, @@ -752,7 +813,12 @@ class LoginRoute extends HookConsumerWidget { 'Password', 'كلمة المرور', ), - imgPath: MiscIconAssetPath.lock, + hintColor: isDarkTheme ? Color(0XFFEEEEEE) : Color(0xFFC3C6CB), + backgroundColor: isDarkTheme ? Color(0xFF000000) : Colors.white, + borderColor: isDarkTheme ? Colors.white : MyTheme.topicColor(IndicatorTopic.economy).shade300, + errorBorderColor: isDarkTheme ? const Color(0xFFFFA100) : const Color(0xFFB22222), + errorTextColor: isDarkTheme ? const Color(0xFFFFA100) : const Color(0xFFB22222), + imgPath: isDarkTheme ? MiscIconAssetPath.lockDark : MiscIconAssetPath.lockLight, controller: pwCtl, isObscurable: true, ), @@ -783,6 +849,7 @@ class LoginRoute extends HookConsumerWidget { ), fontSize: locale?.languageCode == 'ar' ? 38 : 40, fontWeight: FontWeight.w300, + color: isDarkTheme ? Color(0xFFFFFFFF) : Color(0xFF000000), ), ), 10.verticalSpace, @@ -798,7 +865,7 @@ class LoginRoute extends HookConsumerWidget { 'NotoKufi', ), fontSize: context.translate(18.0, 14.0), - color: const Color(0xff898C81), + color: isDarkTheme ? Color(0xFFEEEEEE) : Color(0xff898C81), fontWeight: FontWeight.w600, ), ), @@ -827,7 +894,7 @@ class LoginRoute extends HookConsumerWidget { ), style: TextStyle( fontSize: locale?.languageCode == 'ar' ? 12 : 14, - color: Color(0xff898C81), + color: isDarkTheme ? Color(0xFFCCCCCC) : Color(0xff898C81), ), ), const TextSpan( @@ -840,7 +907,7 @@ class LoginRoute extends HookConsumerWidget { ), style: TextStyle( fontSize: locale?.languageCode == 'ar' ? 12 : 14, - color: Color(0xFF985400), + color: isDarkTheme ? Color(0xFF9EB3E4) : Color(0xFF985400), ), ), ], @@ -903,7 +970,9 @@ class LoginRoute extends HookConsumerWidget { // ), // ); final fcscBanner = Image.asset( - BannerAssetPath.fcsc, + isDarkTheme + ? BannerAssetPath.fcscLogoDark + : BannerAssetPath.fcscLogoLight, height: 40, ); final screenWidth = MediaQuery.of(context).size.width; @@ -965,7 +1034,7 @@ class LoginRoute extends HookConsumerWidget { // _showExitConfirmation(context); // Show exit confirmation dialog }, child: Scaffold( - backgroundColor: Colors.white, + backgroundColor: isDarkTheme ? Color(0xFF111111) : Colors.white, body: SafeArea(child: scaffoldBody), ), ); diff --git a/lib/presentation/routes/auth_routes/register_route.dart b/lib/presentation/routes/auth_routes/register_route.dart index c8b901bb..dcd7d9fa 100644 --- a/lib/presentation/routes/auth_routes/register_route.dart +++ b/lib/presentation/routes/auth_routes/register_route.dart @@ -156,7 +156,7 @@ class RegisterRoute extends HookConsumerWidget { 'Password', 'كلمة المرور', ), - imgPath: MiscIconAssetPath.lock, + imgPath: MiscIconAssetPath.personLight, controller: pwCtl, isObscurable: true, ); @@ -167,7 +167,7 @@ class RegisterRoute extends HookConsumerWidget { 'Confirm Password', 'كلمة المرور', ), - imgPath: MiscIconAssetPath.lock, + imgPath: MiscIconAssetPath.personLight, controller: cpwCtl, isObscurable: true, ); @@ -177,7 +177,7 @@ class RegisterRoute extends HookConsumerWidget { 'اسم المستخدم', ), validator: FieldValidator.email(), - imgPath: MiscIconAssetPath.person, + imgPath: MiscIconAssetPath.personLight, controller: emailCtl, ); final nameField = ThemedFormField( @@ -187,7 +187,7 @@ class RegisterRoute extends HookConsumerWidget { ), validator: (value) => value!.isEmpty ? 'Name must be at least one character' : null, - imgPath: MiscIconAssetPath.person, + imgPath: MiscIconAssetPath.personLight, controller: nameCtl, ); final form = Form( @@ -328,7 +328,7 @@ class RegisterRoute extends HookConsumerWidget { ), ); final fcscBanner = Image.asset( - BannerAssetPath.fcsc, + BannerAssetPath.fcscLogoLight, height: 56, ); final screenWidth = MediaQuery.of(context).size.width; diff --git a/lib/presentation/routes/bottom_bar_routes/tab_routes/home_route.dart b/lib/presentation/routes/bottom_bar_routes/tab_routes/home_route.dart index f9332ee8..7c62d61c 100644 --- a/lib/presentation/routes/bottom_bar_routes/tab_routes/home_route.dart +++ b/lib/presentation/routes/bottom_bar_routes/tab_routes/home_route.dart @@ -170,6 +170,7 @@ import 'package:pocketbase/pocketbase.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:uae_stat/config/api_config.dart'; import 'package:uae_stat/config/connectivity_provider.dart'; +import 'package:uae_stat/config/theme/theme_provider.dart'; import 'package:uae_stat/config/toggle_lang_service.dart'; import 'package:uae_stat/domain/use_cases/language.dart'; import 'package:uae_stat/infrastructure/data/p_auth_repo.dart'; @@ -380,6 +381,8 @@ class EconomyStatsState extends ConsumerState { late List homeTargets; late List previousHomeTargets; late final Locale locale; + late ThemeMode currentTheme; + // ThemeMode? _previousTheme; Future handleSkip() async { tutorialCoachMark.skip(); @@ -1084,7 +1087,20 @@ class EconomyStatsState extends ConsumerState { super.initState(); _userService = UserService(); locale = ref.read(localeProvider) ?? const Locale('en'); - fetchData(locale?.languageCode ?? 'en'); + // Listen to theme changes + // Defer the ref.listen to after build is completed + currentTheme = ref.read(themeProvider); + print('123456789'); + print(currentTheme); + final isDark = currentTheme == ThemeMode.dark || + (currentTheme == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + + final themeMode = (isDark ? 'dark' : 'light'); + + fetchData(locale?.languageCode ?? 'en', themeMode); + + // _fetchUserData(); _loadLoginCount(); } @@ -1143,11 +1159,11 @@ class EconomyStatsState extends ConsumerState { // } // } - Future fetchData(locale) async { + Future fetchData(locale,themeMode) async { // const baseUrl = 'https://pb.venbait.in/api/getHomePageData'; const baseUrl = '$apiUrl/api/getHomePageData'; try { - final response = await http.get(Uri.parse(baseUrl + '?language=$locale')); + final response = await http.get(Uri.parse(baseUrl + '?language=$locale&color_mode=$themeMode')); if (response.statusCode == 200) { setState(() { data = json.decode(response.body); @@ -1200,7 +1216,13 @@ class EconomyStatsState extends ConsumerState { isLoading = true; }); await _userService.updateLanguage(localeCode); - fetchData(localeCode); + final currentTheme = ref.read(themeProvider); + final isDark = currentTheme == ThemeMode.dark || + (currentTheme == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + + final themeString = isDark ? 'dark' : 'light'; + fetchData(localeCode,themeString); }); final isConnected = ref.watch(connectivityProvider); @@ -1212,6 +1234,29 @@ class EconomyStatsState extends ConsumerState { } }); + ref.listen(themeProvider, (previous, next) async { + final localeCode = ref.watch(localeProvider)?.languageCode ?? 'en'; + print(localeCode); + + // Default to 'en' if null + setState(() { + isLoading = true; + print('isLoadingref $isLoading'); + }); + + final currentTheme = ref.read(themeProvider); + final isDark = currentTheme == ThemeMode.dark || + (currentTheme == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + + final themeString = isDark ? 'dark' : 'light'; + fetchData(localeCode,themeString); + }); + + final isDarkTheme = ref.watch(themeProvider) == ThemeMode.dark || + (ref.watch(themeProvider) == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + double myheight = MediaQuery.of(context).size.height; double mywidth = MediaQuery.of(context).size.width; @@ -1239,6 +1284,14 @@ class EconomyStatsState extends ConsumerState { } String firstMainTopic = data.first['main_topic'] ?? ''; return Container( + decoration: isDarkTheme + ? BoxDecoration( + image: DecorationImage( + image: AssetImage('assets/dark_bg.png'), + fit: BoxFit.cover, + ), + ) + : null, height: myheight, // color: Colors.cyan, child: Padding( @@ -1344,6 +1397,7 @@ class EconomyStatsState extends ConsumerState { borderColor, mainTopic['color_pattern'], mainTopic['main_topic']), + ), ), ], @@ -1526,124 +1580,136 @@ class InfoCard extends StatelessWidget { final encodedTitle = Uri.encodeComponent(title); final encodedKey = Uri.encodeQueryComponent('home'); - return GestureDetector( - onTap: () { - context.push( - '/chartScreen/$dataset?bgColor=$colorPattern&mainTopic=$encodedMainTopic&title=$encodedTitle&key=$encodedKey'); - }, - child: Container( - height: myheight / 10.9, + return Consumer( + builder: (context, ref, _) { + final themeMode = ref.watch(themeProvider); + final isDarkTheme = themeMode == ThemeMode.dark || + (themeMode == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); - width: mywidth / 4, + return GestureDetector( + onTap: () { + context.push( + '/chartScreen/$dataset?bgColor=$colorPattern&mainTopic=$encodedMainTopic&title=$encodedTitle&key=$encodedKey'); + }, + child: Container( + height: myheight / 10.9, - margin: const EdgeInsets.symmetric(horizontal: 8), - // padding: const EdgeInsets.all(10), - padding: const EdgeInsets.only(bottom: 0.5, top: 1, left: 10, right: 10), - decoration: BoxDecoration( - border: Border.all(color: bordercolor), - borderRadius: BorderRadius.circular(8), + width: mywidth / 4, + + margin: const EdgeInsets.symmetric(horizontal: 8), + // padding: const EdgeInsets.all(10), + padding: const EdgeInsets.only(bottom: 0.5, top: 1, left: 10, right: 10), + decoration: BoxDecoration( + color: isDarkTheme ? Color(0xFF111111) : null, + border: Border.all(color: bordercolor), + borderRadius: BorderRadius.circular(8), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // Flexible( + // fit: FlexFit.loose, + // child: FittedBox( + // fit: BoxFit.contain, // Adjust text to fit within the bounds + // child: Padding( + // // padding: const EdgeInsets.all(4.0), + // padding: const EdgeInsets.only(top: 4, bottom: 0), + // child: Text( + // title, + // style: const TextStyle( + // // fontSize: 11, + // fontSize: 12 * 1.1, + // fontWeight: FontWeight.w500, + // // color: Colors.black, + // fontFamily: 'Roboto', + // color: Color(0xFF000000), + // ), + // ), + // ), + // ), + // ), + Text( + title, + style: TextStyle( + fontSize: 13, + fontWeight: FontWeight.w400, + letterSpacing: 0, + // color: Colors.black, + fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ), + color: isDarkTheme ? Color(0xFFFFFFFF) : Color(0xFF000000), + ), + ), + const SizedBox(height: 0.3), + Text( + subtitle, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 11, + // fontSize: 12 * 1.1, + fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ), + fontWeight: FontWeight.w400, + color: Color(0xFF8E8E8E), + ), + ), + + // Flexible( + // fit: FlexFit.loose, + // child: FittedBox( + // fit: BoxFit.contain, + // child: Column( + // children: [ + // Text( + // subtitle, + // textAlign: TextAlign.center, + // style: const TextStyle( + // // fontSize: 11, + // fontSize: 12 * 1.1, + // fontFamily: 'Roboto', + // fontWeight: FontWeight.w400, + // color: Color(0xFF8E8E8E), + // ), + // ), + // ], + // ), + // ), + // ), + // SizedBox(height: Platform.isIOS ? 0 : 1), + SizedBox(height: 1), + + // Flexible( + // fit: FlexFit.loose, + // child: FittedBox( + // fit: BoxFit.scaleDown, + // child: + Text( + value, + style: TextStyle( + fontSize: 26, + fontWeight: FontWeight.w900, + fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ), + color: textcolor ?? Colors.black, + ), + ), + // ), + // ), + ], + ), ), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - // Flexible( - // fit: FlexFit.loose, - // child: FittedBox( - // fit: BoxFit.contain, // Adjust text to fit within the bounds - // child: Padding( - // // padding: const EdgeInsets.all(4.0), - // padding: const EdgeInsets.only(top: 4, bottom: 0), - // child: Text( - // title, - // style: const TextStyle( - // // fontSize: 11, - // fontSize: 12 * 1.1, - // fontWeight: FontWeight.w500, - // // color: Colors.black, - // fontFamily: 'Roboto', - // color: Color(0xFF000000), - // ), - // ), - // ), - // ), - // ), - Text( - title, - style: TextStyle( - fontSize: 13, - fontWeight: FontWeight.w400, - letterSpacing: 0, - // color: Colors.black, - fontFamily: context.translate( - 'Roboto', - 'NotoKufi', - ), - color: Color(0xFF000000), - ), - ), - const SizedBox(height: 0.3), - Text( - subtitle, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 11, - // fontSize: 12 * 1.1, - fontFamily: context.translate( - 'Roboto', - 'NotoKufi', - ), - fontWeight: FontWeight.w400, - color: Color(0xFF8E8E8E), - ), - ), - - // Flexible( - // fit: FlexFit.loose, - // child: FittedBox( - // fit: BoxFit.contain, - // child: Column( - // children: [ - // Text( - // subtitle, - // textAlign: TextAlign.center, - // style: const TextStyle( - // // fontSize: 11, - // fontSize: 12 * 1.1, - // fontFamily: 'Roboto', - // fontWeight: FontWeight.w400, - // color: Color(0xFF8E8E8E), - // ), - // ), - // ], - // ), - // ), - // ), - // SizedBox(height: Platform.isIOS ? 0 : 1), - SizedBox(height: 1), - - // Flexible( - // fit: FlexFit.loose, - // child: FittedBox( - // fit: BoxFit.scaleDown, - // child: - Text( - value, - style: TextStyle( - fontSize: 26, - fontWeight: FontWeight.w900, - fontFamily: context.translate( - 'Roboto', - 'NotoKufi', - ), - color: textcolor ?? Colors.black, - ), - ), - // ), - // ), - ], - ), - ), + ); + } ); + + } } diff --git a/lib/presentation/routes/drawer_routes/Drawer Items/edit_profile.dart b/lib/presentation/routes/drawer_routes/Drawer Items/edit_profile.dart index 30583157..7fb71013 100644 --- a/lib/presentation/routes/drawer_routes/Drawer Items/edit_profile.dart +++ b/lib/presentation/routes/drawer_routes/Drawer Items/edit_profile.dart @@ -17,6 +17,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:uae_stat/config/api_config.dart'; import 'package:uae_stat/config/connectivity_provider.dart'; import 'package:uae_stat/config/my_theme.dart'; +import 'package:uae_stat/config/theme/theme_provider.dart'; import 'package:uae_stat/config/toggle_lang_service.dart'; import 'package:uae_stat/domain/use_cases/language.dart'; import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/misc_icon_asset_path.dart'; @@ -534,6 +535,11 @@ class _EditProfileState extends ConsumerState { await _fetchUserData(); }); + final themeMode = ref.read(themeProvider); + final isDarkTheme = themeMode == ThemeMode.dark || + (themeMode == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + return PopScope( canPop: false, // Allow back navigation only if not login screen onPopInvokedWithResult: (didPop, result) { @@ -568,756 +574,761 @@ class _EditProfileState extends ConsumerState { ], ), ) - : SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, top: 3.0), - child: Column( - children: [ - SingleChildScrollView( - child: Form( - key: _formKey, - child: Padding( - // padding: const EdgeInsets.all(20.0), - padding: const EdgeInsets.only( - top: 20.0, bottom: 20.0, left: 25, right: 25), - child: Column( + : Container( + color: isDarkTheme ? Color(0xFF111111) : null, + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, top: 3.0), + child: Column( + children: [ + SingleChildScrollView( + child: Form( + key: _formKey, + child: Padding( + // padding: const EdgeInsets.all(20.0), + padding: const EdgeInsets.only( + top: 20.0, bottom: 20.0, left: 25, right: 25), + child: Column( + children: [ + // CircleAvatar( + // radius: 50, + // backgroundImage: _profileImage != null + // ? FileImage( + // _profileImage!) // If a local file is selected + // : _avatarUrl.isNotEmpty + // ? NetworkImage(_avatarUrl) // Load from URL + // : AssetImage( + // "assets/edit_profile/profile.png") + // as ImageProvider, + // + // //backgroundImage: NetworkImage(_avatarUrl) as ImageProvider, + // + // child: + // Align( + // alignment: Alignment.bottomRight, + // child: GestureDetector( + // onTap: _pickImage, // Call `_pickImage` on tap + // child: CircleAvatar( + // radius: 15, + // backgroundColor: Colors.white, + // child: Icon( + // Icons.camera_alt, + // size: 15, + // color: Colors.grey, + // ), + // ), + // ), + // ), + // ), + + // Stack( + // alignment: Alignment.center, + // children: [ + // // FutureBuilder to load the image + // FutureBuilder( + // future: _loadProfileImage(), + // builder: (context, snapshot) { + // if (snapshot.connectionState == ConnectionState.waiting) { + // // While the image is loading, show a progress indicator + // return CircleAvatar( + // radius: 50, + // child: CircularProgressIndicator(), + // ); + // } else if (snapshot.hasError || snapshot.data == null) { + // // If there's an error or no image, show an error icon + // return CircleAvatar( + // radius: 50, + // child: CircularProgressIndicator(), + // ); + // } else { + // // Display the loaded image + // return CircleAvatar( + // radius: 50, + // backgroundImage: snapshot.data, + // child: Align( + // alignment: Alignment.bottomRight, + // child: GestureDetector( + // onTap: _pickImage, + // child: CircleAvatar( + // radius: 15, + // backgroundColor: Colors.white, + // child: Icon( + // Icons.camera_alt, + // size: 15, + // color: Colors.grey, + // ), + // ), + // ), + // ), + // ); + // } + // }, + // ), + // ], + // ), + + Stack( + alignment: Alignment.center, children: [ - // CircleAvatar( - // radius: 50, - // backgroundImage: _profileImage != null - // ? FileImage( - // _profileImage!) // If a local file is selected - // : _avatarUrl.isNotEmpty - // ? NetworkImage(_avatarUrl) // Load from URL - // : AssetImage( - // "assets/edit_profile/profile.png") - // as ImageProvider, - // - // //backgroundImage: NetworkImage(_avatarUrl) as ImageProvider, - // - // child: - // Align( - // alignment: Alignment.bottomRight, - // child: GestureDetector( - // onTap: _pickImage, // Call `_pickImage` on tap - // child: CircleAvatar( - // radius: 15, - // backgroundColor: Colors.white, - // child: Icon( - // Icons.camera_alt, - // size: 15, - // color: Colors.grey, - // ), - // ), - // ), - // ), - // ), - - // Stack( - // alignment: Alignment.center, - // children: [ - // // FutureBuilder to load the image - // FutureBuilder( - // future: _loadProfileImage(), - // builder: (context, snapshot) { - // if (snapshot.connectionState == ConnectionState.waiting) { - // // While the image is loading, show a progress indicator - // return CircleAvatar( - // radius: 50, - // child: CircularProgressIndicator(), - // ); - // } else if (snapshot.hasError || snapshot.data == null) { - // // If there's an error or no image, show an error icon - // return CircleAvatar( - // radius: 50, - // child: CircularProgressIndicator(), - // ); - // } else { - // // Display the loaded image - // return CircleAvatar( - // radius: 50, - // backgroundImage: snapshot.data, - // child: Align( - // alignment: Alignment.bottomRight, - // child: GestureDetector( - // onTap: _pickImage, - // child: CircleAvatar( - // radius: 15, - // backgroundColor: Colors.white, - // child: Icon( - // Icons.camera_alt, - // size: 15, - // color: Colors.grey, - // ), - // ), - // ), - // ), - // ); - // } - // }, - // ), - // ], - // ), - - Stack( - alignment: Alignment.center, - children: [ - CircleAvatar( - radius: 50, - backgroundImage: _profileImage != null - ? FileImage( - _profileImage!) // If a local file is selected - : _avatarUrl.isNotEmpty - ? NetworkImage( - _avatarUrl) // Load from URL - : AssetImage( - 'assets/edit_profile/profile.jpg') - as ImageProvider, - child: _avatarUrl.isNotEmpty - ? FutureBuilder( - future: _loadImage(_avatarUrl), - builder: (context, snapshot) { - if (snapshot - .connectionState == - ConnectionState.waiting) { - return Center( - child: - CircularProgressIndicator(), - ); - } else if (snapshot - .hasError) { - return Center( - child: Icon(Icons.error), - ); - } else { - return Align( - alignment: - Alignment.bottomRight, - child: GestureDetector( - onTap: - _pickImage, // Call `_pickImage` on tap - child: CircleAvatar( - radius: 15, - backgroundColor: - Colors.white, - child: Icon( - Icons.camera_alt, - size: 15, - color: Colors.grey, - ), - ), - ), - ); - } - }, - ) - : Align( - alignment: - Alignment.bottomRight, - child: GestureDetector( - onTap: - _pickImage, // Call `_pickImage` on tap - child: CircleAvatar( - radius: 15, - backgroundColor: - Colors.white, - child: Icon( - Icons.camera_alt, - size: 15, - color: Colors.grey, - ), - ), + CircleAvatar( + radius: 50, + backgroundImage: _profileImage != null + ? FileImage( + _profileImage!) // If a local file is selected + : _avatarUrl.isNotEmpty + ? NetworkImage( + _avatarUrl) // Load from URL + : AssetImage( + 'assets/edit_profile/profile.jpg') + as ImageProvider, + child: _avatarUrl.isNotEmpty + ? FutureBuilder( + future: _loadImage(_avatarUrl), + builder: (context, snapshot) { + if (snapshot + .connectionState == + ConnectionState.waiting) { + return Center( + child: + CircularProgressIndicator(), + ); + } else if (snapshot + .hasError) { + return Center( + child: Icon(Icons.error), + ); + } else { + return Align( + alignment: + Alignment.bottomRight, + child: GestureDetector( + onTap: + _pickImage, // Call `_pickImage` on tap + child: CircleAvatar( + radius: 15, + backgroundColor: + Colors.white, + child: Icon( + Icons.camera_alt, + size: 15, + color: Colors.grey, ), ), - ), - ], - ), - - SizedBox(height: 20), - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - AppLocalizations.of(context)! - .register_name, - style: TextStyle( - fontFamily: context.translate( - 'Roboto', - 'NotoKufi', - ), - fontSize: 16, - fontWeight: FontWeight.w500, - color: Colors.grey, - ), - ), - ], - ), - SizedBox(height: 10), - TextFormField( - controller: _usernameController, - focusNode: _focusNodes[0], - decoration: InputDecoration( - // hintText: _showHints[0] ? 'Mohammad Hassan' : null, - hintStyle: TextStyle(color: Colors.grey, fontFamily: context.translate( - 'Roboto', - 'NotoKufi', - ),), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - ), - enabled: false, - ), - ), - SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - AppLocalizations.of(context)!.email_id, - style: TextStyle( - fontFamily: context.translate( - 'Roboto', - 'NotoKufi', - ), - fontSize: 16, - fontWeight: FontWeight.w500, - color: Colors.grey, - ), - ), - ], - ), - SizedBox(height: 10), - TextFormField( - controller: _emailController, - focusNode: _focusNodes[1], - decoration: InputDecoration( - // hintText: _showHints[1]? 'mohammad.hassan@fcsc.gov.ae': null, - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - ), - enabled: false, - ), - ), - SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - AppLocalizations.of(context)!.full_name, - style: TextStyle( - fontFamily: context.translate( - 'Roboto', - 'NotoKufi', - ), - fontSize: 16, - fontWeight: FontWeight.w500, - color: Colors.grey, - ), - ), - ], - ), - SizedBox(height: 10), - TextFormField( - enabled: false, - validator: (value) { - if (value == null || value.isEmpty) { - return context.translate( - 'Required', 'مطلوب'); - } - - //RegExp(r"^[a-zA-Z\s]+$"); - final nameRegex = RegExp( - r"^[a-zA-Z0-9'\-\u0627\u0639~\u00C0-\u00FF\s]+$", - ); - if (!nameRegex.hasMatch(value)) { - return AppLocalizations.of(context)! - .invalid_characters; - } - return null; - }, - controller: _fullNameController, - focusNode: _focusNodes[2], - decoration: InputDecoration( - // hintText: _showHints[2] ? 'Mohammad' : null, - hintStyle: TextStyle(color: Colors.grey, - fontFamily: context.translate( - 'Roboto', - 'NotoKufi', - ),), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - ), - // counterText: '', - enabled: !_isProfileCompleted, - ), - // maxLength: - // 40, // Set the maximum length to 20 characters - // maxLengthEnforcement: - // MaxLengthEnforcement.enforced, - ), - SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - AppLocalizations.of(context)!.dob, - style: TextStyle( - fontFamily: context.translate( - 'Roboto', - 'NotoKufi', - ), - fontSize: 16, - fontWeight: FontWeight.w500, - color: Colors.grey, - ), - ), - ], - ), - SizedBox(height: 10), - TextFormField( - controller: _dateController, - focusNode: _focusNodes[3], - decoration: InputDecoration( - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - ), - // hintText: _showHints[3] ? 'Select your Date of Birth' : null, - hintStyle: TextStyle(color: Colors.grey, fontFamily: context.translate( - 'Roboto', - 'NotoKufi', - ),), - suffixIcon: Container( - width: 45, - padding: EdgeInsets.only(right: 1), - alignment: Alignment - .center, // Center the icon vertically - child: Icon( - Icons.keyboard_arrow_down_sharp, - color: Colors.grey, - ), - ), - enabled: !_isProfileCompleted, - ), - readOnly: true, - onTap: _pickDate, - validator: _validateDob, - ), - SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - AppLocalizations.of(context)!.region, - style: TextStyle( - fontFamily: context.translate( - 'Roboto', - 'NotoKufi', - ), - fontSize: 16, - fontWeight: FontWeight.w500, - ), - ), - ], - ), - SizedBox(height: 10), - MouseRegion( - onEnter: (_) => setState( - () => _isHoveringDropdown = true), - onExit: (_) => setState( - () => _isHoveringDropdown = false), - child: DropdownButtonFormField( - style: TextStyle( - fontFamily: context.translate( - 'Roboto', - 'NotoKufi', - ), - fontSize: 16, - fontWeight: FontWeight.normal, - color: Color(0xFF544C4C), - ), - value: _selectedCountry, - decoration: InputDecoration( - enabledBorder: OutlineInputBorder( - borderRadius: - BorderRadius.circular(10), - borderSide: BorderSide( - color: MyTheme.topicColor( - IndicatorTopic.economy) - .shade400, - width: 1), // Enabled border - ), - border: OutlineInputBorder( - borderSide: BorderSide( - color: Color(0xFF7296BE), - ), - borderRadius: - BorderRadius.circular(8), - ), - labelText: 'Select', - ), - icon: Icon( - Icons.keyboard_arrow_down_sharp, - color: _isHoveringDropdown - ? Colors.black - : Colors.grey), - items: _countries - .map( - (item) => DropdownMenuItem( - value: item, - child: Text(item, - style: TextStyle( - fontFamily: context.translate( - 'Roboto', - 'NotoKufi', - ) - ),), ), - ) - .toList(), - onChanged: (String? newValue) { - setState(() { - _selectedCountry = newValue; - }); + ); + } }, - validator: _validateDropdown, + ) + : Align( + alignment: + Alignment.bottomRight, + child: GestureDetector( + onTap: + _pickImage, // Call `_pickImage` on tap + child: CircleAvatar( + radius: 15, + backgroundColor: + Colors.white, + child: Icon( + Icons.camera_alt, + size: 15, + color: Colors.grey, + ), + ), + ), ), ), - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - AppLocalizations.of(context)! - .preferredLang, + ], + ), + + SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + AppLocalizations.of(context)! + .register_name, + style: TextStyle( + fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ), + fontSize: 16, + fontWeight: FontWeight.w500, + color: Colors.grey, + ), + ), + ], + ), + SizedBox(height: 10), + TextFormField( + controller: _usernameController, + focusNode: _focusNodes[0], + decoration: InputDecoration( + // hintText: _showHints[0] ? 'Mohammad Hassan' : null, + hintStyle: TextStyle(color: Colors.grey, fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ),), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + ), + enabled: false, + ), + ), + SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + AppLocalizations.of(context)!.email_id, + style: TextStyle( + fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ), + fontSize: 16, + fontWeight: FontWeight.w500, + color: Colors.grey, + ), + ), + ], + ), + SizedBox(height: 10), + TextFormField( + controller: _emailController, + focusNode: _focusNodes[1], + decoration: InputDecoration( + // hintText: _showHints[1]? 'mohammad.hassan@fcsc.gov.ae': null, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + ), + enabled: false, + ), + ), + SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + AppLocalizations.of(context)!.full_name, + style: TextStyle( + fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ), + fontSize: 16, + fontWeight: FontWeight.w500, + color: Colors.grey, + ), + ), + ], + ), + SizedBox(height: 10), + TextFormField( + enabled: false, + validator: (value) { + if (value == null || value.isEmpty) { + return context.translate( + 'Required', 'مطلوب'); + } + + //RegExp(r"^[a-zA-Z\s]+$"); + final nameRegex = RegExp( + r"^[a-zA-Z0-9'\-\u0627\u0639~\u00C0-\u00FF\s]+$", + ); + if (!nameRegex.hasMatch(value)) { + return AppLocalizations.of(context)! + .invalid_characters; + } + return null; + }, + controller: _fullNameController, + focusNode: _focusNodes[2], + decoration: InputDecoration( + // hintText: _showHints[2] ? 'Mohammad' : null, + hintStyle: TextStyle(color: Colors.grey, + fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ),), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + ), + // counterText: '', + enabled: !_isProfileCompleted, + ), + // maxLength: + // 40, // Set the maximum length to 20 characters + // maxLengthEnforcement: + // MaxLengthEnforcement.enforced, + ), + SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + AppLocalizations.of(context)!.dob, + style: TextStyle( + fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ), + fontSize: 16, + fontWeight: FontWeight.w500, + color: Colors.grey, + ), + ), + ], + ), + SizedBox(height: 10), + TextFormField( + controller: _dateController, + focusNode: _focusNodes[3], + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + ), + // hintText: _showHints[3] ? 'Select your Date of Birth' : null, + hintStyle: TextStyle(color: Colors.grey, fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ),), + suffixIcon: Container( + width: 45, + padding: EdgeInsets.only(right: 1), + alignment: Alignment + .center, // Center the icon vertically + child: Icon( + Icons.keyboard_arrow_down_sharp, + color: Colors.grey, + ), + ), + enabled: !_isProfileCompleted, + ), + readOnly: true, + onTap: _pickDate, + validator: _validateDob, + ), + SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + AppLocalizations.of(context)!.region, + style: TextStyle( + fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ), + fontSize: 16, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + SizedBox(height: 10), + MouseRegion( + onEnter: (_) => setState( + () => _isHoveringDropdown = true), + onExit: (_) => setState( + () => _isHoveringDropdown = false), + child: DropdownButtonFormField( + style: TextStyle( + fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ), + fontSize: 16, + fontWeight: FontWeight.normal, + color: Color(0xFF544C4C), + ), + value: _selectedCountry, + decoration: InputDecoration( + enabledBorder: OutlineInputBorder( + borderRadius: + BorderRadius.circular(10), + borderSide: BorderSide( + color: MyTheme.topicColor( + IndicatorTopic.economy) + .shade400, + width: 1), // Enabled border + ), + border: OutlineInputBorder( + borderSide: BorderSide( + color: Color(0xFF7296BE), + ), + borderRadius: + BorderRadius.circular(8), + ), + labelText: 'Select', + ), + icon: Icon( + Icons.keyboard_arrow_down_sharp, + color: _isHoveringDropdown + ? Colors.black + : Colors.grey), + items: _countries + .map( + (item) => DropdownMenuItem( + value: item, + child: Text(item, style: TextStyle( fontFamily: context.translate( 'Roboto', 'NotoKufi', - ), - fontSize: 16, - fontWeight: FontWeight.w500), - ), - ], - ), - SizedBox(height: 10), - MouseRegion( - onEnter: (_) => setState( - () => _isHoveringPreferredLang = true), - onExit: (_) => setState( - () => _isHoveringPreferredLang = false), - child: DropdownButtonFormField( - style: TextStyle( + ) + ),), + ), + ) + .toList(), + onChanged: (String? newValue) { + setState(() { + _selectedCountry = newValue; + }); + }, + validator: _validateDropdown, + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + AppLocalizations.of(context)! + .preferredLang, + style: TextStyle( fontFamily: context.translate( 'Roboto', 'NotoKufi', ), fontSize: 16, - fontWeight: FontWeight.normal, - color: Color(0xFF544C4C), - ), - value: _selectedLanguage, - decoration: InputDecoration( - enabledBorder: OutlineInputBorder( - borderRadius: - BorderRadius.circular(10), - borderSide: BorderSide( - color: MyTheme.topicColor( - IndicatorTopic.economy) - .shade400, - width: 1), // Enabled border - ), - border: OutlineInputBorder( - borderSide: BorderSide( - color: Color(0xFF7296BE), - ), - borderRadius: - BorderRadius.circular(8), - ), - labelText: 'Select', - ), - icon: Icon( - Icons.keyboard_arrow_down_sharp, - color: _isHoveringPreferredLang - ? Colors.black - : Colors.grey), - items: preferred_language - .map( - (item) => DropdownMenuItem( - value: item, - child: Text(item, - style: TextStyle( - fontFamily: context.translate( - 'Roboto', - 'NotoKufi', - ) - ),), - ), - ) - .toList(), - onChanged: (String? newValue) { - setState(() { - _selectedLanguage = newValue; - changedPreferredLanguage = 1; - }); - }, - validator: _validatePreferredLang, - ), + fontWeight: FontWeight.w500), ), + ], + ), + SizedBox(height: 10), + MouseRegion( + onEnter: (_) => setState( + () => _isHoveringPreferredLang = true), + onExit: (_) => setState( + () => _isHoveringPreferredLang = false), + child: DropdownButtonFormField( + style: TextStyle( + fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ), + fontSize: 16, + fontWeight: FontWeight.normal, + color: Color(0xFF544C4C), + ), + value: _selectedLanguage, + decoration: InputDecoration( + enabledBorder: OutlineInputBorder( + borderRadius: + BorderRadius.circular(10), + borderSide: BorderSide( + color: MyTheme.topicColor( + IndicatorTopic.economy) + .shade400, + width: 1), // Enabled border + ), + border: OutlineInputBorder( + borderSide: BorderSide( + color: Color(0xFF7296BE), + ), + borderRadius: + BorderRadius.circular(8), + ), + labelText: 'Select', + ), + icon: Icon( + Icons.keyboard_arrow_down_sharp, + color: _isHoveringPreferredLang + ? Colors.black + : Colors.grey), + items: preferred_language + .map( + (item) => DropdownMenuItem( + value: item, + child: Text(item, + style: TextStyle( + fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ) + ),), + ), + ) + .toList(), + onChanged: (String? newValue) { + setState(() { + _selectedLanguage = newValue; + changedPreferredLanguage = 1; + }); + }, + validator: _validatePreferredLang, + ), + ), - SizedBox(height: 20), - if (!_isProfileCompleted) // Conditional rendering - Column( - crossAxisAlignment: - CrossAxisAlignment.start, + SizedBox(height: 20), + if (!_isProfileCompleted) // Conditional rendering + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Row( children: [ - Row( - children: [ - Checkbox( - value: isChecked, - onChanged: (value) { - setState(() { - isChecked = value ?? false; - showError = false; - }); - }, - side: BorderSide( - color: showError - ? Color(0xFFb22222) - : MyTheme.topicColor( - IndicatorTopic - .economy) - .shade400, - width: 1.5, - ), - ), - Expanded( - child: Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - SizedBox(height: 10), - Text.rich( - TextSpan( - text: AppLocalizations.of( - context)! - .agree, - style: TextStyle( - fontFamily: context.translate( - 'Roboto', - 'NotoKufi', - ), - color: Colors.black), - children: [ - TextSpan( - text: AppLocalizations - .of( - context, - )! - .terms_conditions, - style: TextStyle( - fontFamily: context.translate( - 'Roboto', - 'NotoKufi', - ), - // color: Colors.blue, - color: Color( - 0xFF648CBA), - decoration: - TextDecoration - .underline, - ), - recognizer: - TapGestureRecognizer() - ..onTap = () => - context.push( - '/termsandconditions'), - ), - TextSpan( - text: AppLocalizations - .of( - context, - )! - .t_and, - style: TextStyle( - fontFamily: context.translate( - 'Roboto', - 'NotoKufi', - ), - color: Colors.black, - ), - ), - TextSpan( - text: AppLocalizations - .of( - context, - )! - .privacy_policy, - style: TextStyle( - fontFamily: context.translate( - 'Roboto', - 'NotoKufi', - ), - // color: Colors.blue, - color: Color( - 0xFF648CBA), - decoration: - TextDecoration - .underline, - ), - recognizer: - TapGestureRecognizer() - ..onTap = () => - context.push( - '/privacy_policy'), - ), - TextSpan( - text: AppLocalizations - .of( - context, - )! - .conditions, - style: TextStyle( - fontFamily: context.translate( - 'Roboto', - 'NotoKufi', - ), - color: Colors.black, - ), - ), - ], - ), - textAlign: TextAlign.start, - maxLines: 2, - overflow: - TextOverflow.visible, - softWrap: true, - ), - ], - ), - ), - ], + Checkbox( + value: isChecked, + onChanged: (value) { + setState(() { + isChecked = value ?? false; + showError = false; + }); + }, + side: BorderSide( + color: showError + ? Color(0xFFb22222) + : MyTheme.topicColor( + IndicatorTopic + .economy) + .shade400, + width: 1.5, + ), ), - if (showError) - Row( + Expanded( + child: Column( mainAxisAlignment: - MainAxisAlignment.start, + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Padding( - padding: const EdgeInsets.only( - left: 10.0), - child: Text( - 'Please agree to terms and conditions', + SizedBox(height: 10), + Text.rich( + TextSpan( + text: AppLocalizations.of( + context)! + .agree, style: TextStyle( - fontFamily: context.translate( - 'Roboto', - 'NotoKufi', + fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ), + color: Colors.black), + children: [ + TextSpan( + text: AppLocalizations + .of( + context, + )! + .terms_conditions, + style: TextStyle( + fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ), + // color: Colors.blue, + color: Color( + 0xFF648CBA), + decoration: + TextDecoration + .underline, + ), + recognizer: + TapGestureRecognizer() + ..onTap = () => + context.push( + '/termsandconditions'), ), - color: Colors.red[700], - fontSize: 12, - ), + TextSpan( + text: AppLocalizations + .of( + context, + )! + .t_and, + style: TextStyle( + fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ), + color: Colors.black, + ), + ), + TextSpan( + text: AppLocalizations + .of( + context, + )! + .privacy_policy, + style: TextStyle( + fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ), + // color: Colors.blue, + color: Color( + 0xFF648CBA), + decoration: + TextDecoration + .underline, + ), + recognizer: + TapGestureRecognizer() + ..onTap = () => + context.push( + '/privacy_policy'), + ), + TextSpan( + text: AppLocalizations + .of( + context, + )! + .conditions, + style: TextStyle( + fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ), + color: Colors.black, + ), + ), + ], ), + textAlign: TextAlign.start, + maxLines: 2, + overflow: + TextOverflow.visible, + softWrap: true, ), ], ), + ), ], ), - Center( - child: GestureDetector( - onTap: () { - final email = _emailController.text; - context.push( - '/createNewPw/$userId/$email?key=editProfile'); - }, - child: Text( - AppLocalizations.of(context)! - .change_password, - style: TextStyle( - // color: Color(0xFF648CBA), - color: Color(0xFF985400), - fontSize: 14, - fontWeight: FontWeight.w700, - fontFamily: context.translate( - 'Roboto', - 'NotoKufi', + if (showError) + Row( + mainAxisAlignment: + MainAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only( + left: 10.0), + child: Text( + 'Please agree to terms and conditions', + style: TextStyle( + fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ), + color: Colors.red[700], + fontSize: 12, + ), + ), ), - // decoration: TextDecoration.underline - ), + ], ), + ], + ), + Center( + child: GestureDetector( + onTap: () { + final email = _emailController.text; + context.push( + '/createNewPw/$userId/$email?key=editProfile'); + }, + child: Text( + AppLocalizations.of(context)! + .change_password, + style: TextStyle( + // color: Color(0xFF648CBA), + color: Color(0xFF985400), + fontSize: 14, + fontWeight: FontWeight.w700, + fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ), + // decoration: TextDecoration.underline ), ), - SizedBox(height: 20), - // ElevatedButton.icon( - // onPressed: () { - // showConfirmationDialog(context); - // }, - // icon: Icon( - // Icons.save, - // color: Colors.white, - // ), - // label: Text( - // AppLocalizations.of(context)!.save, - // style: TextStyle(color: Colors.white), - // ), - // style: ElevatedButton.styleFrom( - // backgroundColor: Color(0xFF92722A), - // minimumSize: Size(double.infinity, 50), - // shape: RoundedRectangleBorder( - // borderRadius: BorderRadius.circular(8), - // ), - // ), - // ), - ElevatedButton( - onPressed: () { - // if ((_formKey.currentState?.validate() ?? false) && (isChecked)) { - // _formKey.currentState?.save(); - showConfirmationDialog(context); - // } else { - // setState(() { - // showError = !isChecked; // Show error if the checkbox is not checked - // }); - // } - }, - style: ElevatedButton.styleFrom( - backgroundColor: Color(0xFF92722A), - minimumSize: Size(double.infinity, 50), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment - .center, // Center the content - children: [ - Text( - AppLocalizations.of(context)!.save, - style: TextStyle(color: Colors.white, fontFamily: context.translate( - 'Roboto', - 'NotoKufi', - ),), - ), - SizedBox( - width: - 8), // Add space between text and icon - Image.asset( - MiscIconAssetPath.save, - color: Colors.white, - width: 20, - height: 20, - ), - ], - ), - ) - ], + ), ), - ), + SizedBox(height: 20), + // ElevatedButton.icon( + // onPressed: () { + // showConfirmationDialog(context); + // }, + // icon: Icon( + // Icons.save, + // color: Colors.white, + // ), + // label: Text( + // AppLocalizations.of(context)!.save, + // style: TextStyle(color: Colors.white), + // ), + // style: ElevatedButton.styleFrom( + // backgroundColor: Color(0xFF92722A), + // minimumSize: Size(double.infinity, 50), + // shape: RoundedRectangleBorder( + // borderRadius: BorderRadius.circular(8), + // ), + // ), + // ), + ElevatedButton( + onPressed: () { + // if ((_formKey.currentState?.validate() ?? false) && (isChecked)) { + // _formKey.currentState?.save(); + showConfirmationDialog(context); + // } else { + // setState(() { + // showError = !isChecked; // Show error if the checkbox is not checked + // }); + // } + }, + style: ElevatedButton.styleFrom( + backgroundColor: Color(0xFF92722A), + minimumSize: Size(double.infinity, 50), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment + .center, // Center the content + children: [ + Text( + AppLocalizations.of(context)!.save, + style: TextStyle(color: Colors.white, fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ),), + ), + SizedBox( + width: + 8), // Add space between text and icon + Image.asset( + MiscIconAssetPath.save, + color: Colors.white, + width: 20, + height: 20, + ), + ], + ), + ) + ], ), ), - ], + ), ), - ), + ], ), + ), + ), + ) + + //bottomNavigationBar: MyBottomNavBar(), )); } diff --git a/lib/presentation/routes/drawer_routes/custom_drawer_routes.dart b/lib/presentation/routes/drawer_routes/custom_drawer_routes.dart index d58abdda..d3837612 100644 --- a/lib/presentation/routes/drawer_routes/custom_drawer_routes.dart +++ b/lib/presentation/routes/drawer_routes/custom_drawer_routes.dart @@ -14,6 +14,10 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:tutorial_coach_mark/tutorial_coach_mark.dart'; import 'package:uae_stat/config/injector.dart'; +import 'package:uae_stat/config/theme/app_theme.dart'; +import 'package:uae_stat/config/theme/service.dart'; +import 'package:uae_stat/config/theme/themeDialog.dart'; +import 'package:uae_stat/config/theme/theme_provider.dart'; import 'package:uae_stat/domain/repos/t_auth_repo.dart'; import 'package:uae_stat/domain/use_cases/language.dart'; import 'package:uae_stat/infrastructure/data/p_auth_repo.dart'; @@ -44,6 +48,7 @@ class BaseScaffold extends ConsumerStatefulWidget { this.appbarColor, this.mytitleColor, this.bottomColor = null, + this.backgroundColor, }); final Widget body; final Widget title; @@ -56,6 +61,7 @@ class BaseScaffold extends ConsumerStatefulWidget { final List? actions; final Color? bottomColor; final Color? appbarColor, mytitleColor; + final Color? backgroundColor; @override _BaseScaffoldState createState() => _BaseScaffoldState(); @@ -830,6 +836,111 @@ class _BaseScaffoldState extends ConsumerState { context.go('/login'); // Redirect to login after logout } + + // void _showThemeDialog(BuildContext context) async { + // AppTheme? result = await showDialog( + // context: context, + // builder: (context) => ThemeSelectorDialog(initialTheme: AppTheme.system), + // ); + // + // if (result != null) { + // // You can now use `result` to apply the selected theme + // print('Selected theme: $result'); + // final prefs = await SharedPreferences.getInstance(); + // final userId = prefs.getString('userId') ?? ''; + // // Example: save to PocketBase or local preferences + // final themeService = ThemeBaseService(); + // await themeService.updateUserTheme(userId, result.name); + // } + // } + + // void showThemeDialog(BuildContext context, WidgetRef ref) async { + // final currentTheme = ref.read(themeProvider); + // final current = currentTheme == ThemeMode.light + // ? AppTheme.light + // : currentTheme == ThemeMode.dark + // ? AppTheme.dark + // : AppTheme.system; + // + // final selected = await showDialog( + // context: context, + // builder: (context) => ThemeSelectorDialog(initialTheme: current), + // ); + // + // if (selected != null) { + // ref.read(themeProvider.notifier).updateTheme(selected); + // final themeService = ThemeBaseService(); + // await themeService.updateUserTheme(userId, selected.name); + // } + // } + + // void showThemeDialog(BuildContext context, WidgetRef ref) async { + // final currentTheme = ref.read(themeProvider); + // final current = currentTheme == ThemeMode.light + // ? AppTheme.light + // : currentTheme == ThemeMode.dark + // ? AppTheme.dark + // : AppTheme.system; + // + // final selected = await showDialog( + // context: context, + // builder: (context) => ThemeSelectorDialog(initialTheme: current), + // ); + // + // if (selected != null) { + // // Update app theme locally + // ref.read(themeProvider.notifier).updateTheme(selected); + // + // // Detect real system brightness if 'system' is selected + // String themeToSend; + // if (selected == AppTheme.system) { + // final brightness = MediaQuery.of(context).platformBrightness; + // themeToSend = brightness == Brightness.dark ? 'dark' : 'light'; + // } else { + // themeToSend = selected.name; + // } + // + // // Save to PocketBase + // await ThemeBaseService().updateUserTheme(userId, themeToSend); + // } + // } + + void _openThemeDialog(BuildContext context, WidgetRef ref, String userId) async { + final currentThemeMode = ref.read(themeProvider); // ThemeMode + final platformBrightness = MediaQuery.of(context).platformBrightness; + + // Convert ThemeMode to AppTheme + AppTheme initialAppTheme; + if (currentThemeMode == ThemeMode.light) { + initialAppTheme = AppTheme.light; + } else if (currentThemeMode == ThemeMode.dark) { + initialAppTheme = AppTheme.dark; + } else { + initialAppTheme = AppTheme.system; + } + + final selectedTheme = await showDialog( + context: context, + builder: (_) => ThemeSelectorDialog(initialTheme: initialAppTheme), + ); + + if (selectedTheme != null) { + // Update UI immediately + ref.read(themeProvider.notifier).updateTheme(selectedTheme, platformBrightness); + + // Send only 'light' or 'dark' to PocketBase + final themeToSend = selectedTheme == AppTheme.system + ? (platformBrightness == Brightness.dark ? 'dark' : 'light') + : selectedTheme.name; + + await ThemeBaseService().updateUserTheme(userId, themeToSend); + } + } + + + + + @override Widget build(BuildContext context) { final locale = ref.watch(localeProvider); @@ -837,9 +948,15 @@ class _BaseScaffoldState extends ConsumerState { String currentRoute = GoRouterState.of(context).matchedLocation; double myheight = MediaQuery.of(context).size.height; double mywidth = MediaQuery.of(context).size.width; + final themeMode = ref.read(themeProvider); + final isDarkTheme = themeMode == ThemeMode.dark || + (themeMode == ThemeMode.system && + MediaQuery.of(context).platformBrightness == Brightness.dark); + + final String currentRoute1 = ModalRoute.of(context)?.settings.name ?? ''; return Scaffold( - backgroundColor: Colors.white, + backgroundColor: Colors.white, appBar: AppBar( title: Padding( padding: EdgeInsets.only(top: 10), @@ -849,7 +966,7 @@ class _BaseScaffoldState extends ConsumerState { : Alignment.centerLeft, child: DefaultTextStyle( style: TextStyle( - color: widget.colorChange ? Colors.white : Color(0xFF414042), + color: widget.colorChange ? Colors.white : Color(0xFFFFFFFF), fontSize: 22, fontFamily: context.translate( 'Roboto', @@ -863,6 +980,22 @@ class _BaseScaffoldState extends ConsumerState { ), scrolledUnderElevation: 0, titleSpacing: 0, + flexibleSpace: (isDarkTheme && currentRoute == '/myhomepage') + ? Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage('assets/dark_bg.png'), + fit: BoxFit.cover, + ), + ), + ) + : (isDarkTheme && currentRoute == '/uaenumbers') + ? Container( + decoration: const BoxDecoration( + color: Color(0xFF333333), + ), + ) + : null, backgroundColor: widget.appbarColor ?? Colors.white, leadingWidth: widget.showBackButton ? mywidth * 0.18 : null, bottom: widget.showDivider @@ -940,7 +1073,7 @@ class _BaseScaffoldState extends ConsumerState { padding: EdgeInsets.zero, constraints: BoxConstraints(), key: drawerKey, - color: widget.colorChange ? Colors.white : Colors.black, + color: isDarkTheme ? Colors.white : Colors.black, icon: const Icon(Icons.menu, size: 30), onPressed: () { Scaffold.of(context).openDrawer(); @@ -954,7 +1087,7 @@ class _BaseScaffoldState extends ConsumerState { ), ), drawer: Drawer( - backgroundColor: Colors.white, + backgroundColor: isDarkTheme ? Color(0xFF111111) : Colors.white, child: Column(children: [ Expanded( child: ListView( @@ -1034,9 +1167,15 @@ class _BaseScaffoldState extends ConsumerState { crossAxisAlignment: CrossAxisAlignment.start, children: [ if (userId == "guest") ...[ - Text(userName ?? 'Guest User'), + Text(userName ?? 'Guest User', + style: TextStyle( + color: isDarkTheme ? Color(0xFFAAAAAA) : null, + ),), ] else ...[ - Text(userName ?? 'Loading...'), + Text(userName ?? 'Loading...', + style: TextStyle( + color: isDarkTheme ? Color(0xFFAAAAAA) : null, + ),), Tooltip( message: userEmail ?? 'Loading...', // Shows full email on hover @@ -1048,7 +1187,7 @@ class _BaseScaffoldState extends ConsumerState { child: Text( userEmail ?? 'Loading...', style: TextStyle(fontSize: 12, - +color: isDarkTheme ? Color(0xFFAAAAAA) : null, fontFamily: context.translate( 'Roboto', 'NotoKufi', @@ -1071,9 +1210,10 @@ class _BaseScaffoldState extends ConsumerState { ), if (userId != 'guest') ListTile( - leading: Icon(Icons.notifications_none), + leading: Icon(Icons.notifications_none,color: isDarkTheme ? Color(0xFFFFFFFF) : null), title: Text(AppLocalizations.of(context)!.notification, style: TextStyle( + color: isDarkTheme ? Color(0xFFAAAAAA) : null, fontFamily: context.translate( 'Roboto', 'NotoKufi', @@ -1083,7 +1223,7 @@ class _BaseScaffoldState extends ConsumerState { onTap: () => _navigateTo(context, '/notification'), ), ListTile( - leading: Icon(Icons.message_outlined), + leading: Icon(Icons.message_outlined,color: isDarkTheme ? Color(0xFFFFFFFF) : null), // leading: Image.asset( // DrawerAssetIconPath.feedback, // color: Colors.black, @@ -1093,6 +1233,7 @@ class _BaseScaffoldState extends ConsumerState { // title: const Text('Feedback'), title: Text(AppLocalizations.of(context)!.feedback_title, style: TextStyle( + color: isDarkTheme ? Color(0xFFAAAAAA) : null, fontFamily: context.translate( 'Roboto', 'NotoKufi', @@ -1102,7 +1243,7 @@ class _BaseScaffoldState extends ConsumerState { ), if (role == 'admin') ListTile( - leading: Icon(Icons.manage_accounts_outlined), + leading: Icon(Icons.manage_accounts_outlined,color: isDarkTheme ? Color(0xFFFFFFFF) : null), // leading: Image.asset( // DrawerAssetIconPath.manageUser, // color: Colors.black, @@ -1113,6 +1254,7 @@ class _BaseScaffoldState extends ConsumerState { title: Text( AppLocalizations.of(context)!.manage_user, style: TextStyle( + color: isDarkTheme ? Color(0xFFAAAAAA) : null, fontFamily: context.translate( 'Roboto', 'NotoKufi', @@ -1121,11 +1263,12 @@ class _BaseScaffoldState extends ConsumerState { onTap: () => _navigateTo(context, '/manageuser'), ), ListTile( - leading: Icon(Icons.bookmarks_outlined), + leading: Icon(Icons.bookmarks_outlined,color: isDarkTheme ? Color(0xFFFFFFFF) : null), // title: const Text('Bookmark'), title: Text( AppLocalizations.of(context)!.bookmark_title, style: TextStyle( + color: isDarkTheme ? Color(0xFFAAAAAA) : null, fontFamily: context.translate( 'Roboto', 'NotoKufi', @@ -1134,7 +1277,7 @@ class _BaseScaffoldState extends ConsumerState { onTap: () => _navigateTo(context, '/bookmark'), ), ListTile( - leading: Icon(Icons.menu_book_outlined), + leading: Icon(Icons.menu_book_outlined,color: isDarkTheme ? Color(0xFFFFFFFF) : null), // leading: Image.asset( // DrawerAssetIconPath.guide, // color: Colors.black, @@ -1144,6 +1287,7 @@ class _BaseScaffoldState extends ConsumerState { // title: const Text('User Guide'), title: Text(AppLocalizations.of(context)!.guide_title, style: TextStyle( + color: isDarkTheme ? Color(0xFFAAAAAA) : null, fontFamily: context.translate( 'Roboto', 'NotoKufi', @@ -1152,9 +1296,10 @@ class _BaseScaffoldState extends ConsumerState { onTap: () => _navigateTo(context, '/user-guide'), ), ListTile( - leading: Icon(Icons.mail_outlined), + leading: Icon(Icons.mail_outlined,color: isDarkTheme ? Color(0xFFFFFFFF) : null), title: Text(context.translate('Contact Us', 'اتصل بنا'), style: TextStyle( + color: isDarkTheme ? Color(0xFFAAAAAA) : null, fontFamily: context.translate( 'Roboto', 'NotoKufi', @@ -1163,10 +1308,11 @@ class _BaseScaffoldState extends ConsumerState { ), if (userId != 'guest') ListTile( - leading: Icon(Icons.logout), + leading: Icon(Icons.logout,color: isDarkTheme ? Color(0xFFFFFFFF) : null), // title: const Text('Logout'), title: Text(AppLocalizations.of(context)!.logout, style: TextStyle( + color: isDarkTheme ? Color(0xFFAAAAAA) : null, fontFamily: context.translate( 'Roboto', 'NotoKufi', @@ -1176,10 +1322,11 @@ class _BaseScaffoldState extends ConsumerState { ), if (userId == 'guest') ListTile( - leading: Icon(Icons.login), + leading: Icon(Icons.login,color: isDarkTheme ? Color(0xFFFFFFFF) : null), // title: const Text('Login'), title: Text(AppLocalizations.of(context)!.login_title, style: TextStyle( + color: isDarkTheme ? Color(0xFFAAAAAA) : null, fontFamily: context.translate( 'Roboto', 'NotoKufi', @@ -1189,10 +1336,11 @@ class _BaseScaffoldState extends ConsumerState { ), if (userId == 'guest') ListTile( - leading: Icon(Icons.app_registration), + leading: Icon(Icons.app_registration,color: isDarkTheme ? Color(0xFFFFFFFF) : null), // title: const Text('Register'), title: Text(AppLocalizations.of(context)!.register_title, style: TextStyle( + color: isDarkTheme ? Color(0xFFAAAAAA) : null, fontFamily: context.translate( 'Roboto', 'NotoKufi', @@ -1200,6 +1348,17 @@ class _BaseScaffoldState extends ConsumerState { ), onTap: () => context.go('/register'), ), + ListTile( + leading: Icon(Icons.lightbulb_circle_outlined,color: isDarkTheme ? Color(0xFFFFFFFF) : null), + title: Text(context.translate('Theme','سمة'), + style: TextStyle( + color: isDarkTheme ? Color(0xFFAAAAAA) : null, + fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ), ),), + onTap: () => _openThemeDialog(context, ref, userId), + ), ], ), ), @@ -1211,7 +1370,7 @@ class _BaseScaffoldState extends ConsumerState { if (snapshot.connectionState == ConnectionState.waiting) { return Text( 'Loading version...', - style: TextStyle(fontSize: 12, color: Colors.grey,fontFamily: context.translate( + style: TextStyle(fontSize: 12, color: isDarkTheme ? Color(0xFFAAAAAA) : Colors.grey,fontFamily: context.translate( 'Roboto', 'NotoKufi', ),), @@ -1229,7 +1388,7 @@ class _BaseScaffoldState extends ConsumerState { } else { return Text( 'Version ${snapshot.data}', - style: TextStyle(fontSize: 12, color: Colors.grey,fontFamily: context.translate( + style: TextStyle(fontSize: 12, color: isDarkTheme ? Color(0xFFAAAAAA) : Colors.grey,fontFamily: context.translate( 'Roboto', 'NotoKufi', ),), @@ -1240,97 +1399,210 @@ class _BaseScaffoldState extends ConsumerState { ), ), ])), - bottomNavigationBar: BottomNavigationBar( - backgroundColor: Colors.white, - currentIndex: _getSelectedIndex(currentRoute), - onTap: (index) => _onItemTapped(context, index), - type: BottomNavigationBarType.fixed, - items: [ - BottomNavigationBarItem( - icon: Padding( - padding: - const EdgeInsets.only(bottom: 4), // Adjust this for spacing - child: Image.asset( - BottomBarAssetIconPath.home, - color: _getSelectedIndex(currentRoute) == 0 - ? Colors.black - : Color(0xFF989898), - width: 23.98, - height: 25, + bottomNavigationBar: Stack( + children: [ + if (isDarkTheme) + Positioned( + bottom: 0, + left: 0, + right: 0, + child: Container( + height: kBottomNavigationBarHeight + 0, // Adjust as needed + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage('assets/dark_bg.png'), // your dark mode image + fit: BoxFit.cover, + ), + ), ), ), - // label: 'Home', - label: AppLocalizations.of(context)!.nav_home, - ), - BottomNavigationBarItem( - // icon: Icon(Icons.map), - icon: Padding( - padding: - const EdgeInsets.only(bottom: 4), // Adjust this for spacing - child: Image.asset( - BottomBarAssetIconPath.uaeMap, - color: _getSelectedIndex(currentRoute) == 1 - ? Colors.black - : Color(0xFF989898), - width: 23.98, - height: 25, + BottomNavigationBar( + backgroundColor: isDarkTheme ? Color(0xFF000000) : Colors.white, + currentIndex: _getSelectedIndex(currentRoute), + onTap: (index) => _onItemTapped(context, index), + type: BottomNavigationBarType.fixed, + items: [ + BottomNavigationBarItem( + icon: Padding( + padding: + const EdgeInsets.only(bottom: 4), // Adjust this for spacing + child: Image.asset( + BottomBarAssetIconPath.home, + color: _getSelectedIndex(currentRoute) == 0 + ? (isDarkTheme ? Color(0xFF24B4FB) : Colors.black) + : Color(0xFF989898), + width: 23.98, + height: 25, + ), + ), + // label: 'Home', + label: AppLocalizations.of(context)!.nav_home, + ), + BottomNavigationBarItem( + // icon: Icon(Icons.map), + icon: Padding( + padding: + const EdgeInsets.only(bottom: 4), // Adjust this for spacing + child: Image.asset( + BottomBarAssetIconPath.uaeMap, + color: _getSelectedIndex(currentRoute) == 1 + ? (isDarkTheme ? Color(0xFF24B4FB) : Colors.black) + : Color(0xFF989898), + width: 23.98, + height: 25, + ), + ), + // label: 'UAE Numbers' + label: AppLocalizations.of(context)!.nav_uae, + ), + BottomNavigationBarItem( + icon: Padding( + padding: + const EdgeInsets.only(bottom: 4), // Adjust this for spacing + child: Image.asset( + BottomBarAssetIconPath.ranking, + color: _getSelectedIndex(currentRoute) == 2 + ? (isDarkTheme ? Color(0xFF24B4FB) : Colors.black) + : Color(0xFF989898), + width: 23.98, + height: 25, + ), + ), + // label: 'Competitiveness', + label: AppLocalizations.of(context)!.nav_competitiveness, + ), + BottomNavigationBarItem( + icon: Padding( + padding: + const EdgeInsets.only(bottom: 4), // Adjust this for spacing + child: Image.asset( + BottomBarAssetIconPath.globe, + color: _getSelectedIndex(currentRoute) == 3 + ? (isDarkTheme ? Color(0xFF24B4FB) : Colors.black) + : Color(0xFF989898), + width: 23.98, + height: 25, + ), + ), + // label: 'Country Profile', + label: AppLocalizations.of(context)!.country_profile, + ), + ], + key: bottomNavKey, + selectedItemColor: isDarkTheme ? Color(0xFF24B4FB) : Colors.black, + unselectedItemColor: Colors.grey, + selectedLabelStyle: TextStyle( + fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ), + fontSize: 10, // Font size for unselected label ), - ), - // label: 'UAE Numbers' - label: AppLocalizations.of(context)!.nav_uae, - ), - BottomNavigationBarItem( - icon: Padding( - padding: - const EdgeInsets.only(bottom: 4), // Adjust this for spacing - child: Image.asset( - BottomBarAssetIconPath.ranking, - color: _getSelectedIndex(currentRoute) == 2 - ? Colors.black - : Color(0xFF989898), - width: 23.98, - height: 25, + unselectedLabelStyle: TextStyle( + fontFamily: context.translate( + 'Roboto', + 'NotoKufi', + ), + fontSize: 10, // Font size for unselected label ), + showUnselectedLabels: true, ), - // label: 'Competitiveness', - label: AppLocalizations.of(context)!.nav_competitiveness, - ), - BottomNavigationBarItem( - icon: Padding( - padding: - const EdgeInsets.only(bottom: 4), // Adjust this for spacing - child: Image.asset( - BottomBarAssetIconPath.globe, - color: _getSelectedIndex(currentRoute) == 3 - ? Colors.black - : Color(0xFF989898), - width: 23.98, - height: 25, - ), - ), - // label: 'Country Profile', - label: AppLocalizations.of(context)!.country_profile, - ), + ], - key: bottomNavKey, - selectedItemColor: Colors.black, - unselectedItemColor: Colors.grey, - selectedLabelStyle: TextStyle( - fontFamily: context.translate( - 'Roboto', - 'NotoKufi', - ), - fontSize: 10, // Font size for unselected label - ), - unselectedLabelStyle: TextStyle( - fontFamily: context.translate( - 'Roboto', - 'NotoKufi', - ), - fontSize: 10, // Font size for unselected label - ), - showUnselectedLabels: true, ), + + // BottomNavigationBar( + // backgroundColor: isDarkTheme ? Color(0xFF00000080) : Colors.white, + // currentIndex: _getSelectedIndex(currentRoute), + // onTap: (index) => _onItemTapped(context, index), + // type: BottomNavigationBarType.fixed, + // items: [ + // BottomNavigationBarItem( + // icon: Padding( + // padding: + // const EdgeInsets.only(bottom: 4), // Adjust this for spacing + // child: Image.asset( + // BottomBarAssetIconPath.home, + // color: _getSelectedIndex(currentRoute) == 0 + // ? Colors.black + // : Color(0xFF989898), + // width: 23.98, + // height: 25, + // ), + // ), + // // label: 'Home', + // label: AppLocalizations.of(context)!.nav_home, + // ), + // BottomNavigationBarItem( + // // icon: Icon(Icons.map), + // icon: Padding( + // padding: + // const EdgeInsets.only(bottom: 4), // Adjust this for spacing + // child: Image.asset( + // BottomBarAssetIconPath.uaeMap, + // color: _getSelectedIndex(currentRoute) == 1 + // ? Colors.black + // : Color(0xFF989898), + // width: 23.98, + // height: 25, + // ), + // ), + // // label: 'UAE Numbers' + // label: AppLocalizations.of(context)!.nav_uae, + // ), + // BottomNavigationBarItem( + // icon: Padding( + // padding: + // const EdgeInsets.only(bottom: 4), // Adjust this for spacing + // child: Image.asset( + // BottomBarAssetIconPath.ranking, + // color: _getSelectedIndex(currentRoute) == 2 + // ? Colors.black + // : Color(0xFF989898), + // width: 23.98, + // height: 25, + // ), + // ), + // // label: 'Competitiveness', + // label: AppLocalizations.of(context)!.nav_competitiveness, + // ), + // BottomNavigationBarItem( + // icon: Padding( + // padding: + // const EdgeInsets.only(bottom: 4), // Adjust this for spacing + // child: Image.asset( + // BottomBarAssetIconPath.globe, + // color: _getSelectedIndex(currentRoute) == 3 + // ? Colors.black + // : Color(0xFF989898), + // width: 23.98, + // height: 25, + // ), + // ), + // // label: 'Country Profile', + // label: AppLocalizations.of(context)!.country_profile, + // ), + // ], + // key: bottomNavKey, + // selectedItemColor: Colors.black, + // unselectedItemColor: Colors.grey, + // selectedLabelStyle: TextStyle( + // fontFamily: context.translate( + // 'Roboto', + // 'NotoKufi', + // ), + // fontSize: 10, // Font size for unselected label + // ), + // unselectedLabelStyle: TextStyle( + // fontFamily: context.translate( + // 'Roboto', + // 'NotoKufi', + // ), + // fontSize: 10, // Font size for unselected label + // ), + // showUnselectedLabels: true, + // ), + body: widget.body, ); } diff --git a/pubspec.yaml b/pubspec.yaml index b75e24f3..0e72b58c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,8 +1,8 @@ name: uae_stat description: "View statistics about the UAE from the Federal Center for Statistics and Competitiveness." publish_to: "none" -#version: 1.0.59+60 -version: 1.0.5+6 +#version: 1.0.60+61 +version: 1.0.6+7 environment: sdk: ">=3.2.3 <4.0.0" @@ -104,6 +104,7 @@ flutter: generate: true uses-material-design: true assets: + - assets/dark_bg.png - assets/user_guide_videos/ - assets/logos/ - assets/logos/from_alsaray/