diff --git a/README.md b/README.md
index 1a459e37..3fea310f 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,11 @@
+# Translation prompt & Command
+
+Read the context for both files & generate translations strings in the en-US.json & ar-SA.json files for the strings containing "needTranslation". Also replace the strings in the dart with the generated Strings. Also do not remove existing properties & do no generate duplicate strings in the json files
+
+flutter3_32 pub run easy_localization:generate -O ./lib/generated -f keys -o locale_keys.g.dart --source-dir ./assets/langs
+
+
+
# HMG Patient App
A comprehensive Flutter-based mobile application for HMG (Habib Medical Group) patients,
diff --git a/assets/images/clinicIcons/1.svg b/assets/images/clinicIcons/1.svg
new file mode 100644
index 00000000..70f4171f
--- /dev/null
+++ b/assets/images/clinicIcons/1.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/104.svg b/assets/images/clinicIcons/104.svg
new file mode 100644
index 00000000..3fd875ff
--- /dev/null
+++ b/assets/images/clinicIcons/104.svg
@@ -0,0 +1,12 @@
+
diff --git a/assets/images/clinicIcons/105.svg b/assets/images/clinicIcons/105.svg
new file mode 100644
index 00000000..a9f4bd1c
--- /dev/null
+++ b/assets/images/clinicIcons/105.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/images/clinicIcons/106.svg b/assets/images/clinicIcons/106.svg
new file mode 100644
index 00000000..bd103ad1
--- /dev/null
+++ b/assets/images/clinicIcons/106.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/107.svg b/assets/images/clinicIcons/107.svg
new file mode 100644
index 00000000..b1946db9
--- /dev/null
+++ b/assets/images/clinicIcons/107.svg
@@ -0,0 +1,11 @@
+
diff --git a/assets/images/clinicIcons/108.svg b/assets/images/clinicIcons/108.svg
new file mode 100644
index 00000000..a29fe001
--- /dev/null
+++ b/assets/images/clinicIcons/108.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/clinicIcons/11.svg b/assets/images/clinicIcons/11.svg
new file mode 100644
index 00000000..1c276aad
--- /dev/null
+++ b/assets/images/clinicIcons/11.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/110.svg b/assets/images/clinicIcons/110.svg
new file mode 100644
index 00000000..6d533e2d
--- /dev/null
+++ b/assets/images/clinicIcons/110.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/111.svg b/assets/images/clinicIcons/111.svg
new file mode 100644
index 00000000..46ba92f4
--- /dev/null
+++ b/assets/images/clinicIcons/111.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/118.svg b/assets/images/clinicIcons/118.svg
new file mode 100644
index 00000000..238cd5ac
--- /dev/null
+++ b/assets/images/clinicIcons/118.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/12.svg b/assets/images/clinicIcons/12.svg
new file mode 100644
index 00000000..cb6a23f7
--- /dev/null
+++ b/assets/images/clinicIcons/12.svg
@@ -0,0 +1,8 @@
+
diff --git a/assets/images/clinicIcons/126.svg b/assets/images/clinicIcons/126.svg
new file mode 100644
index 00000000..9d26d975
--- /dev/null
+++ b/assets/images/clinicIcons/126.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/128.svg b/assets/images/clinicIcons/128.svg
new file mode 100644
index 00000000..0888a5f3
--- /dev/null
+++ b/assets/images/clinicIcons/128.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/images/clinicIcons/130.svg b/assets/images/clinicIcons/130.svg
new file mode 100644
index 00000000..5598ebb3
--- /dev/null
+++ b/assets/images/clinicIcons/130.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/131.svg b/assets/images/clinicIcons/131.svg
new file mode 100644
index 00000000..dbf94b5c
--- /dev/null
+++ b/assets/images/clinicIcons/131.svg
@@ -0,0 +1,33 @@
+
diff --git a/assets/images/clinicIcons/134.svg b/assets/images/clinicIcons/134.svg
new file mode 100644
index 00000000..42f84173
--- /dev/null
+++ b/assets/images/clinicIcons/134.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/14.svg b/assets/images/clinicIcons/14.svg
new file mode 100644
index 00000000..46ba92f4
--- /dev/null
+++ b/assets/images/clinicIcons/14.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/140.svg b/assets/images/clinicIcons/140.svg
new file mode 100644
index 00000000..56c7a538
--- /dev/null
+++ b/assets/images/clinicIcons/140.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/images/clinicIcons/148.svg b/assets/images/clinicIcons/148.svg
new file mode 100644
index 00000000..bd103ad1
--- /dev/null
+++ b/assets/images/clinicIcons/148.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/149.svg b/assets/images/clinicIcons/149.svg
new file mode 100644
index 00000000..0888a5f3
--- /dev/null
+++ b/assets/images/clinicIcons/149.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/images/clinicIcons/16.svg b/assets/images/clinicIcons/16.svg
new file mode 100644
index 00000000..e1ed3160
--- /dev/null
+++ b/assets/images/clinicIcons/16.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/17.svg b/assets/images/clinicIcons/17.svg
new file mode 100644
index 00000000..44bad059
--- /dev/null
+++ b/assets/images/clinicIcons/17.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/images/clinicIcons/18.svg b/assets/images/clinicIcons/18.svg
new file mode 100644
index 00000000..1148ad6b
--- /dev/null
+++ b/assets/images/clinicIcons/18.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/19.svg b/assets/images/clinicIcons/19.svg
new file mode 100644
index 00000000..5b7d43bd
--- /dev/null
+++ b/assets/images/clinicIcons/19.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/2.svg b/assets/images/clinicIcons/2.svg
new file mode 100644
index 00000000..b4b15214
--- /dev/null
+++ b/assets/images/clinicIcons/2.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/clinicIcons/20.svg b/assets/images/clinicIcons/20.svg
new file mode 100644
index 00000000..9e6db603
--- /dev/null
+++ b/assets/images/clinicIcons/20.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/clinicIcons/21.svg b/assets/images/clinicIcons/21.svg
new file mode 100644
index 00000000..9b9ee825
--- /dev/null
+++ b/assets/images/clinicIcons/21.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/images/clinicIcons/23.svg b/assets/images/clinicIcons/23.svg
new file mode 100644
index 00000000..4f8b915d
--- /dev/null
+++ b/assets/images/clinicIcons/23.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/images/clinicIcons/24.svg b/assets/images/clinicIcons/24.svg
new file mode 100644
index 00000000..70f4171f
--- /dev/null
+++ b/assets/images/clinicIcons/24.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/25.svg b/assets/images/clinicIcons/25.svg
new file mode 100644
index 00000000..70f4171f
--- /dev/null
+++ b/assets/images/clinicIcons/25.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/250.svg b/assets/images/clinicIcons/250.svg
new file mode 100644
index 00000000..b4b15214
--- /dev/null
+++ b/assets/images/clinicIcons/250.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/clinicIcons/252.svg b/assets/images/clinicIcons/252.svg
new file mode 100644
index 00000000..9545d249
--- /dev/null
+++ b/assets/images/clinicIcons/252.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/images/clinicIcons/253.svg b/assets/images/clinicIcons/253.svg
new file mode 100644
index 00000000..71182316
--- /dev/null
+++ b/assets/images/clinicIcons/253.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/254.svg b/assets/images/clinicIcons/254.svg
new file mode 100644
index 00000000..5e24ad49
--- /dev/null
+++ b/assets/images/clinicIcons/254.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/images/clinicIcons/255.svg b/assets/images/clinicIcons/255.svg
new file mode 100644
index 00000000..e9ccd2bb
--- /dev/null
+++ b/assets/images/clinicIcons/255.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/images/clinicIcons/257.svg b/assets/images/clinicIcons/257.svg
new file mode 100644
index 00000000..b4b15214
--- /dev/null
+++ b/assets/images/clinicIcons/257.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/clinicIcons/26.svg b/assets/images/clinicIcons/26.svg
new file mode 100644
index 00000000..b82e118d
--- /dev/null
+++ b/assets/images/clinicIcons/26.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/clinicIcons/260.svg b/assets/images/clinicIcons/260.svg
new file mode 100644
index 00000000..60ed9c2b
--- /dev/null
+++ b/assets/images/clinicIcons/260.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/clinicIcons/262.svg b/assets/images/clinicIcons/262.svg
new file mode 100644
index 00000000..371c0ba5
--- /dev/null
+++ b/assets/images/clinicIcons/262.svg
@@ -0,0 +1,16 @@
+
diff --git a/assets/images/clinicIcons/264.svg b/assets/images/clinicIcons/264.svg
new file mode 100644
index 00000000..b1f231e1
--- /dev/null
+++ b/assets/images/clinicIcons/264.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/27.svg b/assets/images/clinicIcons/27.svg
new file mode 100644
index 00000000..6da1ed72
--- /dev/null
+++ b/assets/images/clinicIcons/27.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/28.svg b/assets/images/clinicIcons/28.svg
new file mode 100644
index 00000000..483893ce
--- /dev/null
+++ b/assets/images/clinicIcons/28.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/images/clinicIcons/29.svg b/assets/images/clinicIcons/29.svg
new file mode 100644
index 00000000..009a406f
--- /dev/null
+++ b/assets/images/clinicIcons/29.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/images/clinicIcons/3.svg b/assets/images/clinicIcons/3.svg
new file mode 100644
index 00000000..7a313ee7
--- /dev/null
+++ b/assets/images/clinicIcons/3.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/30.svg b/assets/images/clinicIcons/30.svg
new file mode 100644
index 00000000..d16a33a4
--- /dev/null
+++ b/assets/images/clinicIcons/30.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/images/clinicIcons/31.svg b/assets/images/clinicIcons/31.svg
new file mode 100644
index 00000000..93becf0b
--- /dev/null
+++ b/assets/images/clinicIcons/31.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/32.svg b/assets/images/clinicIcons/32.svg
new file mode 100644
index 00000000..9256566c
--- /dev/null
+++ b/assets/images/clinicIcons/32.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/images/clinicIcons/34.svg b/assets/images/clinicIcons/34.svg
new file mode 100644
index 00000000..b592ad80
--- /dev/null
+++ b/assets/images/clinicIcons/34.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/35.svg b/assets/images/clinicIcons/35.svg
new file mode 100644
index 00000000..c5ac8796
--- /dev/null
+++ b/assets/images/clinicIcons/35.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/36.svg b/assets/images/clinicIcons/36.svg
new file mode 100644
index 00000000..1d171d41
--- /dev/null
+++ b/assets/images/clinicIcons/36.svg
@@ -0,0 +1,8 @@
+
diff --git a/assets/images/clinicIcons/38.svg b/assets/images/clinicIcons/38.svg
new file mode 100644
index 00000000..9448feb8
--- /dev/null
+++ b/assets/images/clinicIcons/38.svg
@@ -0,0 +1,9 @@
+
diff --git a/assets/images/clinicIcons/4.svg b/assets/images/clinicIcons/4.svg
new file mode 100644
index 00000000..beb7239c
--- /dev/null
+++ b/assets/images/clinicIcons/4.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/40.svg b/assets/images/clinicIcons/40.svg
new file mode 100644
index 00000000..168ece67
--- /dev/null
+++ b/assets/images/clinicIcons/40.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/images/clinicIcons/41.svg b/assets/images/clinicIcons/41.svg
new file mode 100644
index 00000000..93becf0b
--- /dev/null
+++ b/assets/images/clinicIcons/41.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/42.svg b/assets/images/clinicIcons/42.svg
new file mode 100644
index 00000000..5b7d43bd
--- /dev/null
+++ b/assets/images/clinicIcons/42.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/44.svg b/assets/images/clinicIcons/44.svg
new file mode 100644
index 00000000..e9edf9aa
--- /dev/null
+++ b/assets/images/clinicIcons/44.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/46.svg b/assets/images/clinicIcons/46.svg
new file mode 100644
index 00000000..926ad199
--- /dev/null
+++ b/assets/images/clinicIcons/46.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/images/clinicIcons/5.svg b/assets/images/clinicIcons/5.svg
new file mode 100644
index 00000000..d25576e0
--- /dev/null
+++ b/assets/images/clinicIcons/5.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/50.svg b/assets/images/clinicIcons/50.svg
new file mode 100644
index 00000000..662a64ea
--- /dev/null
+++ b/assets/images/clinicIcons/50.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/images/clinicIcons/51.svg b/assets/images/clinicIcons/51.svg
new file mode 100644
index 00000000..8ef6791f
--- /dev/null
+++ b/assets/images/clinicIcons/51.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/images/clinicIcons/53.svg b/assets/images/clinicIcons/53.svg
new file mode 100644
index 00000000..56c7a538
--- /dev/null
+++ b/assets/images/clinicIcons/53.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/images/clinicIcons/55.svg b/assets/images/clinicIcons/55.svg
new file mode 100644
index 00000000..a94748cf
--- /dev/null
+++ b/assets/images/clinicIcons/55.svg
@@ -0,0 +1,8 @@
+
diff --git a/assets/images/clinicIcons/56.svg b/assets/images/clinicIcons/56.svg
new file mode 100644
index 00000000..be814451
--- /dev/null
+++ b/assets/images/clinicIcons/56.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/58.svg b/assets/images/clinicIcons/58.svg
new file mode 100644
index 00000000..49871663
--- /dev/null
+++ b/assets/images/clinicIcons/58.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/59.svg b/assets/images/clinicIcons/59.svg
new file mode 100644
index 00000000..87e22694
--- /dev/null
+++ b/assets/images/clinicIcons/59.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/6.svg b/assets/images/clinicIcons/6.svg
new file mode 100644
index 00000000..50e0c7b9
--- /dev/null
+++ b/assets/images/clinicIcons/6.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/images/clinicIcons/67.svg b/assets/images/clinicIcons/67.svg
new file mode 100644
index 00000000..4f8b915d
--- /dev/null
+++ b/assets/images/clinicIcons/67.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/images/clinicIcons/68.svg b/assets/images/clinicIcons/68.svg
new file mode 100644
index 00000000..d16a33a4
--- /dev/null
+++ b/assets/images/clinicIcons/68.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/images/clinicIcons/69.svg b/assets/images/clinicIcons/69.svg
new file mode 100644
index 00000000..70f4171f
--- /dev/null
+++ b/assets/images/clinicIcons/69.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/7.svg b/assets/images/clinicIcons/7.svg
new file mode 100644
index 00000000..b1ec62e7
--- /dev/null
+++ b/assets/images/clinicIcons/7.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/74.svg b/assets/images/clinicIcons/74.svg
new file mode 100644
index 00000000..62371818
--- /dev/null
+++ b/assets/images/clinicIcons/74.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/78.svg b/assets/images/clinicIcons/78.svg
new file mode 100644
index 00000000..60ed9c2b
--- /dev/null
+++ b/assets/images/clinicIcons/78.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/clinicIcons/79.svg b/assets/images/clinicIcons/79.svg
new file mode 100644
index 00000000..1decce94
--- /dev/null
+++ b/assets/images/clinicIcons/79.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/clinicIcons/8.svg b/assets/images/clinicIcons/8.svg
new file mode 100644
index 00000000..d16a33a4
--- /dev/null
+++ b/assets/images/clinicIcons/8.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/images/clinicIcons/83.svg b/assets/images/clinicIcons/83.svg
new file mode 100644
index 00000000..87e22694
--- /dev/null
+++ b/assets/images/clinicIcons/83.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/84.svg b/assets/images/clinicIcons/84.svg
new file mode 100644
index 00000000..ed242ec2
--- /dev/null
+++ b/assets/images/clinicIcons/84.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/clinicIcons/85.svg b/assets/images/clinicIcons/85.svg
new file mode 100644
index 00000000..076d2018
--- /dev/null
+++ b/assets/images/clinicIcons/85.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/images/clinicIcons/86.svg b/assets/images/clinicIcons/86.svg
new file mode 100644
index 00000000..4615e671
--- /dev/null
+++ b/assets/images/clinicIcons/86.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/clinicIcons/87.svg b/assets/images/clinicIcons/87.svg
new file mode 100644
index 00000000..d0b95ae1
--- /dev/null
+++ b/assets/images/clinicIcons/87.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/images/clinicIcons/88.svg b/assets/images/clinicIcons/88.svg
new file mode 100644
index 00000000..93f30422
--- /dev/null
+++ b/assets/images/clinicIcons/88.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/89.svg b/assets/images/clinicIcons/89.svg
new file mode 100644
index 00000000..768ef4a2
--- /dev/null
+++ b/assets/images/clinicIcons/89.svg
@@ -0,0 +1,9 @@
+
diff --git a/assets/images/clinicIcons/9.svg b/assets/images/clinicIcons/9.svg
new file mode 100644
index 00000000..aa0acfba
--- /dev/null
+++ b/assets/images/clinicIcons/9.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/90.svg b/assets/images/clinicIcons/90.svg
new file mode 100644
index 00000000..6f8a44b0
--- /dev/null
+++ b/assets/images/clinicIcons/90.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/91.svg b/assets/images/clinicIcons/91.svg
new file mode 100644
index 00000000..42344286
--- /dev/null
+++ b/assets/images/clinicIcons/91.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/93.svg b/assets/images/clinicIcons/93.svg
new file mode 100644
index 00000000..be1b4a69
--- /dev/null
+++ b/assets/images/clinicIcons/93.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/98.svg b/assets/images/clinicIcons/98.svg
new file mode 100644
index 00000000..93f30422
--- /dev/null
+++ b/assets/images/clinicIcons/98.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/Cardiac Surgery.svg b/assets/images/clinicIcons/Cardiac Surgery.svg
new file mode 100644
index 00000000..20758717
--- /dev/null
+++ b/assets/images/clinicIcons/Cardiac Surgery.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/clinicIcons/Colorectal Oncology Clinic 2.svg b/assets/images/clinicIcons/Colorectal Oncology Clinic 2.svg
new file mode 100644
index 00000000..b3898e57
--- /dev/null
+++ b/assets/images/clinicIcons/Colorectal Oncology Clinic 2.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/Dental Employee Clinic.svg b/assets/images/clinicIcons/Dental Employee Clinic.svg
new file mode 100644
index 00000000..44bad059
--- /dev/null
+++ b/assets/images/clinicIcons/Dental Employee Clinic.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/images/clinicIcons/ENT Oncology Clinic 2.svg b/assets/images/clinicIcons/ENT Oncology Clinic 2.svg
new file mode 100644
index 00000000..7defb9c0
--- /dev/null
+++ b/assets/images/clinicIcons/ENT Oncology Clinic 2.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/images/clinicIcons/ER CLINIC.svg b/assets/images/clinicIcons/ER CLINIC.svg
new file mode 100644
index 00000000..cb239be1
--- /dev/null
+++ b/assets/images/clinicIcons/ER CLINIC.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/clinicIcons/EXCELLENCE CLINIC.svg b/assets/images/clinicIcons/EXCELLENCE CLINIC.svg
new file mode 100644
index 00000000..b6cc121a
--- /dev/null
+++ b/assets/images/clinicIcons/EXCELLENCE CLINIC.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/images/clinicIcons/Frame.svg b/assets/images/clinicIcons/Frame.svg
new file mode 100644
index 00000000..c573a489
--- /dev/null
+++ b/assets/images/clinicIcons/Frame.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/images/clinicIcons/Gynecology oncology Clinic.svg b/assets/images/clinicIcons/Gynecology oncology Clinic.svg
new file mode 100644
index 00000000..9bef9cbe
--- /dev/null
+++ b/assets/images/clinicIcons/Gynecology oncology Clinic.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/images/clinicIcons/Interventional Radiology Clinic.svg b/assets/images/clinicIcons/Interventional Radiology Clinic.svg
new file mode 100644
index 00000000..5b7d43bd
--- /dev/null
+++ b/assets/images/clinicIcons/Interventional Radiology Clinic.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/LIVER , GALLBLADDER, PANCREATIC CLINIC.svg b/assets/images/clinicIcons/LIVER , GALLBLADDER, PANCREATIC CLINIC.svg
new file mode 100644
index 00000000..117b29b9
--- /dev/null
+++ b/assets/images/clinicIcons/LIVER , GALLBLADDER, PANCREATIC CLINIC.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/images/clinicIcons/Maternal-Fetal Medicine Clinic.svg b/assets/images/clinicIcons/Maternal-Fetal Medicine Clinic.svg
new file mode 100644
index 00000000..708d85fb
--- /dev/null
+++ b/assets/images/clinicIcons/Maternal-Fetal Medicine Clinic.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/clinicIcons/Maxilliofacial Surgery.svg b/assets/images/clinicIcons/Maxilliofacial Surgery.svg
new file mode 100644
index 00000000..66a0fbd1
--- /dev/null
+++ b/assets/images/clinicIcons/Maxilliofacial Surgery.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/OB-GYNE physiotherapy clinic-1.svg b/assets/images/clinicIcons/OB-GYNE physiotherapy clinic-1.svg
new file mode 100644
index 00000000..5e24ad49
--- /dev/null
+++ b/assets/images/clinicIcons/OB-GYNE physiotherapy clinic-1.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/images/clinicIcons/Occupational Therapy Clinic.svg b/assets/images/clinicIcons/Occupational Therapy Clinic.svg
new file mode 100644
index 00000000..31815199
--- /dev/null
+++ b/assets/images/clinicIcons/Occupational Therapy Clinic.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/images/clinicIcons/Orthopedic Oncology Surgery Clinic.svg b/assets/images/clinicIcons/Orthopedic Oncology Surgery Clinic.svg
new file mode 100644
index 00000000..226d56c7
--- /dev/null
+++ b/assets/images/clinicIcons/Orthopedic Oncology Surgery Clinic.svg
@@ -0,0 +1,8 @@
+
diff --git a/assets/images/clinicIcons/RRT Clinic 2.svg b/assets/images/clinicIcons/RRT Clinic 2.svg
new file mode 100644
index 00000000..f4e451a4
--- /dev/null
+++ b/assets/images/clinicIcons/RRT Clinic 2.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/Radiation Oncology Clinic 2.svg b/assets/images/clinicIcons/Radiation Oncology Clinic 2.svg
new file mode 100644
index 00000000..ac8e5e15
--- /dev/null
+++ b/assets/images/clinicIcons/Radiation Oncology Clinic 2.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/images/clinicIcons/Retinopathy of prematurity(ROP).svg b/assets/images/clinicIcons/Retinopathy of prematurity(ROP).svg
new file mode 100644
index 00000000..814b1a73
--- /dev/null
+++ b/assets/images/clinicIcons/Retinopathy of prematurity(ROP).svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/SKIN AND HAIR CARE.svg b/assets/images/clinicIcons/SKIN AND HAIR CARE.svg
new file mode 100644
index 00000000..dbe39722
--- /dev/null
+++ b/assets/images/clinicIcons/SKIN AND HAIR CARE.svg
@@ -0,0 +1,30 @@
+
diff --git a/assets/images/clinicIcons/SPA SKIN CARE.svg b/assets/images/clinicIcons/SPA SKIN CARE.svg
new file mode 100644
index 00000000..55ce4736
--- /dev/null
+++ b/assets/images/clinicIcons/SPA SKIN CARE.svg
@@ -0,0 +1,23 @@
+
diff --git a/assets/images/clinicIcons/Smell Clinic 2.svg b/assets/images/clinicIcons/Smell Clinic 2.svg
new file mode 100644
index 00000000..53417591
--- /dev/null
+++ b/assets/images/clinicIcons/Smell Clinic 2.svg
@@ -0,0 +1,9 @@
+
diff --git a/assets/images/clinicIcons/Surgical Oncology Clinic.svg b/assets/images/clinicIcons/Surgical Oncology Clinic.svg
new file mode 100644
index 00000000..7e7f1db7
--- /dev/null
+++ b/assets/images/clinicIcons/Surgical Oncology Clinic.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/images/clinicIcons/Thoracic Clinic.svg b/assets/images/clinicIcons/Thoracic Clinic.svg
new file mode 100644
index 00000000..9d26d975
--- /dev/null
+++ b/assets/images/clinicIcons/Thoracic Clinic.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/clinicIcons/Urology Oncology Clinic.svg b/assets/images/clinicIcons/Urology Oncology Clinic.svg
new file mode 100644
index 00000000..935af2ee
--- /dev/null
+++ b/assets/images/clinicIcons/Urology Oncology Clinic.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/svg/ar_lang_icon.svg b/assets/images/svg/ar_lang_icon.svg
new file mode 100644
index 00000000..d1c2be0c
--- /dev/null
+++ b/assets/images/svg/ar_lang_icon.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/svg/change_language_home_page.svg b/assets/images/svg/change_language_home_page.svg
new file mode 100644
index 00000000..716a3b02
--- /dev/null
+++ b/assets/images/svg/change_language_home_page.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/images/svg/colored_dots_icon.svg b/assets/images/svg/colored_dots_icon.svg
new file mode 100644
index 00000000..7f05dc57
--- /dev/null
+++ b/assets/images/svg/colored_dots_icon.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/svg/doctor_response_icon.svg b/assets/images/svg/doctor_response_icon.svg
new file mode 100644
index 00000000..1c4b156a
--- /dev/null
+++ b/assets/images/svg/doctor_response_icon.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/images/svg/en_lang_icon.svg b/assets/images/svg/en_lang_icon.svg
new file mode 100644
index 00000000..fa1c1435
--- /dev/null
+++ b/assets/images/svg/en_lang_icon.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/svg/my_child_vaccine.svg b/assets/images/svg/my_child_vaccine.svg
new file mode 100644
index 00000000..f671baf8
--- /dev/null
+++ b/assets/images/svg/my_child_vaccine.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json
index b6fe4bf9..bf8cfd82 100644
--- a/assets/langs/ar-SA.json
+++ b/assets/langs/ar-SA.json
@@ -1377,6 +1377,18 @@
"suggestions": "الاقتراحات",
"pleaseGoBackAndSelectOrgansFirst": "يرجى العودة واختيار الأعضاء أولاً",
"symptomsSelector": "محدد الأعراض",
+ "possibleSymptomsRelatedTo": "الأعراض المحتملة المتعلقة بـ",
+ "suggestionAIListDescription": "هذه قائمة بالأعراض المقترحة من قبل الذكاء الاصطناعي، بناءً على المعلومات التي تم جمعها حتى الآن خلال المقابلة",
+ "analyzing": "جاري التحليل...",
+ "seekMedicalAdvice": "اطلب المشورة الطبية",
+ "monitorDescription": "لا حاجة لطلب المشورة الطبية. فقط حافظ على روتين صحي.",
+ "seekMedicalAdviceDescription": "ليست حالة طوارئ ولكن من الأفضل مراقبة الأعراض.",
+ "emergencyDescription": "تحتاج إلى استشارة الطبيب في أقرب وقت ممكن قبل فوات الأوان.",
+ "colorScience": "دلالات الألوان",
+ "noNeedToVisitDoctor": "لا حاجة لزيرة الطبيب",
+ "commonSymptom": "الأعراض الشائعة",
+ "bookAppointment": "احجز موعد",
+ "notApplicable": "لا ينطبق",
"emergencyTriage": "طوارئ",
"emergencyEvidenceDetected": "تم اكتشاف دليل طوارئ. يرجى طلب العناية الطبية.",
"noQuestionItemsAvailable": "لا توجد عناصر أسئلة متاحة",
@@ -1500,5 +1512,20 @@
"pleaseWaitYouWillBeCalledForVitalSigns": "يرجى الانتظار! سيتم استدعاؤك لقياس العلامات الحيوية",
"pleaseVisitRoomForVitalSigns": "يرجى زيارة الغرفة {roomNumber} لقياس العلامات الحيوية",
"pleaseVisitRoomToTheDoctor": "يرجى زيارة الغرفة {roomNumber} لمقابلة الطبيب",
+ "erOnlineCheckInRequest": "طلب تسجيل الوصول عبر الإنترنت لقسم الطوارئ",
+ "indoor": "داخلي",
+ "navigation": "الملاحة",
+ "health": "الصحة",
+ "calculators": "الحاسبات",
+ "converters": "المحولات",
+ "guide": "الدليل",
+ "liveCareServiceDesc": "احصل على استشارة طبية من طبيب متخصص عبر مكالمة فيديو",
+ "bloodGroup": "فصيلة الدم: {bloodType}",
+ "medicalServices": "الخدمات الطبية",
+ "insuranceAndPayments": "التأمين والمدفوعات",
+ "trackerAndOthers": "المتتبع وأخرى",
+ "bmi": "مؤشر كتلة الجسم",
"timeFor": "الوقت"
+
+
}
diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json
index 5f356bac..50d44816 100644
--- a/assets/langs/en-US.json
+++ b/assets/langs/en-US.json
@@ -1367,6 +1367,18 @@
"suggestions": "Suggestions",
"pleaseGoBackAndSelectOrgansFirst": "Please go back and select organs first",
"symptomsSelector": "Symptoms Selector",
+ "possibleSymptomsRelatedTo": "Possible symptoms related to",
+ "suggestionAIListDescription": "This is a list of symptoms suggested by our AI, based on the information gathered so far during the interview",
+ "analyzing": "Analyzing...",
+ "seekMedicalAdvice": "Seek Medical Advice",
+ "monitorDescription": "No need to seek medical advice. Just keep healthy routine.",
+ "seekMedicalAdviceDescription": "Not emergency but better to monitor the symptoms.",
+ "emergencyDescription": "Need to consult doctor as soon as possible before getting too late.",
+ "colorScience": "Color Science",
+ "noNeedToVisitDoctor": "No need to visit doctor",
+ "commonSymptom": "Common Symptom",
+ "bookAppointment": "Book Appointment",
+ "notApplicable": "Not Applicable",
"emergencyTriage": "Emergency",
"emergencyEvidenceDetected": "Emergency evidence detected. Please seek medical attention.",
"noQuestionItemsAvailable": "No question items available",
@@ -1490,5 +1502,20 @@
"selectTime": "Select Time",
"pleaseWaitYouWillBeCalledForVitalSigns": "Please wait! you will be called for vital signs",
"pleaseVisitRoomForVitalSigns": "Please visit Room {roomNumber} for vital signs",
- "pleaseVisitRoomToTheDoctor": "Please visit Room {roomNumber} to the Doctor"
+ "pleaseVisitRoomToTheDoctor": "Please visit Room {roomNumber} to the Doctor",
+ "erOnlineCheckInRequest": "ER Online Check-In Request",
+ "indoor": "Indoor",
+ "navigation": "Navigation",
+ "health": "Health",
+ "calculators": "Calculators",
+ "converters": "Converters",
+ "guide": "Guide",
+ "liveCareServiceDesc": "Get medical advice with a specialist doctor Via a video call",
+ "bloodGroup": "Blood: {bloodType}",
+ "medicalServices": "Medical Services",
+ "insuranceAndPayments": "Insurance & Payments",
+ "trackerAndOthers": "Tracker & Others",
+ "bmi": "BMI"
+
+
}
diff --git a/convert_json.dart b/convert_json.dart
index 08f344d4..af5c5945 100644
--- a/convert_json.dart
+++ b/convert_json.dart
@@ -1,73 +1,73 @@
-import 'dart:convert';
-import 'dart:io';
-
-void main() async {
- final file = File('assets/json/body_symptoms_data.json');
- final content = await file.readAsString();
-
- print('File size: ${content.length} characters');
-
- // Split into two parts
- final parts = content.split('export const SymptomsData = [');
- if (parts.length != 2) {
- print('ERROR: Could not split file properly');
- exit(1);
- }
-
- print('Split into ${parts.length} parts');
-
- // Process BodySymptomsData
- var bodyPart = parts[0]
- .replaceAll('export const BodySymptomsData = ', '')
- .trim()
- .replaceAll(RegExp(r';$'), '');
-
- print('Parsing body symptoms...');
- Map bodySymptomsData;
- try {
- bodySymptomsData = json.decode(bodyPart);
- print('✅ Body symptoms parsed: ${bodySymptomsData.length} body parts');
- } catch (e) {
- print('❌ Error parsing body symptoms: $e');
- exit(1);
- }
-
- // Process SymptomsData
- print('Processing symptoms data...');
- var symptomsPart = parts[1]
- .trim()
- .replaceAll(RegExp(r'\];$'), '')
- .replaceAllMapped(RegExp(r'\n(\s*)id:'), (m) => '\n${m.group(1)}"id":')
- .replaceAllMapped(RegExp(r'\n(\s*)type:'), (m) => '\n${m.group(1)}"type":')
- .replaceAllMapped(RegExp(r'\n(\s*)name:'), (m) => '\n${m.group(1)}"name":')
- .replaceAllMapped(RegExp(r'\n(\s*)common_name:'), (m) => '\n${m.group(1)}"common_name":');
-
- print('Parsing symptoms...');
- List symptomsData;
- try {
- symptomsData = json.decode('[$symptomsPart]');
- print('✅ Symptoms parsed: ${symptomsData.length} symptoms');
- } catch (e) {
- print('❌ Error parsing symptoms: $e');
- print('First 1000 chars:');
- print('[$symptomsPart]'.substring(0, 1000));
- exit(1);
- }
-
- // Create final JSON
- print('Creating final JSON structure...');
- final jsonStructure = {
- 'bodySymptoms': bodySymptomsData,
- 'symptoms': symptomsData,
- };
-
- // Write to file
- print('Writing to file...');
- final encoder = JsonEncoder.withIndent(' ');
- await file.writeAsString(encoder.convert(jsonStructure));
-
- print('\n✅ SUCCESS! File converted to proper JSON');
- print('✅ Body parts: ${bodySymptomsData.length}');
- print('✅ Symptoms: ${symptomsData.length}');
-}
-
+// import 'dart:convert';
+// import 'dart:io';
+//
+// void main() async {
+// final file = File('assets/json/body_symptoms_data.json');
+// final content = await file.readAsString();
+//
+// print('File size: ${content.length} characters');
+//
+// // Split into two parts
+// final parts = content.split('export const SymptomsData = [');
+// if (parts.length != 2) {
+// print('ERROR: Could not split file properly');
+// exit(1);
+// }
+//
+// print('Split into ${parts.length} parts');
+//
+// // Process BodySymptomsData
+// var bodyPart = parts[0]
+// .replaceAll('export const BodySymptomsData = ', '')
+// .trim()
+// .replaceAll(RegExp(r';$'), '');
+//
+// print('Parsing body symptoms...');
+// Map bodySymptomsData;
+// try {
+// bodySymptomsData = json.decode(bodyPart);
+// print('✅ Body symptoms parsed: ${bodySymptomsData.length} body parts');
+// } catch (e) {
+// print('❌ Error parsing body symptoms: $e');
+// exit(1);
+// }
+//
+// // Process SymptomsData
+// print('Processing symptoms data...');
+// var symptomsPart = parts[1]
+// .trim()
+// .replaceAll(RegExp(r'\];$'), '')
+// .replaceAllMapped(RegExp(r'\n(\s*)id:'), (m) => '\n${m.group(1)}"id":')
+// .replaceAllMapped(RegExp(r'\n(\s*)type:'), (m) => '\n${m.group(1)}"type":')
+// .replaceAllMapped(RegExp(r'\n(\s*)name:'), (m) => '\n${m.group(1)}"name":')
+// .replaceAllMapped(RegExp(r'\n(\s*)common_name:'), (m) => '\n${m.group(1)}"common_name":');
+//
+// print('Parsing symptoms...');
+// List symptomsData;
+// try {
+// symptomsData = json.decode('[$symptomsPart]');
+// print('✅ Symptoms parsed: ${symptomsData.length} symptoms');
+// } catch (e) {
+// print('❌ Error parsing symptoms: $e');
+// print('First 1000 chars:');
+// print('[$symptomsPart]'.substring(0, 1000));
+// exit(1);
+// }
+//
+// // Create final JSON
+// print('Creating final JSON structure...');
+// final jsonStructure = {
+// 'bodySymptoms': bodySymptomsData,
+// 'symptoms': symptomsData,
+// };
+//
+// // Write to file
+// print('Writing to file...');
+// final encoder = JsonEncoder.withIndent(' ');
+// await file.writeAsString(encoder.convert(jsonStructure));
+//
+// print('\n✅ SUCCESS! File converted to proper JSON');
+// print('✅ Body parts: ${bodySymptomsData.length}');
+// print('✅ Symptoms: ${symptomsData.length}');
+// }
+//
diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart
index 722a45e8..ba8f627a 100644
--- a/lib/core/api/api_client.dart
+++ b/lib/core/api/api_client.dart
@@ -189,6 +189,8 @@ class ApiClientImp implements ApiClient {
// body['SessionID'] = "45786230487560q";
}
+ // body['IsNewFlutterApp'] = true;
+
body.removeWhere((key, value) => value == null);
}
@@ -210,7 +212,7 @@ class ApiClientImp implements ApiClient {
final int statusCode = response.statusCode;
log("uri: ${Uri.parse(url.trim())}");
log("body: ${json.encode(body)}");
- log("response.body: ${response.body}");
+ // log("response.body: ${response.body}");
if (statusCode < 200 || statusCode >= 400) {
onFailure('Error While Fetching data', statusCode, failureType: StatusCodeFailure("Error While Fetching data"));
logApiEndpointError(endPoint, 'Error While Fetching data', statusCode);
diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart
index efefee18..f7153052 100644
--- a/lib/core/api_consts.dart
+++ b/lib/core/api_consts.dart
@@ -680,7 +680,7 @@ const DASHBOARD = 'Services/Patients.svc/REST/PatientDashboard';
class ApiConsts {
static const maxSmallScreen = 660;
- static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.prod;
+ static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.uat;
// static String baseUrl = 'https://uat.hmgwebservices.com/'; // HIS API URL UAT
@@ -841,7 +841,7 @@ class ApiConsts {
static final String getRiskFactors = '$symptomsCheckerApi/GetRiskFactors';
static final String getSuggestions = '$symptomsCheckerApi/GetSuggestion';
static final String diagnosis = '$symptomsCheckerApi/GetDiagnosis';
- static final String explain = '$symptomsCheckerApi/explain';
+ static final String explain = '$symptomsCheckerApi/ExplainDiagnosisResult';
//E-REFERRAL SERVICES
static final getAllRelationshipTypes = "Services/Patients.svc/REST/GetAllRelationshipTypes";
@@ -890,6 +890,10 @@ class ApiConsts {
static String getProjectsHaveBDClinics = "Services/OUTPs.svc/REST/BD_getProjectsHaveBDClinics";
static String getClinicsBDFreeSlots = "Services/OUTPs.svc/REST/BD_GetFreeSlots";
+
+ static String getPatientBloodGroup = "services/PatientVarification.svc/REST/BloodDonation_GetBloodGroupDetails";
+ static String getPatientBloodAgreement = "Services/PatientVarification.svc/REST/CheckUserAgreementForBloodDonation";
+
// ************ static values for Api ****************
static final double appVersionID = 50.3;
static final int appChannelId = 3;
diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart
index 26da9fae..35d48d69 100644
--- a/lib/core/app_assets.dart
+++ b/lib/core/app_assets.dart
@@ -183,6 +183,7 @@ class AppAssets {
static const String bulb_icon = '$svgBasePath/bulb_icon.svg';
static const String select_city_icon = '$svgBasePath/select_city_icon.svg';
static const String blood_donation_icon = '$svgBasePath/blood_donation_icon.svg';
+ static const String my_child_vaccine_icon = '$svgBasePath/my_child_vaccine.svg';
static const String virtual_tour_icon = '$svgBasePath/virtual_tour_icon.svg';
static const String car_parking_icon = '$svgBasePath/car_parking_icon.svg';
static const String latest_news_icon = '$svgBasePath/latest_news_icon.svg';
@@ -253,6 +254,7 @@ class AppAssets {
static const String homeBorderedIcon = '$svgBasePath/home_bordered.svg';
static const String symptomCheckerIcon = '$svgBasePath/symptom_checker_icon.svg';
static const String symptomCheckerBottomIcon = '$svgBasePath/symptom_bottom_icon.svg';
+ static const String coloredDotsIcon = '$svgBasePath/colored_dots_icon.svg';
// Water Monitor
static const String waterBottle = '$svgBasePath/water_bottle.svg';
@@ -305,6 +307,12 @@ class AppAssets {
static const String bloodPressure = '$svgBasePath/blood_pressure.svg';
static const String temperature = '$svgBasePath/temperature.svg';
+ static const String arLangIcon = '$svgBasePath/ar_lang_icon.svg';
+ static const String enLangIcon = '$svgBasePath/en_lang_icon.svg';
+
+ static const String doctorResponseIcon = '$svgBasePath/doctor_response_icon.svg';
+ static const String changeLanguageHomePageIcon = '$svgBasePath/change_language_home_page.svg';
+
// PNGS //
static const String hmgLogo = '$pngBasePath/hmg_logo.png';
static const String liveCareService = '$pngBasePath/livecare_service.png';
@@ -352,4 +360,3 @@ class AppAnimations {
static const String ambulanceAlert = '$lottieBasePath/ambulance_alert.json';
static const String rrtAmbulance = '$lottieBasePath/rrt_ambulance.json';
}
-
diff --git a/lib/core/dependencies.dart b/lib/core/dependencies.dart
index 44a8bde2..0560ff9e 100644
--- a/lib/core/dependencies.dart
+++ b/lib/core/dependencies.dart
@@ -4,6 +4,8 @@ import 'package:get_it/get_it.dart';
import 'package:hmg_patient_app_new/core/api/api_client.dart';
import 'package:hmg_patient_app_new/core/app_state.dart';
import 'package:hmg_patient_app_new/core/location_util.dart';
+import 'package:hmg_patient_app_new/features/ask_doctor/ask_doctor_repo.dart';
+import 'package:hmg_patient_app_new/features/ask_doctor/ask_doctor_view_model.dart';
import 'package:hmg_patient_app_new/features/authentication/authentication_repo.dart';
import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart';
import 'package:hmg_patient_app_new/features/blood_donation/blood_donation_repo.dart';
@@ -59,7 +61,7 @@ import 'package:hmg_patient_app_new/features/todo_section/todo_section_repo.dart
import 'package:hmg_patient_app_new/features/todo_section/todo_section_view_model.dart';
import 'package:hmg_patient_app_new/features/water_monitor/water_monitor_repo.dart';
import 'package:hmg_patient_app_new/features/water_monitor/water_monitor_view_model.dart';
-import 'package:hmg_patient_app_new/presentation/health_trackers/health_trackers_view_model.dart';
+import 'package:hmg_patient_app_new/features/health_trackers/health_trackers_view_model.dart';
import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart';
import 'package:hmg_patient_app_new/services/cache_service.dart';
import 'package:hmg_patient_app_new/services/dialog_service.dart';
@@ -166,6 +168,7 @@ class AppDependencies {
getIt.registerLazySingleton(() => MonthlyReportsRepoImp(loggerService: getIt(), apiClient: getIt()));
getIt.registerLazySingleton(() => QrParkingRepoImp(loggerService: getIt(), apiClient: getIt()));
getIt.registerLazySingleton(() => NotificationsRepoImp(loggerService: getIt(), apiClient: getIt()));
+ getIt.registerLazySingleton(() => AskDoctorRepoImp(loggerService: getIt(), apiClient: getIt()));
// ViewModels
// Global/shared VMs → LazySingleton
@@ -306,5 +309,7 @@ class AppDependencies {
),
);
+ getIt.registerLazySingleton(() => AskDoctorViewModel(askDoctorRepo: getIt(), errorHandlerService: getIt()));
+
}
}
diff --git a/lib/core/enums.dart b/lib/core/enums.dart
index 6dc3bf68..66137021 100644
--- a/lib/core/enums.dart
+++ b/lib/core/enums.dart
@@ -311,3 +311,150 @@ extension ServiceTypeEnumExt on ServiceTypeEnum {
enum PossibleConditionsSeverityEnum { seekMedicalAdvice, monitorOnly, emergency }
enum HealthTrackerTypeEnum { bloodSugar, bloodPressure, weightTracker }
+
+// Severity Enum
+enum SeverityEnum { mild, moderate, severe }
+
+extension SeverityEnumExtension on SeverityEnum {
+ int get toInt {
+ switch (this) {
+ case SeverityEnum.mild:
+ return 0;
+ case SeverityEnum.moderate:
+ return 1;
+ case SeverityEnum.severe:
+ return 2;
+ }
+ }
+
+ String get displayName {
+ AppState appState = getIt.get();
+ bool isArabic = appState.getLanguageID() == 1 ? true : false;
+ switch (this) {
+ case SeverityEnum.mild:
+ return isArabic ? 'خفيف' : 'Mild';
+ case SeverityEnum.moderate:
+ return isArabic ? 'متوسط' : 'Moderate';
+ case SeverityEnum.severe:
+ return isArabic ? 'شديد' : 'Severe';
+ }
+ }
+
+ static SeverityEnum? fromInt(int value) {
+ switch (value) {
+ case 0:
+ return SeverityEnum.mild;
+ case 1:
+ return SeverityEnum.moderate;
+ case 2:
+ return SeverityEnum.severe;
+ default:
+ return null;
+ }
+ }
+}
+
+// Triage Level Enum
+enum TriageLevelEnum { emergencyAmbulance, emergency, consultation24, consultation, selfCare }
+
+extension TriageLevelEnumExtension on TriageLevelEnum {
+ int get toInt {
+ switch (this) {
+ case TriageLevelEnum.emergencyAmbulance:
+ return 0;
+ case TriageLevelEnum.emergency:
+ return 1;
+ case TriageLevelEnum.consultation24:
+ return 2;
+ case TriageLevelEnum.consultation:
+ return 3;
+ case TriageLevelEnum.selfCare:
+ return 4;
+ }
+ }
+
+ String get displayName {
+ AppState appState = getIt.get();
+ bool isArabic = appState.getLanguageID() == 1 ? true : false;
+ switch (this) {
+ case TriageLevelEnum.emergencyAmbulance:
+ return isArabic ? 'طوارئ - إسعاف' : 'Emergency - Ambulance';
+ case TriageLevelEnum.emergency:
+ return isArabic ? 'طوارئ' : 'Emergency';
+ case TriageLevelEnum.consultation24:
+ return isArabic ? 'استشارة خلال 24 ساعة' : 'Consultation within 24 hours';
+ case TriageLevelEnum.consultation:
+ return isArabic ? 'استشارة' : 'Consultation';
+ case TriageLevelEnum.selfCare:
+ return isArabic ? 'رعاية ذاتية' : 'Self Care';
+ }
+ }
+
+ static TriageLevelEnum? fromInt(int value) {
+ switch (value) {
+ case 0:
+ return TriageLevelEnum.emergencyAmbulance;
+ case 1:
+ return TriageLevelEnum.emergency;
+ case 2:
+ return TriageLevelEnum.consultation24;
+ case 3:
+ return TriageLevelEnum.consultation;
+ case 4:
+ return TriageLevelEnum.selfCare;
+ default:
+ return null;
+ }
+ }
+}
+
+// Question Type Enum
+enum QuestionTypeEnum { single, groupSingle, groupMultiple, duration }
+
+extension QuestionTypeEnumExtension on QuestionTypeEnum {
+ int get toInt {
+ switch (this) {
+ case QuestionTypeEnum.single:
+ return 0;
+ case QuestionTypeEnum.groupSingle:
+ return 1;
+ case QuestionTypeEnum.groupMultiple:
+ return 2;
+ case QuestionTypeEnum.duration:
+ return 3;
+ }
+ }
+
+ String get displayName {
+ AppState appState = getIt.get();
+ bool isArabic = appState.getLanguageID() == 1 ? true : false;
+ switch (this) {
+ case QuestionTypeEnum.single:
+ return isArabic ? 'سؤال واحد' : 'Single';
+ case QuestionTypeEnum.groupSingle:
+ return isArabic ? 'مجموعة - اختيار واحد' : 'Group Single';
+ case QuestionTypeEnum.groupMultiple:
+ return isArabic ? 'مجموعة - اختيار متعدد' : 'Group Multiple';
+ case QuestionTypeEnum.duration:
+ return isArabic ? 'المدة' : 'Duration';
+ }
+ }
+
+ static QuestionTypeEnum? fromInt(int value) {
+ switch (value) {
+ case 0:
+ return QuestionTypeEnum.single;
+ case 1:
+ return QuestionTypeEnum.groupSingle;
+ case 2:
+ return QuestionTypeEnum.groupMultiple;
+ case 3:
+ return QuestionTypeEnum.duration;
+ default:
+ return null;
+ }
+ }
+}
+
+
+
diff --git a/lib/core/utils/utils.dart b/lib/core/utils/utils.dart
index e5b0ca43..59954385 100644
--- a/lib/core/utils/utils.dart
+++ b/lib/core/utils/utils.dart
@@ -814,7 +814,8 @@ class Utils {
child: Utils.buildSvgWithAssets(icon: AppAssets.saudi_riyal_icon, width: iconSize.h, height: iconSize.h, iconColor: iconColor),
),
TextSpan(
- text: NumberFormat.currency(locale: 'en_US', symbol: " ", decimalDigits: 0).format(habibWalletAmount),
+ // text: NumberFormat.currency(locale: 'en_US', symbol: " ", decimalDigits: 0).format(habibWalletAmount),
+ text: " ${habibWalletAmount.toStringAsFixed(2)}",
style: TextStyle(
color: textColor,
fontSize: fontSize ?? 32.f,
diff --git a/lib/features/ask_doctor/ask_doctor_repo.dart b/lib/features/ask_doctor/ask_doctor_repo.dart
new file mode 100644
index 00000000..4e4a4006
--- /dev/null
+++ b/lib/features/ask_doctor/ask_doctor_repo.dart
@@ -0,0 +1,128 @@
+import 'package:dartz/dartz.dart';
+import 'package:hmg_patient_app_new/core/api/api_client.dart';
+import 'package:hmg_patient_app_new/core/api_consts.dart';
+import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart';
+import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart';
+import 'package:hmg_patient_app_new/core/utils/date_util.dart';
+import 'package:hmg_patient_app_new/features/ask_doctor/models/ask_doctor_appointments_list.dart';
+import 'package:hmg_patient_app_new/features/ask_doctor/models/doctor_response_model.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/ask_doctor_request_type_response_model.dart';
+import 'package:hmg_patient_app_new/services/logger_service.dart';
+
+abstract class AskDoctorRepo {
+ Future>>> getAskDoctorAppointmentsList();
+
+ Future>>> getDoctorResponse({
+ required String fromDate,
+ });
+}
+
+class AskDoctorRepoImp implements AskDoctorRepo {
+ final ApiClient apiClient;
+ final LoggerService loggerService;
+
+ AskDoctorRepoImp({
+ required this.loggerService,
+ required this.apiClient,
+ });
+
+ @override
+ Future>>> getAskDoctorAppointmentsList() async {
+ Map mapDevice = {
+ "Top": 25,
+ "beforeDays": 15,
+ "exludType": 4,
+ };
+
+ try {
+ GenericApiModel>? apiResponse;
+ Failure? failure;
+ await apiClient.post(
+ IS_ALLOW_ASK_DOCTOR,
+ body: mapDevice,
+ onFailure: (error, statusCode, {messageStatus, failureType}) {
+ failure = failureType;
+ },
+ onSuccess: (response, statusCode, {messageStatus, errorMessage}) {
+ try {
+ final list = response['PatientDoctorAppointmentResultList'];
+
+ final clinicsList = list.map((item) => AskDoctorAppointmentHistoryList.fromJson(item as Map)).toList().cast();
+
+ apiResponse = GenericApiModel>(
+ messageStatus: messageStatus,
+ statusCode: statusCode,
+ errorMessage: null,
+ data: clinicsList,
+ );
+ } catch (e) {
+ failure = DataParsingFailure(e.toString());
+ }
+ },
+ );
+ if (failure != null) return Left(failure!);
+ if (apiResponse == null) return Left(ServerFailure("Unknown error"));
+ return Right(apiResponse!);
+ } catch (e) {
+ return Left(UnknownFailure(e.toString()));
+ }
+ }
+
+ @override
+ Future>>> getDoctorResponse({
+ required String fromDate,
+ }) async {
+ Map mapDevice = {
+ "isDentalAllowedBackend": false,
+ "from": fromDate,
+ };
+
+ try {
+ GenericApiModel>? apiResponse;
+ Failure? failure;
+ await apiClient.post(
+ GET_DOCTOR_RESPONSE,
+ body: mapDevice,
+ onFailure: (error, statusCode, {messageStatus, failureType}) {
+ failure = failureType;
+ },
+ onSuccess: (response, statusCode, {messageStatus, errorMessage}) {
+ try {
+ final list = response['List_DoctorResponse'];
+
+ if (list == null || list.isEmpty) {
+ // Return empty list if no responses
+ apiResponse = GenericApiModel>(
+ messageStatus: messageStatus,
+ statusCode: statusCode,
+ errorMessage: null,
+ data: [],
+ );
+ return;
+ }
+
+ final doctorResponsesList = list
+ .map((item) => DoctorResponseModel.fromJson(item as Map))
+ .toList()
+ .cast();
+
+ apiResponse = GenericApiModel>(
+ messageStatus: messageStatus,
+ statusCode: statusCode,
+ errorMessage: null,
+ data: doctorResponsesList,
+ );
+ } catch (e) {
+ failure = DataParsingFailure(e.toString());
+ }
+ },
+ );
+ if (failure != null) return Left(failure!);
+ if (apiResponse == null) return Left(ServerFailure("Unknown error"));
+ return Right(apiResponse!);
+ } catch (e) {
+ loggerService.logError("AskDoctorRepo.getDoctorResponse error: $e");
+ return Left(UnknownFailure(e.toString()));
+ }
+ }
+}
diff --git a/lib/features/ask_doctor/ask_doctor_view_model.dart b/lib/features/ask_doctor/ask_doctor_view_model.dart
new file mode 100644
index 00000000..2b9600e1
--- /dev/null
+++ b/lib/features/ask_doctor/ask_doctor_view_model.dart
@@ -0,0 +1,93 @@
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/utils/date_util.dart';
+import 'package:hmg_patient_app_new/features/ask_doctor/ask_doctor_repo.dart';
+import 'package:hmg_patient_app_new/features/ask_doctor/models/ask_doctor_appointments_list.dart';
+import 'package:hmg_patient_app_new/features/ask_doctor/models/doctor_response_model.dart';
+import 'package:hmg_patient_app_new/services/error_handler_service.dart';
+
+class AskDoctorViewModel extends ChangeNotifier {
+ final AskDoctorRepo askDoctorRepo;
+ final ErrorHandlerService errorHandlerService;
+
+ AskDoctorViewModel({
+ required this.askDoctorRepo,
+ required this.errorHandlerService,
+ });
+
+ bool isAskDoctorAppointmentsLoading = false;
+ bool isDoctorResponsesLoading = false;
+
+ List askDoctorAppointmentsList = [];
+ List doctorResponsesList = [];
+
+ /// Initialize the view model
+ void initAskDoctorViewModel() {
+ askDoctorAppointmentsList.clear();
+ doctorResponsesList.clear();
+ isAskDoctorAppointmentsLoading = true;
+ getAskDoctorAppointmentsList();
+ notifyListeners();
+ }
+
+ Future getAskDoctorAppointmentsList({Function(dynamic)? onSuccess, Function(String)? onError}) async {
+ final result = await askDoctorRepo.getAskDoctorAppointmentsList();
+
+ result.fold(
+ (failure) async => await errorHandlerService.handleError(failure: failure),
+ (apiResponse) {
+ if (apiResponse.messageStatus == 2) {
+ // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {});
+ } else if (apiResponse.messageStatus == 1) {
+ askDoctorAppointmentsList = apiResponse.data!;
+ isAskDoctorAppointmentsLoading = false;
+ notifyListeners();
+ if (onSuccess != null) {
+ onSuccess(apiResponse);
+ }
+ }
+ },
+ );
+ }
+
+ /// Get doctor responses from a specific date
+ Future getDoctorResponses({
+ String? fromDate,
+ Function(dynamic)? onSuccess,
+ Function(String)? onError,
+ }) async {
+ isDoctorResponsesLoading = true;
+ notifyListeners();
+
+ // If no date provided, use current date minus 30 days
+ final dateToUse = "${DateTime.now().year}-${DateTime.now().month}-${DateTime.now().day} ${DateTime.now().hour}:${DateTime.now().minute}:00";
+
+ final result = await askDoctorRepo.getDoctorResponse(fromDate: dateToUse);
+
+ result.fold(
+ (failure) async {
+ isDoctorResponsesLoading = false;
+ notifyListeners();
+ await errorHandlerService.handleError(failure: failure);
+ if (onError != null) {
+ onError(failure.toString());
+ }
+ },
+ (apiResponse) {
+ isDoctorResponsesLoading = false;
+
+ if (apiResponse.messageStatus == 2) {
+ notifyListeners();
+ if (onError != null) {
+ onError(apiResponse.errorMessage ?? "Unknown error");
+ }
+ } else if (apiResponse.messageStatus == 1) {
+ doctorResponsesList = apiResponse.data ?? [];
+ notifyListeners();
+ if (onSuccess != null) {
+ onSuccess(apiResponse);
+ }
+ }
+ },
+ );
+ }
+}
diff --git a/lib/features/ask_doctor/models/ask_doctor_appointments_list.dart b/lib/features/ask_doctor/models/ask_doctor_appointments_list.dart
new file mode 100644
index 00000000..7f40d71c
--- /dev/null
+++ b/lib/features/ask_doctor/models/ask_doctor_appointments_list.dart
@@ -0,0 +1,200 @@
+class AskDoctorAppointmentHistoryList {
+ String? setupID;
+ int? projectID;
+ int? appointmentNo;
+ String? appointmentDate;
+ bool? appointmentType;
+ String? bookDate;
+ bool? patientType;
+ int? patientID;
+ int? clinicID;
+ int? doctorID;
+ String? endDate;
+ String? startTime;
+ String? endTime;
+ bool? status;
+ bool? visitType;
+ bool? isReminderActivated;
+ int? companyID;
+ String? bookedOn;
+ String? confirmedOn;
+ String? arrivedOn;
+ String? editedOn;
+ int? appointmentDays;
+ int? isActive;
+ int? actualDoctorRate;
+ String? clinicName;
+ String? date;
+ num? decimalDoctorRate;
+ String? doctorCases;
+ String? doctorImageURL;
+ String? doctorInfo;
+ String? doctorName;
+ num? doctorRate;
+ num? doctorStarsRate;
+ String? doctorTitle;
+ int? gender;
+ String? genderDescription;
+ bool? isActiveDoctorProfile;
+ bool? isAppointmentAllowed;
+ bool? isDoctorAllowVedioCall;
+ bool? isLiveCareClinic;
+ String? nationalityFlagURL;
+ String? nationalityID;
+ String? nationalityName;
+ int? noOfPatientsRate;
+ String? projectName;
+ String? qR;
+ List? speciality;
+
+ AskDoctorAppointmentHistoryList(
+ {this.setupID,
+ this.projectID,
+ this.appointmentNo,
+ this.appointmentDate,
+ this.appointmentType,
+ this.bookDate,
+ this.patientType,
+ this.patientID,
+ this.clinicID,
+ this.doctorID,
+ this.endDate,
+ this.startTime,
+ this.endTime,
+ this.status,
+ this.visitType,
+ this.isReminderActivated,
+ this.companyID,
+ this.bookedOn,
+ this.confirmedOn,
+ this.arrivedOn,
+ this.editedOn,
+ this.appointmentDays,
+ this.isActive,
+ this.actualDoctorRate,
+ this.clinicName,
+ this.date,
+ this.decimalDoctorRate,
+ this.doctorCases,
+ this.doctorImageURL,
+ this.doctorInfo,
+ this.doctorName,
+ this.doctorRate,
+ this.doctorStarsRate,
+ this.doctorTitle,
+ this.gender,
+ this.genderDescription,
+ this.isActiveDoctorProfile,
+ this.isAppointmentAllowed,
+ this.isDoctorAllowVedioCall,
+ this.isLiveCareClinic,
+ this.nationalityFlagURL,
+ this.nationalityID,
+ this.nationalityName,
+ this.noOfPatientsRate,
+ this.projectName,
+ this.qR,
+ this.speciality});
+
+ AskDoctorAppointmentHistoryList.fromJson(Map json) {
+ setupID = json['SetupID'];
+ projectID = json['ProjectID'];
+ appointmentNo = json['AppointmentNo'];
+ appointmentDate = json['AppointmentDate'];
+ appointmentType = json['AppointmentType'];
+ bookDate = json['BookDate'];
+ patientType = json['PatientType'];
+ patientID = json['PatientID'];
+ clinicID = json['ClinicID'];
+ doctorID = json['DoctorID'];
+ endDate = json['EndDate'];
+ startTime = json['StartTime'];
+ endTime = json['EndTime'];
+ status = json['Status'];
+ visitType = json['VisitType'];
+ isReminderActivated = json['IsReminderActivated'];
+ companyID = json['CompanyID'];
+ bookedOn = json['BookedOn'];
+ confirmedOn = json['ConfirmedOn'];
+ arrivedOn = json['ArrivedOn'];
+ editedOn = json['EditedOn'];
+ appointmentDays = json['AppointmentDays'];
+ isActive = json['IsActive'];
+ actualDoctorRate = json['ActualDoctorRate'];
+ clinicName = json['ClinicName'];
+ date = json['Date'];
+ decimalDoctorRate = json['DecimalDoctorRate'];
+ doctorCases = json['DoctorCases'];
+ doctorImageURL = json['DoctorImageURL'];
+ doctorInfo = json['DoctorInfo'];
+ doctorName = json['DoctorName'];
+ doctorRate = json['DoctorRate'];
+ doctorStarsRate = json['DoctorStarsRate'];
+ doctorTitle = json['DoctorTitle'];
+ gender = json['Gender'];
+ genderDescription = json['GenderDescription'];
+ isActiveDoctorProfile = json['IsActiveDoctorProfile'];
+ isAppointmentAllowed = json['IsAppointmentAllowed'];
+ isDoctorAllowVedioCall = json['IsDoctorAllowVedioCall'];
+ isLiveCareClinic = json['IsLiveCareClinic'];
+ nationalityFlagURL = json['NationalityFlagURL'];
+ nationalityID = json['NationalityID'];
+ nationalityName = json['NationalityName'];
+ noOfPatientsRate = json['NoOfPatientsRate'];
+ projectName = json['ProjectName'];
+ qR = json['QR'];
+ speciality = json['Speciality'].cast();
+ }
+
+ Map toJson() {
+ final Map data = new Map();
+ data['SetupID'] = this.setupID;
+ data['ProjectID'] = this.projectID;
+ data['AppointmentNo'] = this.appointmentNo;
+ data['AppointmentDate'] = this.appointmentDate;
+ data['AppointmentType'] = this.appointmentType;
+ data['BookDate'] = this.bookDate;
+ data['PatientType'] = this.patientType;
+ data['PatientID'] = this.patientID;
+ data['ClinicID'] = this.clinicID;
+ data['DoctorID'] = this.doctorID;
+ data['EndDate'] = this.endDate;
+ data['StartTime'] = this.startTime;
+ data['EndTime'] = this.endTime;
+ data['Status'] = this.status;
+ data['VisitType'] = this.visitType;
+ data['IsReminderActivated'] = this.isReminderActivated;
+ data['CompanyID'] = this.companyID;
+ data['BookedOn'] = this.bookedOn;
+ data['ConfirmedOn'] = this.confirmedOn;
+ data['ArrivedOn'] = this.arrivedOn;
+ data['EditedOn'] = this.editedOn;
+ data['AppointmentDays'] = this.appointmentDays;
+ data['IsActive'] = this.isActive;
+ data['ActualDoctorRate'] = this.actualDoctorRate;
+ data['ClinicName'] = this.clinicName;
+ data['Date'] = this.date;
+ data['DecimalDoctorRate'] = this.decimalDoctorRate;
+ data['DoctorCases'] = this.doctorCases;
+ data['DoctorImageURL'] = this.doctorImageURL;
+ data['DoctorInfo'] = this.doctorInfo;
+ data['DoctorName'] = this.doctorName;
+ data['DoctorRate'] = this.doctorRate;
+ data['DoctorStarsRate'] = this.doctorStarsRate;
+ data['DoctorTitle'] = this.doctorTitle;
+ data['Gender'] = this.gender;
+ data['GenderDescription'] = this.genderDescription;
+ data['IsActiveDoctorProfile'] = this.isActiveDoctorProfile;
+ data['IsAppointmentAllowed'] = this.isAppointmentAllowed;
+ data['IsDoctorAllowVedioCall'] = this.isDoctorAllowVedioCall;
+ data['IsLiveCareClinic'] = this.isLiveCareClinic;
+ data['NationalityFlagURL'] = this.nationalityFlagURL;
+ data['NationalityID'] = this.nationalityID;
+ data['NationalityName'] = this.nationalityName;
+ data['NoOfPatientsRate'] = this.noOfPatientsRate;
+ data['ProjectName'] = this.projectName;
+ data['QR'] = this.qR;
+ data['Speciality'] = this.speciality;
+ return data;
+ }
+}
diff --git a/lib/features/ask_doctor/models/doctor_response_model.dart b/lib/features/ask_doctor/models/doctor_response_model.dart
new file mode 100644
index 00000000..b44ee0ac
--- /dev/null
+++ b/lib/features/ask_doctor/models/doctor_response_model.dart
@@ -0,0 +1,180 @@
+class DoctorResponseModel {
+ int? projectID;
+ int? transactionNo;
+ int? patientID;
+ int? doctorID;
+ int? requestType;
+ String? requestTypeDescription;
+ dynamic requestTypeDescriptionN;
+ int? status;
+ String? remarks;
+ String? createdOn;
+ int? readStatus;
+ String? doctorResponse;
+ dynamic clinicID;
+ dynamic clinicName;
+ int? createdBy;
+ String? doctorName;
+ dynamic infoStatusDescription;
+ bool? isDoctorRespond;
+ bool? isPatientRead;
+ dynamic memberName;
+ dynamic memberNameN;
+ dynamic patientDateofBirth;
+ dynamic patientGender;
+ dynamic patientMobileNumber;
+ dynamic patientName;
+ dynamic patientNameN;
+ dynamic projectName;
+ dynamic statusDescription;
+ List? transactions;
+
+ DoctorResponseModel(
+ {this.projectID,
+ this.transactionNo,
+ this.patientID,
+ this.doctorID,
+ this.requestType,
+ this.requestTypeDescription,
+ this.requestTypeDescriptionN,
+ this.status,
+ this.remarks,
+ this.createdOn,
+ this.readStatus,
+ this.doctorResponse,
+ this.clinicID,
+ this.clinicName,
+ this.createdBy,
+ this.doctorName,
+ this.infoStatusDescription,
+ this.isDoctorRespond,
+ this.isPatientRead,
+ this.memberName,
+ this.memberNameN,
+ this.patientDateofBirth,
+ this.patientGender,
+ this.patientMobileNumber,
+ this.patientName,
+ this.patientNameN,
+ this.projectName,
+ this.statusDescription,
+ this.transactions});
+
+ DoctorResponseModel.fromJson(Map json) {
+ projectID = json['ProjectID'];
+ transactionNo = json['TransactionNo'];
+ patientID = json['PatientID'];
+ doctorID = json['DoctorID'];
+ requestType = json['RequestType'];
+ requestTypeDescription = json['RequestTypeDescription'];
+ requestTypeDescriptionN = json['RequestTypeDescriptionN'];
+ status = json['Status'];
+ remarks = json['Remarks'];
+ createdOn = json['CreatedOn'];
+ readStatus = json['ReadStatus'];
+ doctorResponse = json['DoctorResponse'];
+ clinicID = json['ClinicID'];
+ clinicName = json['ClinicName'];
+ createdBy = json['CreatedBy'];
+ doctorName = json['DoctorName'];
+ infoStatusDescription = json['InfoStatusDescription'];
+ isDoctorRespond = json['IsDoctorRespond'];
+ isPatientRead = json['IsPatientRead'];
+ memberName = json['MemberName'];
+ memberNameN = json['MemberNameN'];
+ patientDateofBirth = json['PatientDateofBirth'];
+ patientGender = json['PatientGender'];
+ patientMobileNumber = json['PatientMobileNumber'];
+ patientName = json['PatientName'];
+ patientNameN = json['PatientNameN'];
+ projectName = json['ProjectName'];
+ statusDescription = json['StatusDescription'];
+ if (json['Transactions'] != null) {
+ transactions = [];
+ json['Transactions'].forEach((v) {
+ transactions!.add(new Transactions.fromJson(v));
+ });
+ }
+ }
+
+ Map toJson() {
+ final Map data = new Map();
+ data['ProjectID'] = this.projectID;
+ data['TransactionNo'] = this.transactionNo;
+ data['PatientID'] = this.patientID;
+ data['DoctorID'] = this.doctorID;
+ data['RequestType'] = this.requestType;
+ data['RequestTypeDescription'] = this.requestTypeDescription;
+ data['RequestTypeDescriptionN'] = this.requestTypeDescriptionN;
+ data['Status'] = this.status;
+ data['Remarks'] = this.remarks;
+ data['CreatedOn'] = this.createdOn;
+ data['ReadStatus'] = this.readStatus;
+ data['DoctorResponse'] = this.doctorResponse;
+ data['ClinicID'] = this.clinicID;
+ data['ClinicName'] = this.clinicName;
+ data['CreatedBy'] = this.createdBy;
+ data['DoctorName'] = this.doctorName;
+ data['InfoStatusDescription'] = this.infoStatusDescription;
+ data['IsDoctorRespond'] = this.isDoctorRespond;
+ data['IsPatientRead'] = this.isPatientRead;
+ data['MemberName'] = this.memberName;
+ data['MemberNameN'] = this.memberNameN;
+ data['PatientDateofBirth'] = this.patientDateofBirth;
+ data['PatientGender'] = this.patientGender;
+ data['PatientMobileNumber'] = this.patientMobileNumber;
+ data['PatientName'] = this.patientName;
+ data['PatientNameN'] = this.patientNameN;
+ data['ProjectName'] = this.projectName;
+ data['StatusDescription'] = this.statusDescription;
+ if (this.transactions != null) {
+ data['Transactions'] = this.transactions!.map((v) => v.toJson()).toList();
+ }
+ return data;
+ }
+}
+
+class Transactions {
+ int? lineItemNo;
+ String? doctorResponse;
+ int? infoEnteredBy;
+ String? infoEnteredOn;
+ String? createdOn;
+ int? infoStatus;
+ String? infoStatusDescription;
+ dynamic infoStatusDescriptionN;
+
+ Transactions(
+ {this.lineItemNo,
+ this.doctorResponse,
+ this.infoEnteredBy,
+ this.infoEnteredOn,
+ this.createdOn,
+ this.infoStatus,
+ this.infoStatusDescription,
+ this.infoStatusDescriptionN});
+
+ Transactions.fromJson(Map json) {
+ lineItemNo = json['LineItemNo'];
+ doctorResponse = json['DoctorResponse'];
+ infoEnteredBy = json['InfoEnteredBy'];
+ infoEnteredOn = json['InfoEnteredOn'];
+ createdOn = json['CreatedOn'];
+ infoStatus = json['InfoStatus'];
+ infoStatusDescription = json['InfoStatusDescription'];
+ infoStatusDescriptionN = json['InfoStatusDescriptionN'];
+ }
+
+ Map toJson() {
+ final Map data = new Map();
+ data['LineItemNo'] = this.lineItemNo;
+ data['DoctorResponse'] = this.doctorResponse;
+ data['InfoEnteredBy'] = this.infoEnteredBy;
+ data['InfoEnteredOn'] = this.infoEnteredOn;
+ data['CreatedOn'] = this.createdOn;
+ data['InfoStatus'] = this.infoStatus;
+ data['InfoStatusDescription'] = this.infoStatusDescription;
+ data['InfoStatusDescriptionN'] = this.infoStatusDescriptionN;
+ return data;
+ }
+}
diff --git a/lib/features/authentication/authentication_view_model.dart b/lib/features/authentication/authentication_view_model.dart
index 6379456e..f1182e05 100644
--- a/lib/features/authentication/authentication_view_model.dart
+++ b/lib/features/authentication/authentication_view_model.dart
@@ -462,7 +462,7 @@ class AuthenticationViewModel extends ChangeNotifier {
if (isSwitchUser && _appState.getSuperUserID == null) {
nationalIdController.text = responseID.toString();
- }else if( isSwitchUser && _appState.getSuperUserID != null){
+ } else if (isSwitchUser && _appState.getSuperUserID != null) {
nationalIdController.text = _appState.getSuperUserID.toString();
}
@@ -571,7 +571,7 @@ class AuthenticationViewModel extends ChangeNotifier {
MedicalFileViewModel medicalVm = getIt();
if (!_appState.getIsChildLoggedIn) {
await medicalVm.getFamilyFiles(status: 0);
- await medicalVm.getAllPendingRecordsByResponseId();
+ // await medicalVm.getAllPendingRecordsByResponseId();
_navigationService.replaceAllRoutesAndNavigateToLanding();
}
} else {
@@ -610,7 +610,7 @@ class AuthenticationViewModel extends ChangeNotifier {
MedicalFileViewModel medicalVm = getIt();
insertPatientIMEIData(loginTypeEnum.toInt);
medicalVm.getFamilyFiles(status: 0); //TODO: Remove status: 1 by Aamir Need to Discuss With Sultan
- medicalVm.getAllPendingRecordsByResponseId();
+ // medicalVm.getAllPendingRecordsByResponseId();
}
await clearDefaultInputValues();
if (isUserAgreedBefore) {
@@ -1078,4 +1078,30 @@ class AuthenticationViewModel extends ChangeNotifier {
return null;
}
}
+
+ Future logout() async {
+ try {
+ // Clear user data from AppState
+ _appState.setAuthenticatedUser(null);
+ _appState.setAuthenticatedUser(null, isFamily: true);
+ _appState.setIsAuthenticated = false;
+ _appState.setAppAuthToken = "";
+ _appState.setUserBloodGroup = "";
+ _appState.setSuperUserID = null;
+ _appState.setIsChildLoggedIn = false;
+ _appState.setFamilyFileTokenID = "";
+ _appState.setSelectDeviceByImeiRespModelElement(null);
+ _appState.setNHICUserData = CheckUserStatusResponseNHIC();
+ _appState.setUserRegistrationPayload = RegistrationDataModelPayload();
+ // Clear privilege lists
+ _appState.setPrivilegeModelList([]);
+ _appState.setVidaPlusProjectList([]);
+ _appState.setHMCProjectList([]);
+ _appState.setProjectsDetailList([]);
+ await clearDefaultInputValues();
+ _navigationService.pushAndReplace(AppRoutes.landingScreen);
+ } catch (e) {
+ _navigationService.pushAndReplace(AppRoutes.landingScreen);
+ }
+ }
}
diff --git a/lib/features/authentication/widgets/otp_verification_screen.dart b/lib/features/authentication/widgets/otp_verification_screen.dart
index e33222c0..7ddccda8 100644
--- a/lib/features/authentication/widgets/otp_verification_screen.dart
+++ b/lib/features/authentication/widgets/otp_verification_screen.dart
@@ -545,20 +545,20 @@ class _OTPVerificationScreenState extends State {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: 10.h),
- LocaleKeys.otpVerification.tr().toText24(isBold: true),
+ LocaleKeys.otpVerification.tr(context: context).toText24(isBold: true),
SizedBox(height: 20.h),
Wrap(
spacing: 2.h,
runSpacing: 2.h,
children: [
- LocaleKeys.weHaveSendOTP.tr().toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4),
+ LocaleKeys.weHaveSendOTP.tr(context: context).toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4),
_getMaskedPhoneNumber().toText15(color: AppColors.inputLabelTextColor, isBold: true),
- LocaleKeys.via.tr().toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4),
+ LocaleKeys.via.tr(context: context).toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4),
(widget.isFormFamilyFile ? LoginTypeEnum.sms.displayName : authVM.loginTypeEnum.displayName)
.toText15(color: AppColors.inputLabelTextColor, isBold: true, letterSpacing: -0.4),
appState.getUserRegistrationPayload.isRegister != null && appState.getUserRegistrationPayload.isRegister == true
- ? LocaleKeys.forRegistrationVerification.tr().toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4)
- : LocaleKeys.forLoginVerification.tr().toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4),
+ ? LocaleKeys.forRegistrationVerification.tr(context: context).toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4)
+ : LocaleKeys.forLoginVerification.tr(context: context).toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4),
],
),
@@ -590,7 +590,7 @@ class _OTPVerificationScreenState extends State {
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
- LocaleKeys.didntReceiveIt.tr().toText16(color: AppColors.inputLabelTextColor),
+ LocaleKeys.didntReceiveIt.tr(context: context).toText16(color: AppColors.inputLabelTextColor),
SizedBox(width: 5.h),
if (_resendTime > 0)
Builder(
@@ -599,7 +599,7 @@ class _OTPVerificationScreenState extends State {
final seconds = (_resendTime % 60).toString().padLeft(2, '0');
return Row(
children: [
- LocaleKeys.resendIn.tr().toText16(color: AppColors.inputLabelTextColor),
+ LocaleKeys.resendIn.tr(context: context).toText16(color: AppColors.inputLabelTextColor),
SizedBox(width: 2.h),
' ($minutes:$seconds). '.toText16(color: AppColors.inputLabelTextColor)
],
@@ -609,7 +609,7 @@ class _OTPVerificationScreenState extends State {
else
GestureDetector(
onTap: _resendOtp,
- child: LocaleKeys.resendOTP.tr().toText16(color: AppColors.primaryRedColor),
+ child: LocaleKeys.resendOTP.tr(context: context).toText16(color: AppColors.primaryRedColor),
),
],
),
diff --git a/lib/features/blood_donation/blood_donation_repo.dart b/lib/features/blood_donation/blood_donation_repo.dart
index 56436356..c709b038 100644
--- a/lib/features/blood_donation/blood_donation_repo.dart
+++ b/lib/features/blood_donation/blood_donation_repo.dart
@@ -23,6 +23,8 @@ abstract class BloodDonationRepo {
Future>> getFreeBloodDonationSlots({required Map request});
Future>> addUserAgreementForBloodDonation({required Map request});
+
+ Future>> getUserAgreementForBloodDonation();
}
class BloodDonationRepoImp implements BloodDonationRepo {
@@ -76,7 +78,7 @@ class BloodDonationRepoImp implements BloodDonationRepo {
GenericApiModel? apiResponse;
Failure? failure;
await apiClient.post(
- GET_BLOOD_REQUEST,
+ ApiConsts.getPatientBloodGroup,
body: mapDevice,
isAllowAny: true,
onFailure: (error, statusCode, {messageStatus, failureType}) {
@@ -287,4 +289,36 @@ class BloodDonationRepoImp implements BloodDonationRepo {
return Left(UnknownFailure(e.toString()));
}
}
+
+ @override
+ Future>>> getUserAgreementForBloodDonation() async {
+ try {
+ GenericApiModel>? apiResponse;
+ Failure? failure;
+ await apiClient.post(
+ ApiConsts.getPatientBloodAgreement,
+ body: {},
+ onFailure: (error, statusCode, {messageStatus, failureType}) {
+ failure = failureType;
+ },
+ onSuccess: (response, statusCode, {messageStatus, errorMessage}) {
+ try {
+ apiResponse = GenericApiModel>(
+ messageStatus: messageStatus,
+ statusCode: statusCode,
+ errorMessage: null,
+ data: response,
+ );
+ } catch (e) {
+ failure = DataParsingFailure(e.toString());
+ }
+ },
+ );
+ if (failure != null) return Left(failure!);
+ if (apiResponse == null) return Left(ServerFailure("Unknown error"));
+ return Right(apiResponse!);
+ } catch (e) {
+ return Left(UnknownFailure(e.toString()));
+ }
+ }
}
diff --git a/lib/features/blood_donation/blood_donation_view_model.dart b/lib/features/blood_donation/blood_donation_view_model.dart
index 8325cf78..8ad5bdec 100644
--- a/lib/features/blood_donation/blood_donation_view_model.dart
+++ b/lib/features/blood_donation/blood_donation_view_model.dart
@@ -4,6 +4,7 @@ import 'package:hmg_patient_app_new/core/app_state.dart';
import 'package:hmg_patient_app_new/core/dependencies.dart';
import 'package:hmg_patient_app_new/core/enums.dart';
import 'package:hmg_patient_app_new/core/utils/doctor_response_mapper.dart';
+import 'package:hmg_patient_app_new/core/utils/utils.dart';
import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart';
import 'package:hmg_patient_app_new/features/blood_donation/blood_donation_repo.dart';
@@ -233,7 +234,7 @@ class BloodDonationViewModel extends ChangeNotifier {
return false;
}
- if (selectedBloodGroup == null) {
+ if (selectedGender == null) {
await dialogService.showErrorBottomSheet(
message: "Please choose Gender",
);
@@ -258,29 +259,28 @@ class BloodDonationViewModel extends ChangeNotifier {
Future updateBloodGroup() async {
LoaderBottomSheet.showLoader();
- // body['City'] = detailsModel.city;
- // body['cityCode'] = detailsModel.cityCode;
- // body['Gender'] = detailsModel.gender;
- // body['BloodGroup'] = detailsModel.bloodGroup;
- // body['CellNumber'] = user.mobileNumber;
- // body['LanguageID'] = languageID;
- // body['NationalID'] = user.nationalityID;
- // body['ZipCode'] = user.zipCode ?? "+966";
- // body['isDentalAllowedBackend'] = false;
- Map payload = {
- "City": selectedCity?.description,
- "cityCode": selectedCity?.iD,
- "Gender": selectedGender?.value,
- "isDentalAllowedBackend": false
- // "Gender": selectedGender?.value,
- };
+ Map payload = {"City": selectedCity?.description, "cityCode": selectedCity?.iD, "Gender": selectedGender?.value, "isDentalAllowedBackend": false};
await bloodDonationRepo.updateBloodGroup(request: payload);
await addUserAgreementForBloodDonation();
LoaderBottomSheet.hideLoader();
+ dialogService.showSuccessBottomSheetWithoutH(message: "Blood Group Updated Successfully", onOkPressed: () {});
}
Future addUserAgreementForBloodDonation() async {
Map payload = {"IsAgreed": true};
await bloodDonationRepo.addUserAgreementForBloodDonation(request: payload);
}
+
+ Future getUserAgreementForBloodDonation() async {
+ await bloodDonationRepo.getUserAgreementForBloodDonation();
+ }
+
+ Future fetchAllData() async {
+ LoaderBottomSheet.showLoader(loadingText: "Fetching Data...");
+ await getRegionSelectedClinics();
+ if (isUserAuthanticated()) {
+ // await getPatientBloodGroupDetails();
+ }
+ LoaderBottomSheet.hideLoader();
+ }
}
diff --git a/lib/features/blood_donation/widgets/hospital_selection.dart b/lib/features/blood_donation/widgets/hospital_selection.dart
index c6065ae9..9889410c 100644
--- a/lib/features/blood_donation/widgets/hospital_selection.dart
+++ b/lib/features/blood_donation/widgets/hospital_selection.dart
@@ -15,8 +15,9 @@ import 'package:provider/provider.dart';
class HospitalBottomSheetBodySelection extends StatelessWidget {
final Function(BdGetProjectsHaveBdClinic userSelection) onUserHospitalSelection;
+ final bool isHideTitle;
- const HospitalBottomSheetBodySelection({super.key, required this.onUserHospitalSelection(BdGetProjectsHaveBdClinic userSelection)});
+ const HospitalBottomSheetBodySelection({super.key, required this.onUserHospitalSelection(BdGetProjectsHaveBdClinic userSelection), this.isHideTitle = false});
@override
Widget build(BuildContext context) {
@@ -25,7 +26,7 @@ class HospitalBottomSheetBodySelection extends StatelessWidget {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
- LocaleKeys.selectHospital.tr(context: context).toText16(weight: FontWeight.w500, color: AppColors.greyTextColor),
+ if(!isHideTitle) LocaleKeys.selectHospital.tr(context: context).toText16(weight: FontWeight.w500, color: AppColors.greyTextColor),
SizedBox(height: 16.h),
SizedBox(
height: MediaQuery.sizeOf(context).height * .4,
diff --git a/lib/presentation/health_trackers/health_trackers_view_model.dart b/lib/features/health_trackers/health_trackers_view_model.dart
similarity index 98%
rename from lib/presentation/health_trackers/health_trackers_view_model.dart
rename to lib/features/health_trackers/health_trackers_view_model.dart
index ce1bdf26..ab54f595 100644
--- a/lib/presentation/health_trackers/health_trackers_view_model.dart
+++ b/lib/features/health_trackers/health_trackers_view_model.dart
@@ -215,7 +215,8 @@ class HealthTrackersViewModel extends ChangeNotifier {
final averageResult = await healthTrackersRepo.getWeightMeasurementResultAverage();
averageResult.fold(
- (failure) => errorHandlerService.handleError(failure: failure),
+ // (failure) => errorHandlerService.handleError(failure: failure),
+ (failure) => {},
(apiModel) {
final data = apiModel.data;
if (data is Map) {
@@ -258,7 +259,8 @@ class HealthTrackersViewModel extends ChangeNotifier {
final resultsResponse = await healthTrackersRepo.getWeightMeasurementResults();
resultsResponse.fold(
- (failure) => errorHandlerService.handleError(failure: failure),
+ // (failure) => errorHandlerService.handleError(failure: failure),
+ (failure) => {},
(apiModel) {
final data = apiModel.data;
if (data is Map) {
@@ -435,7 +437,8 @@ class HealthTrackersViewModel extends ChangeNotifier {
final averageResult = await healthTrackersRepo.getBloodPressureResultAverage();
averageResult.fold(
- (failure) => errorHandlerService.handleError(failure: failure),
+ // (failure) => errorHandlerService.handleError(failure: failure),
+ (failure) => {},
(apiModel) {
final data = apiModel.data;
@@ -479,7 +482,8 @@ class HealthTrackersViewModel extends ChangeNotifier {
final resultsResponse = await healthTrackersRepo.getBloodPressureResults();
resultsResponse.fold(
- (failure) => errorHandlerService.handleError(failure: failure),
+ // (failure) => errorHandlerService.handleError(failure: failure),
+ (failure) => {},
(apiModel) {
final data = apiModel.data;
if (data is Map) {
@@ -636,7 +640,7 @@ class HealthTrackersViewModel extends ChangeNotifier {
final averageResult = await healthTrackersRepo.getDiabeticResultAverage();
averageResult.fold(
- (failure) => errorHandlerService.handleError(failure: failure),
+ (failure) {},
(apiModel) {
final data = apiModel.data;
if (data is Map) {
@@ -679,7 +683,8 @@ class HealthTrackersViewModel extends ChangeNotifier {
final resultsResponse = await healthTrackersRepo.getDiabeticResults();
resultsResponse.fold(
- (failure) => errorHandlerService.handleError(failure: failure),
+ // (failure) => errorHandlerService.handleError(failure: failure),
+ (failure) {},
(apiModel) {
final data = apiModel.data;
if (data is Map) {
diff --git a/lib/features/immediate_livecare/immediate_livecare_view_model.dart b/lib/features/immediate_livecare/immediate_livecare_view_model.dart
index 1baa81bd..ffa0b00b 100644
--- a/lib/features/immediate_livecare/immediate_livecare_view_model.dart
+++ b/lib/features/immediate_livecare/immediate_livecare_view_model.dart
@@ -45,9 +45,7 @@ class ImmediateLiveCareViewModel extends ChangeNotifier {
initImmediateLiveCare() {
_appState = getIt();
immediateLiveCareClinicsList = [];
- patientLiveCareHistoryList = [];
isImmediateLiveCareClinicsLoading = true;
- patientHasPendingLiveCareRequest = false;
liveCareSelectedCallType = 0; // 1- Video, 2- Audio, 3- Phone
immediateLiveCareSelectedClinic = GetLiveCareClinicListResponseModel();
liveCareImmediateAppointmentFeesList = LiveCareImmediateAppointmentFeesList();
@@ -136,6 +134,10 @@ class ImmediateLiveCareViewModel extends ChangeNotifier {
}
Future getPatientLiveCareHistory({Function(dynamic)? onSuccess, Function(String)? onError}) async {
+ patientLiveCareHistoryList = [];
+ patientHasPendingLiveCareRequest = false;
+ notifyListeners();
+
final result = await immediateLiveCareRepo.getPatientLiveCareHistory();
result.fold(
diff --git a/lib/features/medical_file/medical_file_view_model.dart b/lib/features/medical_file/medical_file_view_model.dart
index d67e5de8..17cbb94e 100644
--- a/lib/features/medical_file/medical_file_view_model.dart
+++ b/lib/features/medical_file/medical_file_view_model.dart
@@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import 'package:hmg_patient_app_new/core/app_state.dart';
import 'package:hmg_patient_app_new/core/dependencies.dart';
import 'package:hmg_patient_app_new/core/enums.dart';
+import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart';
import 'package:hmg_patient_app_new/core/utils/request_utils.dart';
import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart';
@@ -576,9 +577,18 @@ class MedicalFileViewModel extends ChangeNotifier {
await RequestUtils.getAddFamilyRequest(nationalIDorFile: authVM.nationalIdController.text, mobileNo: authVM.phoneNumberController.text, countryCode: authVM.selectedCountrySignup.countryCode);
final resultEither = await medicalFileRepo.addFamilyFile(request: request.toJson());
- resultEither.fold((failure) async => await errorHandlerService.handleError(failure: failure), (apiResponse) async {
+ resultEither.fold(
+ (failure) async => await errorHandlerService.handleError(
+ failure: failure,
+ onUnHandledFailure: (failure) {
+ LoaderBottomSheet.hideLoader();
+ _dialogService.showErrorBottomSheet(
+ message: failure.message!,
+ onOkPressed: () {
+ navigationService.pop();
+ });
+ }), (apiResponse) async {
if (apiResponse.messageStatus == 2) {
- print("=======");
LoaderBottomSheet.hideLoader();
_dialogService.showErrorBottomSheet(
message: apiResponse.errorMessage!,
diff --git a/lib/features/my_appointments/my_appointments_view_model.dart b/lib/features/my_appointments/my_appointments_view_model.dart
index 96340a7b..f2878037 100644
--- a/lib/features/my_appointments/my_appointments_view_model.dart
+++ b/lib/features/my_appointments/my_appointments_view_model.dart
@@ -220,6 +220,7 @@ class MyAppointmentsViewModel extends ChangeNotifier {
}
Future getPatientAppointments(bool isActiveAppointment, bool isArrivedAppointments, {Function(dynamic)? onSuccess, Function(String)? onError}) async {
+ isPatientHasQueueAppointment = false;
if (!isAppointmentDataToBeLoaded) return;
filteredAppointmentList.clear();
@@ -727,6 +728,7 @@ class MyAppointmentsViewModel extends ChangeNotifier {
Future getPatientAppointmentQueueDetails({Function(dynamic)? onSuccess, Function(String)? onError}) async {
//TODO: Discuss With Haroon, Is the User Has no data it return No Element Bad State;
+ isPatientHasQueueAppointment = false;
isAppointmentQueueDetailsLoading = true;
notifyListeners();
final result = await myAppointmentsRepo.getPatientAppointmentQueueDetails(
diff --git a/lib/features/my_appointments/utils/appointment_type.dart b/lib/features/my_appointments/utils/appointment_type.dart
index aa2ef383..ae3c7516 100644
--- a/lib/features/my_appointments/utils/appointment_type.dart
+++ b/lib/features/my_appointments/utils/appointment_type.dart
@@ -69,7 +69,7 @@ class AppointmentType {
case 10:
return AppColors.successColor;
case 15:
- return AppColors.greyColor;
+ return AppColors.greyTextColor;
case 20:
return AppColors.infoColor;
case 50:
diff --git a/lib/features/symptoms_checker/data/organ_mapping_data.dart b/lib/features/symptoms_checker/data/organ_mapping_data.dart
index 6b50b254..c338a94e 100644
--- a/lib/features/symptoms_checker/data/organ_mapping_data.dart
+++ b/lib/features/symptoms_checker/data/organ_mapping_data.dart
@@ -8,28 +8,36 @@ class OrganData {
OrganModel(
id: 'head',
name: 'whole_head',
+ nameAr: 'الرأس_كامل',
description: 'Head',
+ descriptionAr: 'الرأس',
bodyView: BodyView.front,
position: OrganPosition(x: 0.50, y: 0.03),
),
OrganModel(
id: 'left_eye',
name: 'eyes',
+ nameAr: 'العيون',
description: 'Left Eye',
+ descriptionAr: 'العين اليسرى',
bodyView: BodyView.front,
position: OrganPosition(x: 0.43, y: 0.07),
),
OrganModel(
id: 'right_eye',
name: 'eyes',
+ nameAr: 'العيون',
description: 'Right Eye',
+ descriptionAr: 'العين اليمنى',
bodyView: BodyView.front,
position: OrganPosition(x: 0.57, y: 0.07),
),
OrganModel(
id: 'nose_mouth',
name: 'oral_cavity',
+ nameAr: 'تجويف_الفم',
description: 'Nose/Mouth',
+ descriptionAr: 'الأنف/الفم',
bodyView: BodyView.front,
position: OrganPosition(x: 0.50, y: 0.09),
),
@@ -38,7 +46,9 @@ class OrganData {
OrganModel(
id: 'throat',
name: 'neck_or_throat',
+ nameAr: 'الرقبة_أو_الحلق',
description: 'Throat',
+ descriptionAr: 'الحلق',
bodyView: BodyView.front,
position: OrganPosition(x: 0.50, y: 0.15),
),
@@ -47,14 +57,18 @@ class OrganData {
OrganModel(
id: 'left_shoulder',
name: 'upper_arm',
+ nameAr: 'الذراع_العلوي',
description: 'Left Shoulder',
+ descriptionAr: 'الكتف الأيسر',
bodyView: BodyView.front,
position: OrganPosition(x: 0.22, y: 0.22),
),
OrganModel(
id: 'right_shoulder',
name: 'upper_arm',
+ nameAr: 'الذراع_العلوي',
description: 'Right Shoulder',
+ descriptionAr: 'الكتف الأيمن',
bodyView: BodyView.front,
position: OrganPosition(x: 0.8, y: 0.22),
),
@@ -63,21 +77,27 @@ class OrganData {
OrganModel(
id: 'left_chest',
name: 'chest',
+ nameAr: 'الصدر',
description: 'Left Chest',
+ descriptionAr: 'الصدر الأيسر',
bodyView: BodyView.front,
position: OrganPosition(x: 0.38, y: 0.22),
),
OrganModel(
id: 'center_chest',
name: 'chest',
+ nameAr: 'الصدر',
description: 'Center Chest',
+ descriptionAr: 'وسط الصدر',
bodyView: BodyView.front,
position: OrganPosition(x: 0.52, y: 0.25),
),
OrganModel(
id: 'right_chest',
name: 'chest',
+ nameAr: 'الصدر',
description: 'Right Chest',
+ descriptionAr: 'الصدر الأيمن',
bodyView: BodyView.front,
position: OrganPosition(x: 0.65, y: 0.22),
),
@@ -86,14 +106,18 @@ class OrganData {
OrganModel(
id: 'left_ribs',
name: 'chest',
+ nameAr: 'الصدر',
description: 'Left Ribs',
+ descriptionAr: 'الأضلاع اليسرى',
bodyView: BodyView.front,
position: OrganPosition(x: 0.38, y: 0.35),
),
OrganModel(
id: 'right_ribs',
name: 'chest',
+ nameAr: 'الصدر',
description: 'Right Ribs',
+ descriptionAr: 'الأضلاع اليمنى',
bodyView: BodyView.front,
position: OrganPosition(x: 0.64, y: 0.35),
),
@@ -102,21 +126,27 @@ class OrganData {
OrganModel(
id: 'upper_abdomen',
name: 'upper_abdomen',
+ nameAr: 'البطن_العلوي',
description: 'Upper Abdomen',
+ descriptionAr: 'أعلى البطن',
bodyView: BodyView.front,
position: OrganPosition(x: 0.51, y: 0.31),
),
OrganModel(
id: 'navel',
name: 'mid_abdomen',
+ nameAr: 'البطن_الأوسط',
description: 'Navel',
+ descriptionAr: 'السرة',
bodyView: BodyView.front,
position: OrganPosition(x: 0.51, y: 0.38),
),
OrganModel(
id: 'lower_abdomen',
name: 'lower_abdomen',
+ nameAr: 'البطن_السفلي',
description: 'Lower Abdomen',
+ descriptionAr: 'أسفل البطن',
bodyView: BodyView.front,
position: OrganPosition(x: 0.51, y: 0.44),
),
@@ -125,14 +155,18 @@ class OrganData {
OrganModel(
id: 'left_groin',
name: 'sexual_organs',
+ nameAr: 'الأعضاء_التناسلية',
description: 'Left Groin',
+ descriptionAr: 'الفخذ الأيسر',
bodyView: BodyView.front,
position: OrganPosition(x: 0.42, y: 0.49),
),
OrganModel(
id: 'right_groin',
name: 'sexual_organs',
+ nameAr: 'الأعضاء_التناسلية',
description: 'Right Groin',
+ descriptionAr: 'الفخذ الأيمن',
bodyView: BodyView.front,
position: OrganPosition(x: 0.59, y: 0.49),
),
@@ -142,21 +176,27 @@ class OrganData {
OrganModel(
id: 'left_elbow',
name: 'elbow',
+ nameAr: 'الكوع',
description: 'Left Elbow',
+ descriptionAr: 'الكوع الأيسر',
bodyView: BodyView.front,
position: OrganPosition(x: 0.21, y: 0.35),
),
OrganModel(
id: 'left_forearm',
name: 'forearm',
+ nameAr: 'الساعد',
description: 'Left Forearm',
+ descriptionAr: 'الساعد الأيسر',
bodyView: BodyView.front,
position: OrganPosition(x: 0.19, y: 0.43),
),
OrganModel(
id: 'left_wrist',
name: 'hand',
+ nameAr: 'اليد',
description: 'Left Wrist',
+ descriptionAr: 'المعصم الأيسر',
bodyView: BodyView.front,
position: OrganPosition(x: 0.14, y: 0.5),
),
@@ -166,21 +206,27 @@ class OrganData {
OrganModel(
id: 'right_elbow',
name: 'elbow',
+ nameAr: 'الكوع',
description: 'Right Elbow',
+ descriptionAr: 'الكوع الأيمن',
bodyView: BodyView.front,
position: OrganPosition(x: 0.79, y: 0.35),
),
OrganModel(
id: 'right_forearm',
name: 'forearm',
+ nameAr: 'الساعد',
description: 'Right Forearm',
+ descriptionAr: 'الساعد الأيمن',
bodyView: BodyView.front,
position: OrganPosition(x: 0.81, y: 0.43),
),
OrganModel(
id: 'right_wrist',
name: 'hand',
+ nameAr: 'اليد',
description: 'Right Wrist',
+ descriptionAr: 'المعصم الأيمن',
bodyView: BodyView.front,
position: OrganPosition(x: 0.85, y: 0.5),
),
@@ -189,28 +235,36 @@ class OrganData {
OrganModel(
id: 'left_thigh',
name: 'thigh',
+ nameAr: 'الفخذ',
description: 'Left Thigh',
+ descriptionAr: 'الفخذ الأيسر',
bodyView: BodyView.front,
position: OrganPosition(x: 0.4, y: 0.60),
),
OrganModel(
id: 'left_knee',
name: 'knee',
+ nameAr: 'الركبة',
description: 'Left Knee',
+ descriptionAr: 'الركبة اليسرى',
bodyView: BodyView.front,
position: OrganPosition(x: 0.4, y: 0.72),
),
OrganModel(
id: 'left_shin',
name: 'lower_leg',
+ nameAr: 'الساق_السفلي',
description: 'Left Shin',
+ descriptionAr: 'الساق اليسرى',
bodyView: BodyView.front,
position: OrganPosition(x: 0.41, y: 0.82),
),
OrganModel(
id: 'left_ankle',
name: 'foot',
+ nameAr: 'القدم',
description: 'Left Ankle',
+ descriptionAr: 'الكاحل الأيسر',
bodyView: BodyView.front,
position: OrganPosition(x: 0.43, y: 0.91),
),
@@ -219,28 +273,36 @@ class OrganData {
OrganModel(
id: 'right_thigh',
name: 'thigh',
+ nameAr: 'الفخذ',
description: 'Right Thigh',
+ descriptionAr: 'الفخذ الأيمن',
bodyView: BodyView.front,
position: OrganPosition(x: 0.65, y: 0.60),
),
OrganModel(
id: 'right_knee',
name: 'knee',
+ nameAr: 'الركبة',
description: 'Right Knee',
+ descriptionAr: 'الركبة اليمنى',
bodyView: BodyView.front,
position: OrganPosition(x: 0.6, y: 0.72),
),
OrganModel(
id: 'right_shin',
name: 'lower_leg',
+ nameAr: 'الساق_السفلي',
description: 'Right Shin',
+ descriptionAr: 'الساق اليمنى',
bodyView: BodyView.front,
position: OrganPosition(x: 0.57, y: 0.82),
),
OrganModel(
id: 'right_ankle',
name: 'foot',
+ nameAr: 'القدم',
description: 'Right Ankle',
+ descriptionAr: 'الكاحل الأيمن',
bodyView: BodyView.front,
position: OrganPosition(x: 0.57, y: 0.91),
),
@@ -252,14 +314,18 @@ class OrganData {
OrganModel(
id: 'back_of_head',
name: 'whole_head',
+ nameAr: 'الرأس_كامل',
description: 'Back of Head',
+ descriptionAr: 'مؤخرة الرأس',
bodyView: BodyView.back,
position: OrganPosition(x: 0.50, y: 0.04),
),
OrganModel(
id: 'neck_back',
name: 'nape_of_neck',
+ nameAr: 'مؤخرة_الرقبة',
description: 'Neck',
+ descriptionAr: 'الرقبة',
bodyView: BodyView.back,
position: OrganPosition(x: 0.50, y: 0.14),
),
@@ -268,14 +334,18 @@ class OrganData {
OrganModel(
id: 'left_shoulder_back',
name: 'upper_arm',
+ nameAr: 'الذراع_العلوي',
description: 'Left Shoulder',
+ descriptionAr: 'الكتف الأيسر',
bodyView: BodyView.back,
position: OrganPosition(x: 0.33, y: 0.19),
),
OrganModel(
id: 'right_shoulder_back',
name: 'upper_arm',
+ nameAr: 'الذراع_العلوي',
description: 'Right Shoulder',
+ descriptionAr: 'الكتف الأيمن',
bodyView: BodyView.back,
position: OrganPosition(x: 0.67, y: 0.19),
),
@@ -284,21 +354,27 @@ class OrganData {
OrganModel(
id: 'upper_spine',
name: 'back',
+ nameAr: 'الظهر',
description: 'Upper Spine',
+ descriptionAr: 'العمود الفقري العلوي',
bodyView: BodyView.back,
position: OrganPosition(x: 0.50, y: 0.23),
),
OrganModel(
id: 'left_upper_back',
name: 'back',
+ nameAr: 'الظهر',
description: 'Left Upper Back',
+ descriptionAr: 'أعلى الظهر الأيسر',
bodyView: BodyView.back,
position: OrganPosition(x: 0.38, y: 0.28),
),
OrganModel(
id: 'right_upper_back',
name: 'back',
+ nameAr: 'الظهر',
description: 'Right Upper Back',
+ descriptionAr: 'أعلى الظهر الأيمن',
bodyView: BodyView.back,
position: OrganPosition(x: 0.62, y: 0.28),
),
@@ -307,21 +383,27 @@ class OrganData {
OrganModel(
id: 'mid_spine',
name: 'back',
+ nameAr: 'الظهر',
description: 'Mid Spine',
+ descriptionAr: 'العمود الفقري الأوسط',
bodyView: BodyView.back,
position: OrganPosition(x: 0.50, y: 0.35),
),
OrganModel(
id: 'left_mid_back',
name: 'back',
+ nameAr: 'الظهر',
description: 'Left Mid Back',
+ descriptionAr: 'وسط الظهر الأيسر',
bodyView: BodyView.back,
position: OrganPosition(x: 0.38, y: 0.35),
),
OrganModel(
id: 'right_mid_back',
name: 'back',
+ nameAr: 'الظهر',
description: 'Right Mid Back',
+ descriptionAr: 'وسط الظهر الأيمن',
bodyView: BodyView.back,
position: OrganPosition(x: 0.62, y: 0.35),
),
@@ -330,21 +412,27 @@ class OrganData {
OrganModel(
id: 'lower_spine',
name: 'lower_back',
+ nameAr: 'أسفل_الظهر',
description: 'Lower Back',
+ descriptionAr: 'أسفل الظهر',
bodyView: BodyView.back,
position: OrganPosition(x: 0.50, y: 0.43),
),
OrganModel(
id: 'left_lower_back',
name: 'lower_back',
+ nameAr: 'أسفل_الظهر',
description: 'Left Lower Back',
+ descriptionAr: 'أسفل الظهر الأيسر',
bodyView: BodyView.back,
position: OrganPosition(x: 0.40, y: 0.43),
),
OrganModel(
id: 'right_lower_back',
name: 'lower_back',
+ nameAr: 'أسفل_الظهر',
description: 'Right Lower Back',
+ descriptionAr: 'أسفل الظهر الأيمن',
bodyView: BodyView.back,
position: OrganPosition(x: 0.60, y: 0.43),
),
@@ -353,21 +441,27 @@ class OrganData {
OrganModel(
id: 'sacrum',
name: 'lower_back',
+ nameAr: 'أسفل_الظهر',
description: 'Sacrum',
+ descriptionAr: 'العجز',
bodyView: BodyView.back,
position: OrganPosition(x: 0.50, y: 0.52),
),
OrganModel(
id: 'left_glute',
name: 'buttocks',
+ nameAr: 'الأرداف',
description: 'Left Glute',
+ descriptionAr: 'الأرداف اليسرى',
bodyView: BodyView.back,
position: OrganPosition(x: 0.45, y: 0.56),
),
OrganModel(
id: 'right_glute',
name: 'buttocks',
+ nameAr: 'الأرداف',
description: 'Right Glute',
+ descriptionAr: 'الأرداف اليمنى',
bodyView: BodyView.back,
position: OrganPosition(x: 0.55, y: 0.56),
),
@@ -376,28 +470,36 @@ class OrganData {
OrganModel(
id: 'left_hamstring',
name: 'thigh',
+ nameAr: 'الفخذ',
description: 'Left Hamstring',
+ descriptionAr: 'عضلة الفخذ الخلفية اليسرى',
bodyView: BodyView.back,
position: OrganPosition(x: 0.43, y: 0.65),
),
OrganModel(
id: 'right_hamstring',
name: 'thigh',
+ nameAr: 'الفخذ',
description: 'Right Hamstring',
+ descriptionAr: 'عضلة الفخذ الخلفية اليمنى',
bodyView: BodyView.back,
position: OrganPosition(x: 0.57, y: 0.65),
),
OrganModel(
id: 'left_calf',
name: 'lower_leg',
+ nameAr: 'الساق_السفلي',
description: 'Left Calf',
+ descriptionAr: 'ربلة الساق اليسرى',
bodyView: BodyView.back,
position: OrganPosition(x: 0.43, y: 0.79),
),
OrganModel(
id: 'right_calf',
name: 'lower_leg',
+ nameAr: 'الساق_السفلي',
description: 'Right Calf',
+ descriptionAr: 'ربلة الساق اليمنى',
bodyView: BodyView.back,
position: OrganPosition(x: 0.57, y: 0.79),
),
diff --git a/lib/features/symptoms_checker/models/conditions_model.dart b/lib/features/symptoms_checker/models/conditions_model.dart
index 774d8c38..af66c215 100644
--- a/lib/features/symptoms_checker/models/conditions_model.dart
+++ b/lib/features/symptoms_checker/models/conditions_model.dart
@@ -1,97 +1,97 @@
-import 'package:flutter/material.dart';
-import 'package:hmg_patient_app_new/core/enums.dart';
-
-class ConditionsModel {
- final IconData icon;
- final String title;
- final int percentage;
- final String tagText;
- final String clinic;
- final List symptoms;
- final String description;
- final String? monitorNote;
- final String? appointmentLabel;
- final PossibleConditionsSeverityEnum possibleConditionsSeverityEnum;
-
- ConditionsModel({
- required this.icon,
- required this.title,
- required this.percentage,
- required this.tagText,
- required this.clinic,
- required this.symptoms,
- required this.description,
- required this.possibleConditionsSeverityEnum,
- this.monitorNote,
- this.appointmentLabel,
- });
-}
-
-List dummyConditions = [
- ConditionsModel(
- icon: Icons.psychology_alt,
- possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.seekMedicalAdvice,
- title: "Migraine",
- percentage: 87,
- tagText: "Seek Medical Advice",
- clinic: "Internal Medicine Clinic",
- symptoms: ["Headache", "Nausea", "Sensitivity to light"],
- description: "A migraine is a type of headache that can cause severe throbbing pain, usually on one side of the head.",
- appointmentLabel: "Book Appointment",
- ),
- ConditionsModel(
- icon: Icons.deblur,
- title: "Tension Headache",
- percentage: 37,
- tagText: "Monitor",
- monitorNote: "No need to visit doctor",
- clinic: "GP Clinic",
- symptoms: ["Mild head pressure", "Scalp tenderness"],
- description: "A tension-type headache is generally a mild to moderate pain that feels like a tight band around your head.",
- possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.monitorOnly,
- ),
- ConditionsModel(
- icon: Icons.medication_liquid,
- title: "Meningitis",
- percentage: 28,
- tagText: "Emergency",
- clinic: "Neurology Clinic",
- symptoms: ["Mild head pressure", "Scalp tenderness"],
- description: "A tension-type headache is generally a mild to moderate pain that feels like a tight band around your head.",
- appointmentLabel: "Book Appointment",
- possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.emergency,
- ),
- ConditionsModel(
- icon: Icons.psychology_alt,
- title: "Migraine",
- percentage: 87,
- tagText: "Seek Medical Advice",
- clinic: "Internal Medicine Clinic",
- symptoms: ["Headache", "Nausea", "Sensitivity to light"],
- description: "A migraine is a type of headache that can cause severe throbbing pain, usually on one side of the head.",
- appointmentLabel: "Book Appointment",
- possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.seekMedicalAdvice,
- ),
- ConditionsModel(
- icon: Icons.deblur,
- title: "Tension Headache",
- percentage: 37,
- tagText: "Monitor",
- monitorNote: "No need to visit doctor",
- clinic: "GP Clinic",
- symptoms: ["Mild head pressure", "Scalp tenderness"],
- description: "A tension-type headache is generally a mild to moderate pain that feels like a tight band around your head.",
- possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.monitorOnly,
- ),
- ConditionsModel(
- icon: Icons.medication_liquid,
- title: "Meningitis",
- percentage: 28,
- tagText: "Emergency",
- clinic: "Neurology Clinic",
- symptoms: ["Mild head pressure", "Scalp tenderness"],
- description: "A tension-type headache is generally a mild to moderate pain that feels like a tight band around your head.",
- appointmentLabel: "Book Appointment",
- possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.emergency,
- ),
-];
+// import 'package:flutter/material.dart';
+// import 'package:hmg_patient_app_new/core/enums.dart';
+//
+// class ConditionsModel {
+// final IconData icon;
+// final String title;
+// final int percentage;
+// final String tagText;
+// final String clinic;
+// final List symptoms;
+// final String description;
+// final String? monitorNote;
+// final String? appointmentLabel;
+// final PossibleConditionsSeverityEnum possibleConditionsSeverityEnum;
+//
+// ConditionsModel({
+// required this.icon,
+// required this.title,
+// required this.percentage,
+// required this.tagText,
+// required this.clinic,
+// required this.symptoms,
+// required this.description,
+// required this.possibleConditionsSeverityEnum,
+// this.monitorNote,
+// this.appointmentLabel,
+// });
+// }
+//
+// List dummyConditions = [
+// ConditionsModel(
+// icon: Icons.psychology_alt,
+// possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.seekMedicalAdvice,
+// title: "Migraine",
+// percentage: 87,
+// tagText: "Seek Medical Advice",
+// clinic: "Internal Medicine Clinic",
+// symptoms: ["Headache", "Nausea", "Sensitivity to light"],
+// description: "A migraine is a type of headache that can cause severe throbbing pain, usually on one side of the head.",
+// appointmentLabel: "Book Appointment",
+// ),
+// ConditionsModel(
+// icon: Icons.deblur,
+// title: "Tension Headache",
+// percentage: 37,
+// tagText: "Monitor",
+// monitorNote: "No need to visit doctor",
+// clinic: "GP Clinic",
+// symptoms: ["Mild head pressure", "Scalp tenderness"],
+// description: "A tension-type headache is generally a mild to moderate pain that feels like a tight band around your head.",
+// possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.monitorOnly,
+// ),
+// ConditionsModel(
+// icon: Icons.medication_liquid,
+// title: "Meningitis",
+// percentage: 28,
+// tagText: "Emergency",
+// clinic: "Neurology Clinic",
+// symptoms: ["Mild head pressure", "Scalp tenderness"],
+// description: "A tension-type headache is generally a mild to moderate pain that feels like a tight band around your head.",
+// appointmentLabel: "Book Appointment",
+// possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.emergency,
+// ),
+// ConditionsModel(
+// icon: Icons.psychology_alt,
+// title: "Migraine",
+// percentage: 87,
+// tagText: "Seek Medical Advice",
+// clinic: "Internal Medicine Clinic",
+// symptoms: ["Headache", "Nausea", "Sensitivity to light"],
+// description: "A migraine is a type of headache that can cause severe throbbing pain, usually on one side of the head.",
+// appointmentLabel: "Book Appointment",
+// possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.seekMedicalAdvice,
+// ),
+// ConditionsModel(
+// icon: Icons.deblur,
+// title: "Tension Headache",
+// percentage: 37,
+// tagText: "Monitor",
+// monitorNote: "No need to visit doctor",
+// clinic: "GP Clinic",
+// symptoms: ["Mild head pressure", "Scalp tenderness"],
+// description: "A tension-type headache is generally a mild to moderate pain that feels like a tight band around your head.",
+// possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.monitorOnly,
+// ),
+// ConditionsModel(
+// icon: Icons.medication_liquid,
+// title: "Meningitis",
+// percentage: 28,
+// tagText: "Emergency",
+// clinic: "Neurology Clinic",
+// symptoms: ["Mild head pressure", "Scalp tenderness"],
+// description: "A tension-type headache is generally a mild to moderate pain that feels like a tight band around your head.",
+// appointmentLabel: "Book Appointment",
+// possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.emergency,
+// ),
+// ];
diff --git a/lib/features/symptoms_checker/models/organ_model.dart b/lib/features/symptoms_checker/models/organ_model.dart
index fab7dffd..9a871f39 100644
--- a/lib/features/symptoms_checker/models/organ_model.dart
+++ b/lib/features/symptoms_checker/models/organ_model.dart
@@ -3,29 +3,47 @@ import 'package:hmg_patient_app_new/core/enums.dart';
class OrganModel {
final String id;
final String name;
+ final String nameAr;
final String description;
+ final String descriptionAr;
final BodyView bodyView;
final OrganPosition position;
const OrganModel({
required this.id,
required this.name,
+ required this.nameAr,
required this.description,
+ required this.descriptionAr,
required this.bodyView,
required this.position,
});
+ /// Get localized name based on isArabic flag
+ String getLocalizedName(bool isArabic) {
+ return isArabic ? nameAr : name;
+ }
+
+ /// Get localized description based on isArabic flag
+ String getLocalizedDescription(bool isArabic) {
+ return isArabic ? descriptionAr : description;
+ }
+
OrganModel copyWith({
String? id,
String? name,
+ String? nameAr,
String? description,
+ String? descriptionAr,
BodyView? bodyView,
OrganPosition? position,
}) {
return OrganModel(
id: id ?? this.id,
name: name ?? this.name,
+ nameAr: nameAr ?? this.nameAr,
description: description ?? this.description,
+ descriptionAr: descriptionAr ?? this.descriptionAr,
bodyView: bodyView ?? this.bodyView,
position: position ?? this.position,
);
diff --git a/lib/features/symptoms_checker/models/resp_models/risk_and_suggestions_response_model.dart b/lib/features/symptoms_checker/models/resp_models/risk_and_suggestions_response_model.dart
index b2be4a27..9928d786 100644
--- a/lib/features/symptoms_checker/models/resp_models/risk_and_suggestions_response_model.dart
+++ b/lib/features/symptoms_checker/models/resp_models/risk_and_suggestions_response_model.dart
@@ -22,6 +22,8 @@ class RiskAndSuggestionsItemModel {
final String? type;
final String? name;
final String? commonName;
+ final String? nameAr;
+ final String? commonNameAr;
final String? language;
RiskAndSuggestionsItemModel({
@@ -29,6 +31,8 @@ class RiskAndSuggestionsItemModel {
this.type,
this.name,
this.commonName,
+ this.nameAr,
+ this.commonNameAr,
this.language,
});
@@ -38,6 +42,8 @@ class RiskAndSuggestionsItemModel {
type: json['type'],
name: json['name'],
commonName: json['common_name'],
+ nameAr: json['nameAr'],
+ commonNameAr: json['common_nameAr'],
language: json['language'],
);
}
@@ -48,12 +54,17 @@ class RiskAndSuggestionsItemModel {
'type': type,
'name': name,
'common_name': commonName,
+ 'nameAr': nameAr,
+ 'common_nameAr': commonNameAr,
'language': language,
};
}
- // Helper method to get display name
- String getDisplayName() {
+ // Helper method to get display name based on locale
+ String getDisplayName({bool isArabic = false}) {
+ if (isArabic) {
+ return commonNameAr ?? nameAr ?? commonName ?? name ?? '';
+ }
return commonName ?? name ?? '';
}
}
diff --git a/lib/features/symptoms_checker/models/resp_models/triage_response_model.dart b/lib/features/symptoms_checker/models/resp_models/triage_response_model.dart
index f0d7e904..da0f4b67 100644
--- a/lib/features/symptoms_checker/models/resp_models/triage_response_model.dart
+++ b/lib/features/symptoms_checker/models/resp_models/triage_response_model.dart
@@ -1,3 +1,5 @@
+import 'package:hmg_patient_app_new/core/enums.dart';
+
class TriageDataDetails {
final TriageQuestion? question;
final List? conditions;
@@ -170,13 +172,17 @@ class TriageCondition {
final String? id;
final String? name;
final String? commonName;
+ final String? nameAr;
+ final String? commonNameAr;
final double? probability;
- final dynamic conditionDetails;
+ final ConditionDetails? conditionDetails;
TriageCondition({
this.id,
this.name,
this.commonName,
+ this.nameAr,
+ this.commonNameAr,
this.probability,
this.conditionDetails,
});
@@ -186,8 +192,10 @@ class TriageCondition {
id: json['id'],
name: json['name'],
commonName: json['common_name'],
+ nameAr: json['nameAr'],
+ commonNameAr: json['common_nameAr'],
probability: json['probability']?.toDouble(),
- conditionDetails: json['condition_details'],
+ conditionDetails: json['condition_details'] != null ? ConditionDetails.fromJson(json['condition_details']) : null,
);
}
@@ -196,14 +204,96 @@ class TriageCondition {
'id': id,
'name': name,
'common_name': commonName,
+ 'nameAr': nameAr,
+ 'common_nameAr': commonNameAr,
'probability': probability,
- 'condition_details': conditionDetails,
+ 'condition_details': conditionDetails?.toJson(),
};
}
+ /// Get display name based on locale
+ String getDisplayName({bool isArabic = false}) {
+ if (isArabic) {
+ return commonNameAr ?? nameAr ?? commonName ?? name ?? '';
+ }
+ return commonName ?? name ?? '';
+ }
+
/// Get probability as percentage
String getProbabilityPercentage() {
if (probability == null) return '0%';
return '${(probability! * 100).toStringAsFixed(1)}%';
}
}
+
+class ConditionDetails {
+ final String? icd10Code;
+ final ConditionCategory? category;
+ final SeverityEnum? severity;
+ final TriageLevelEnum? triageLevel;
+ final String? hint;
+ final bool? hasPatientEducation;
+ final String? prevalence;
+ final String? acuteness;
+
+ ConditionDetails({
+ this.icd10Code,
+ this.category,
+ this.severity,
+ this.triageLevel,
+ this.hint,
+ this.hasPatientEducation,
+ this.prevalence,
+ this.acuteness,
+ });
+
+ factory ConditionDetails.fromJson(Map json) {
+ return ConditionDetails(
+ icd10Code: json['icd10_code'],
+ category: json['category'] != null ? ConditionCategory.fromJson(json['category']) : null,
+ severity: json['severity'] != null ? SeverityEnumExtension.fromInt(json['severity']) : null,
+ triageLevel: json['triage_level'] != null ? TriageLevelEnumExtension.fromInt(json['triage_level']) : null,
+ hint: json['hint'],
+ hasPatientEducation: json['has_patient_education'],
+ prevalence: json['prevalence'],
+ acuteness: json['acuteness'],
+ );
+ }
+
+ Map toJson() {
+ return {
+ 'icd10_code': icd10Code,
+ 'category': category?.toJson(),
+ 'severity': severity?.toInt,
+ 'triage_level': triageLevel?.toInt,
+ 'hint': hint,
+ 'has_patient_education': hasPatientEducation,
+ 'prevalence': prevalence,
+ 'acuteness': acuteness,
+ };
+ }
+}
+
+class ConditionCategory {
+ final String? id;
+ final String? name;
+
+ ConditionCategory({
+ this.id,
+ this.name,
+ });
+
+ factory ConditionCategory.fromJson(Map json) {
+ return ConditionCategory(
+ id: json['id'],
+ name: json['name'],
+ );
+ }
+
+ Map toJson() {
+ return {
+ 'id': id,
+ 'name': name,
+ };
+ }
+}
diff --git a/lib/features/symptoms_checker/symptoms_checker_repo.dart b/lib/features/symptoms_checker/symptoms_checker_repo.dart
index c55c2f0c..c0214e18 100644
--- a/lib/features/symptoms_checker/symptoms_checker_repo.dart
+++ b/lib/features/symptoms_checker/symptoms_checker_repo.dart
@@ -12,50 +12,42 @@ import 'package:hmg_patient_app_new/features/symptoms_checker/models/resp_models
import 'package:hmg_patient_app_new/services/logger_service.dart';
abstract class SymptomsCheckerRepo {
- Future>>
- getUserDetails({
+ Future>> getUserDetails({
required String userName,
required String password,
});
- Future>>
- getBodySymptomsByName({
+ Future>> getBodySymptomsByName({
required List organNames,
required String userSessionToken,
required int gender,
});
- Future>>
- getRiskFactors({
+ Future>> getRiskFactors({
required int age,
- required String sex,
+ required int gender,
required List evidenceIds,
required String language,
required String userSessionToken,
- required int gender,
required String sessionId,
});
- Future>>
- getSuggestions({
+ Future>> getSuggestions({
required int age,
- required String sex,
+ required int gender,
required List evidenceIds,
required String language,
required String userSessionToken,
required String sessionId,
- required int gender,
});
- Future>>
- getDiagnosisForTriage({
+ Future>> getDiagnosisForTriage({
required int age,
- required String sex,
+ required int gender,
required List evidenceIds,
List