Dark / light Mode added

This commit is contained in:
Surendiran 2025-06-24 11:06:42 +05:30
parent 60d9a4f161
commit a109e65c11
50 changed files with 2110 additions and 1254 deletions

View File

@ -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  <EFBFBD>ùÓÁ÷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
_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  ƒùÓÁ÷2 ¤ òÑÞ€á2

View File

@ -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  <EFBFBD>ùÓÁ÷2  ¸ïòÀ÷2|
z
x/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/android_gradle_build.json  àÞ„„ñ2 ÑÜðƒñ2<EFBFBD>
x/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/Debug/4y161to1/armeabi-v7a/android_gradle_build.json  <EFBFBD>ùÓÁ÷2 ºïòÀ÷2<EFBFBD>

}/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  <EFBFBD>ùÓÁ÷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  <EFBFBD>ùÓÁ÷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  <EFBFBD>ùÓÁ÷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  <EFBFBD>ùÓÁ÷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  <EFBFBD>ùÓÁ÷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  <EFBFBD>ùÓÁ÷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  <EFBFBD>ùÓÁ÷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  <EFBFBD>ùÓÁ÷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  <EFBFBD>ùÓÁ÷2  m »ïòÀ÷2c
a
_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  àÞ„„ñ2 ¤ òÑÞ€á2
_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  <EFBFBD>ùÓÁ÷2 ¤ òÑÞ€á2

View File

@ -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
_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  ˜ùÓÁ÷2 ¤ òÑÞ€á2

View File

@ -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ØÌ <20>ôòÀ÷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
_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  žùÓÁ÷2 ¤ òÑÞ€á2

View File

@ -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„
<EFBFBD>
/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
<EFBFBD>
/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<C3B4>
x/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/arm64-v8a/prefab_config.json  µ§Ä‚ú2  ( ¥ªÇŸô2<C3B4>

}/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
_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  µ§Ä‚ú2 ¤ òÑÞ€á2

View File

@ -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  <EFBFBD>Äæšö2  £¼ÇŸô2‡
?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  Õ§Ä‚ú2  £¼ÇŸô2‡

<EFBFBD>/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/android_gradle_build.json  <EFBFBD>Äæšö2 ¤¼ÇŸô2Œ
<EFBFBD>/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  <EFBFBD>Äæšö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  <EFBFBD>Äæšö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  <EFBFBD>Äæšö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  <EFBFBD>Äæšö2 _ ¦¼ÇŸô2<C3B4>
|/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/build_file_index.txt  Õ§Ä‚ú2 _ ¦¼ÇŸô2<C3B4>

}/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/compile_commands.json  <EFBFBD>Äæšö2
}/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/compile_commands.json  Õ§Ä‚ú2

<EFBFBD>/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/compile_commands.json.bin  <EFBFBD>Äæšö2 <09>
<EFBFBD>/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/compile_commands.json.bin  Õ§Ä‚ú2 <09>
Š
/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/metadata_generation_command.txt  <EFBFBD>Äæšö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  <EFBFBD>Äæšö2  ( ¦¼ÇŸô2„
z/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/prefab_config.json  Õ§Ä‚ú2  ( ¦¼ÇŸô2„
<EFBFBD>
/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/armeabi-v7a/symbol_folder_index.txt  <EFBFBD>Äæšö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  <EFBFBD>Äæšö2 ¤ òÑÞ€á2
_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  Õ§Ä‚ú2 ¤ òÑÞ€á2

View File

@ -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
<EFBFBD>
/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
_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  Þ§Ä‚ú2 ¤ òÑÞ€á2

View File

@ -2,27 +2,27 @@ C/C++ Structured Log
<EFBFBD>
/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‡

<EFBFBD>/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/android_gradle_build_mini.json  ŽÄæšö2<18> ¹ÆÇŸô2r
<EFBFBD>/Users/venbateam/Documents/UAE_Stats/FCSC/frontend/android/app/.cxx/RelWithDebInfo/574gs2w4/x86_64/android_gradle_build_mini.json  Œ¨Ä‚ú2<18> ¹ÆÇŸô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
_/Users/venbateam/Documents/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  Œ¨Ä‚ú2 ¤ òÑÞ€á2

View File

@ -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")

View File

@ -36,7 +36,7 @@
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" android:host="fcscapp.onelink.me" />
<data android:scheme="https" android:host="fcscapp.onelink.me" android:pathPrefix="/forgot-password"/>
</intent-filter>
<!-- <intent-filter>-->
<!-- <action android:name="android.intent.action.VIEW" />-->

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

BIN
assets/dark_bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 497 B

View File

Before

Width:  |  Height:  |  Size: 761 B

After

Width:  |  Height:  |  Size: 761 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 727 B

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -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

View File

@ -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 = "";

View File

@ -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/';

View File

@ -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,
);
}
}

View File

@ -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<dynamic> 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<void> 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');
}
}
}

View File

@ -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<ThemeSelectorDialog> createState() => _ThemeSelectorDialogState();
}
class _ThemeSelectorDialogState extends State<ThemeSelectorDialog> {
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<AppTheme>(
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"),
),
],
);
}
}

View File

@ -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<ThemeNotifier, ThemeMode>((ref) {
return ThemeNotifier();
});
class ThemeNotifier extends StateNotifier<ThemeMode> {
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;
}
}
}

View File

@ -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';
}

View File

@ -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';

View File

@ -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<MainApp> {
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,
);

View File

@ -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<uaenumberWidget> {
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<uaenumberWidget> {
super.dispose();
}
Future<void> fetchData(locale) async {
Future<void> 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<uaenumberWidget> {
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<ThemeMode>(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<uaenumberWidget> {
);
}
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<uaenumberWidget> {
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<uaenumberWidget> {
},
)
: 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<uaenumberWidget> {
},
title: mainTopic['main_topic'],
titleBackgroundColor: backgroundColor,
// currentTheme: currentTheme,
children: _buildSubTopics(
mainTopic['sub_topics'] ?? [],
mywidth,
@ -317,6 +366,7 @@ class _UaenumberWidgetState extends ConsumerState<uaenumberWidget> {
),
],
),
)
);
}
@ -431,6 +481,11 @@ class _UaenumberWidgetState extends ConsumerState<uaenumberWidget> {
: 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<uaenumberWidget> {
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<uaenumberWidget> {
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<uaenumberWidget> {
}
}
class CustomExpandableTile extends StatefulWidget {
class CustomExpandableTile extends ConsumerStatefulWidget {
final String title;
final Color titleBackgroundColor;
final List<Widget> children;
@ -517,21 +572,31 @@ class CustomExpandableTile extends StatefulWidget {
});
@override
_CustomExpandableTileState createState() => _CustomExpandableTileState();
ConsumerState<CustomExpandableTile> createState() => _CustomExpandableTileState();
}
class _CustomExpandableTileState extends State<CustomExpandableTile> {
class _CustomExpandableTileState extends ConsumerState<CustomExpandableTile> {
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<CustomExpandableTile> {
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<CustomExpandableTile> {
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),

View File

@ -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(

View File

@ -48,7 +48,7 @@ class _CreateNewPwState extends ConsumerState<CreateNewPw> {
String? _confirmPassword;
final fcscBanner = Image.asset(
BannerAssetPath.fcsc,
BannerAssetPath.fcscLogoLight,
height: 40,
);
@ -426,7 +426,7 @@ class _CreateNewPwState extends ConsumerState<CreateNewPw> {
end: 10,
),
child: Image.asset(
MiscIconAssetPath.lock,
MiscIconAssetPath.lockLight,
fit: BoxFit.fitHeight,
height: 25,
width: 25,
@ -510,7 +510,7 @@ class _CreateNewPwState extends ConsumerState<CreateNewPw> {
end: 10,
),
child: Image.asset(
MiscIconAssetPath.lock,
MiscIconAssetPath.lockLight,
fit: BoxFit.fitHeight,
height: 25,
width: 25,
@ -592,7 +592,7 @@ class _CreateNewPwState extends ConsumerState<CreateNewPw> {
end: 10,
),
child: Image.asset(
MiscIconAssetPath.lock,
MiscIconAssetPath.lockLight,
fit: BoxFit.fitHeight,
height: 25,
width: 25,

View File

@ -41,7 +41,7 @@ class _ForgotPasswordState extends ConsumerState<ForgotPassword> {
String? _confirmPassword;
final fcscBanner = Image.asset(
BannerAssetPath.fcsc,
BannerAssetPath.fcscLogoLight,
height: 40,
);
@ -445,7 +445,7 @@ class _ForgotPasswordState extends ConsumerState<ForgotPassword> {
end: 10,
),
child: Image.asset(
MiscIconAssetPath.lock,
MiscIconAssetPath.lockLight,
fit: BoxFit.fitHeight,
height: 25,
width: 25,
@ -528,7 +528,7 @@ class _ForgotPasswordState extends ConsumerState<ForgotPassword> {
end: 10,
),
child: Image.asset(
MiscIconAssetPath.lock,
MiscIconAssetPath.lockLight,
fit: BoxFit.fitHeight,
height: 25,
width: 25,

View File

@ -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,
);

View File

@ -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<RegisterScreen> {
}
}
final fcscBanner = Image.asset(
BannerAssetPath.fcsc,
height: 40,
);
@override
Widget build(BuildContext context) {
@ -376,6 +374,18 @@ class _RegisterScreenState extends ConsumerState<RegisterScreen> {
}
});
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<RegisterScreen> {
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<RegisterScreen> {
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<RegisterScreen> {
),
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<RegisterScreen> {
'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<RegisterScreen> {
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<RegisterScreen> {
),
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<RegisterScreen> {
'NotoKufi',
),
fontSize: 14,
color: Color(0xFF898C81),
color: isDarkTheme ? Color(0xFFEEEEEE) : Color(0xFF898C81),
),
),
SizedBox(height: 10),
@ -581,7 +593,8 @@ class _RegisterScreenState extends ConsumerState<RegisterScreen> {
fontFamily: context.translate(
'Roboto',
'NotoKufi',
)
),
color: isDarkTheme ? Color(0xFF24B4FB) : Color(0xFFAA8E83),
),
),
),
@ -593,7 +606,9 @@ class _RegisterScreenState extends ConsumerState<RegisterScreen> {
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<RegisterScreen> {
'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<RegisterScreen> {
),
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<RegisterScreen> {
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<RegisterScreen> {
end: 10,
),
child: Image.asset(
MiscIconAssetPath.person,
MiscIconAssetPath.personLight,
fit: BoxFit.fitHeight,
height: 25,
width: 25,
@ -695,10 +715,7 @@ class _RegisterScreenState extends ConsumerState<RegisterScreen> {
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<RegisterScreen> {
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<RegisterScreen> {
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<RegisterScreen> {
'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<RegisterScreen> {
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<RegisterScreen> {
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<RegisterScreen> {
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<RegisterScreen> {
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<RegisterScreen> {
'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<RegisterScreen> {
// 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<RegisterScreen> {
end: 10,
),
child: Image.asset(
MiscIconAssetPath.lock,
MiscIconAssetPath.lockLight,
fit: BoxFit.fitHeight,
height: 25,
width: 25,
@ -936,10 +956,7 @@ class _RegisterScreenState extends ConsumerState<RegisterScreen> {
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<RegisterScreen> {
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<RegisterScreen> {
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<RegisterScreen> {
'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<RegisterScreen> {
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<RegisterScreen> {
end: 10,
),
child: Image.asset(
MiscIconAssetPath.lock,
MiscIconAssetPath.lockLight,
fit: BoxFit.fitHeight,
height: 25,
width: 25,
@ -1063,10 +1083,7 @@ class _RegisterScreenState extends ConsumerState<RegisterScreen> {
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<RegisterScreen> {
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<RegisterScreen> {
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<RegisterScreen> {
'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<RegisterScreen> {
},
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<RegisterScreen> {
'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<RegisterScreen> {
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<RegisterScreen> {
'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<RegisterScreen> {
'ar'
? 12
: 14,
color: Color(
0xFF985400),
color: isDarkTheme ? Color(0xFF9EB3E4) : Color(0xFF985400),
// decoration:
// TextDecoration.underline,
decorationColor:
@ -1274,8 +1283,7 @@ class _RegisterScreenState extends ConsumerState<RegisterScreen> {
'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<RegisterScreen> {
'Roboto',
'NotoKufi',
),
color: Color(0xFFb22222),
color: isDarkTheme ? Color(0xFFFFA200) : Color(0xFFb22222),
fontSize: registerLocale
?.languageCode ==
'ar'
@ -1337,8 +1345,7 @@ class _RegisterScreenState extends ConsumerState<RegisterScreen> {
? 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<RegisterScreen> {
'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<RegisterScreen> {
'ar'
? 12
: 14,
color: Color(0xFF898C81),
color: isDarkTheme ? Color(0xFFEEEEEE) : Color(0xFF898C81),
),
),
SizedBox(height: 15),
@ -1408,8 +1415,7 @@ class _RegisterScreenState extends ConsumerState<RegisterScreen> {
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<RegisterScreen> {
'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
)
],
),

View File

@ -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,
);

View File

@ -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<ChartScreen1> {
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<ChartScreen1> {
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<ChartScreen1> {
});
}
Future<void> fetchChartData(String dataSets, locale, kpi, filter_data) async {
Future<void> 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<ChartScreen1> {
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<ChartScreen1> {
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<ChartScreen1> {
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<ChartScreen1> {
'المرشحات',
),
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<ChartScreen1> {
'Roboto',
'NotoKufi',
),
color: Color(0xFF8E8E8E),
color: isDarkTheme ? Color(0xFFFFFFFF) : Color(0xFF8E8E8E),
),
),
InkWell(
@ -1838,7 +1856,9 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
fontFamily: context.translate(
'Roboto',
'NotoKufi',
)
),
color: isDarkTheme ? Color(0xFFFFFFFF) : null,
),
),
),
@ -1868,7 +1888,7 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
// "${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<ChartScreen1> {
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<ChartScreen1> {
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<ChartScreen1> {
// 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<ChartScreen1> {
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<Map<String, dynamic>> 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<ChartScreen1> {
}
});
});
ref.listen<ThemeMode>(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<Map<String, dynamic>> 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<ChartScreen1> {
child: CardWidget(
card: card,
chartScreenData:
chartScreenData)),
chartScreenData,
themeMode: themeMode)),
],
));
} else {
@ -2771,7 +2860,7 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
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<ChartScreen1> {
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) {
final isDarkTheme = themeMode == ThemeMode.dark ||
(themeMode == ThemeMode.system &&
MediaQuery.of(context).platformBrightness == Brightness.dark);
final Map<String, Color> 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<ChartScreen1> {
), // 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<ChartScreen1> {
chartData:
chartsData[index],
bodyColor: bodyColor,
chartHeader: chartHeader),
chartHeader: chartHeader,isDarkTheme: isDarkTheme),
)
],
),
@ -2876,7 +2980,7 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
),
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<ChartScreen1> {
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>(
Color(0xFFAA8E83)), // Loader color
),
@ -2972,9 +3075,10 @@ Color _getColorFromHex(String hexColor) {
class CardWidget extends StatelessWidget {
final Map<String, dynamic> card;
final Map<String, dynamic> 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<String, Color> 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,
),
),
),

View File

@ -17,7 +17,7 @@ class ApiService {
static const String baseUrl = '$apiUrl/api/getDataSet';
Future<Map<String, dynamic>> fetchChartData(String dataSets, locale, kpi,
List<Map<String, dynamic>> filterData) async {
List<Map<String, dynamic>> filterData,themeMode) async {
List<dynamic> isChartData = [];
List<dynamic> nonChartData = [];
List<dynamic> 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(

View File

@ -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<int> 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,
),
),
)

View File

@ -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),);}

View File

@ -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(

View File

@ -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,

View File

@ -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<void> 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),
),
);

View File

@ -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;

View File

@ -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<EconomyStatsWidget> {
late List<TargetFocus> homeTargets;
late List<TargetFocus> previousHomeTargets;
late final Locale locale;
late ThemeMode currentTheme;
// ThemeMode? _previousTheme;
Future<void> handleSkip() async {
tutorialCoachMark.skip();
@ -1084,7 +1087,20 @@ class EconomyStatsState extends ConsumerState<EconomyStatsWidget> {
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<EconomyStatsWidget> {
// }
// }
Future<void> fetchData(locale) async {
Future<void> 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<EconomyStatsWidget> {
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<EconomyStatsWidget> {
}
});
ref.listen<ThemeMode>(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<EconomyStatsWidget> {
}
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<EconomyStatsWidget> {
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,
),
),
// ),
// ),
],
),
),
);
}
);
}
}

View File

@ -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<Widget>? actions;
final Color? bottomColor;
final Color? appbarColor, mytitleColor;
final Color? backgroundColor;
@override
_BaseScaffoldState createState() => _BaseScaffoldState();
@ -830,6 +836,111 @@ class _BaseScaffoldState extends ConsumerState<BaseScaffold> {
context.go('/login'); // Redirect to login after logout
}
// void _showThemeDialog(BuildContext context) async {
// AppTheme? result = await showDialog<AppTheme>(
// 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<AppTheme>(
// 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<AppTheme>(
// 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<AppTheme>(
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<BaseScaffold> {
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<BaseScaffold> {
: 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<BaseScaffold> {
),
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<BaseScaffold> {
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<BaseScaffold> {
),
),
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<BaseScaffold> {
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<BaseScaffold> {
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<BaseScaffold> {
),
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<BaseScaffold> {
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<BaseScaffold> {
// 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<BaseScaffold> {
),
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<BaseScaffold> {
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<BaseScaffold> {
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<BaseScaffold> {
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<BaseScaffold> {
// 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<BaseScaffold> {
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<BaseScaffold> {
),
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<BaseScaffold> {
),
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<BaseScaffold> {
),
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<BaseScaffold> {
),
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<BaseScaffold> {
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<BaseScaffold> {
} 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<BaseScaffold> {
),
),
])),
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,
);
}

View File

@ -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/