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/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/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/langs/ar-SA.json b/assets/langs/ar-SA.json
index 3ceb2e99..90103c09 100644
--- a/assets/langs/ar-SA.json
+++ b/assets/langs/ar-SA.json
@@ -1385,7 +1385,7 @@
"seekMedicalAdviceDescription": "ليست حالة طوارئ ولكن من الأفضل مراقبة الأعراض.",
"emergencyDescription": "تحتاج إلى استشارة الطبيب في أقرب وقت ممكن قبل فوات الأوان.",
"colorScience": "دلالات الألوان",
- "noNeedToVisitDoctor": "لا حاجة لزي��رة الطبيب",
+ "noNeedToVisitDoctor": "لا حاجة لزيرة الطبيب",
"commonSymptom": "الأعراض الشائعة",
"bookAppointment": "احجز موعد",
"notApplicable": "لا ينطبق",
diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart
index 39a6177c..ba8f627a 100644
--- a/lib/core/api/api_client.dart
+++ b/lib/core/api/api_client.dart
@@ -212,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/app_assets.dart b/lib/core/app_assets.dart
index e0a99a71..35d48d69 100644
--- a/lib/core/app_assets.dart
+++ b/lib/core/app_assets.dart
@@ -310,6 +310,9 @@ class AppAssets {
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';
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/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/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/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/main.dart b/lib/main.dart
index ec3b7ec8..e15e8a74 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -8,6 +8,7 @@ import 'package:flutter/services.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/utils/utils.dart';
+import 'package:hmg_patient_app_new/features/ask_doctor/ask_doctor_view_model.dart';
import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart';
import 'package:hmg_patient_app_new/features/blood_donation/blood_donation_view_model.dart';
import 'package:hmg_patient_app_new/features/active_prescriptions/active_prescriptions_view_model.dart';
@@ -39,7 +40,7 @@ import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_v
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_view_model.dart';
import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/health_calculator_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/routes/app_routes.dart';
import 'package:hmg_patient_app_new/services/logger_service.dart';
import 'package:hmg_patient_app_new/services/navigation_service.dart';
@@ -197,6 +198,9 @@ void main() async {
),
ChangeNotifierProvider(
create: (_) => getIt.get(),
+ ),
+ ChangeNotifierProvider(
+ create: (_) => getIt.get(),
)
], child: MyApp()),
),
diff --git a/lib/presentation/ask_doctor/ask_doctor_page.dart b/lib/presentation/ask_doctor/ask_doctor_page.dart
new file mode 100644
index 00000000..4c2c267f
--- /dev/null
+++ b/lib/presentation/ask_doctor/ask_doctor_page.dart
@@ -0,0 +1,104 @@
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_staggered_animations/flutter_staggered_animations.dart';
+import 'package:hmg_patient_app_new/core/utils/size_utils.dart';
+import 'package:hmg_patient_app_new/core/utils/utils.dart';
+import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
+import 'package:hmg_patient_app_new/features/ask_doctor/ask_doctor_view_model.dart';
+import 'package:hmg_patient_app_new/features/medical_file/models/patient_sickleave_response_model.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart';
+import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
+import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_card.dart';
+import 'package:hmg_patient_app_new/presentation/ask_doctor/doctor_response_page.dart';
+import 'package:hmg_patient_app_new/presentation/ask_doctor/widgets/ask_doctor_appointment_card.dart';
+import 'package:hmg_patient_app_new/presentation/medical_file/widgets/patient_sick_leave_card.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart';
+import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
+import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart';
+import 'package:provider/provider.dart';
+
+class AskDoctorPage extends StatefulWidget {
+ const AskDoctorPage({super.key});
+
+ @override
+ State createState() => _AskDoctorPageState();
+}
+
+class _AskDoctorPageState extends State {
+ late MyAppointmentsViewModel myAppointmentsViewModel;
+
+ @override
+ Widget build(BuildContext context) {
+ myAppointmentsViewModel = Provider.of(context, listen: false);
+ return Scaffold(
+ backgroundColor: AppColors.bgScaffoldColor,
+ body: Consumer(
+ builder: (context, askDoctorVM, child) {
+ return CollapsingListView(
+ title: LocaleKeys.askDoctor.tr(context: context),
+ doctorResponse: () {
+ askDoctorVM.getDoctorResponses();
+ Navigator.of(context).push(
+ CustomPageRoute(
+ page: DoctorResponsePage(),
+ ),
+ );
+ },
+ child: SingleChildScrollView(
+ child: Column(children: [
+ SizedBox(height: 16.h),
+ ListView.builder(
+ padding: EdgeInsets.only(top: 8.h),
+ shrinkWrap: true,
+ physics: NeverScrollableScrollPhysics(),
+ itemCount: askDoctorVM.isAskDoctorAppointmentsLoading
+ ? 4
+ : askDoctorVM.askDoctorAppointmentsList.isNotEmpty
+ ? askDoctorVM.askDoctorAppointmentsList.length
+ : 1,
+ itemBuilder: (context, index) {
+ return askDoctorVM.isAskDoctorAppointmentsLoading
+ ? Container(
+ decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true),
+ child: PatientSickLeaveCard(
+ patientSickLeavesResponseModel: PatientSickLeavesResponseModel(),
+ isLoading: true,
+ )).paddingSymmetrical(0.w, 12.h)
+ : askDoctorVM.askDoctorAppointmentsList.isNotEmpty
+ ? AnimationConfiguration.staggeredList(
+ position: index,
+ duration: const Duration(milliseconds: 500),
+ child: SlideAnimation(
+ verticalOffset: 100.0,
+ child: FadeInAnimation(
+ child: AnimatedContainer(
+ duration: Duration(milliseconds: 300),
+ curve: Curves.easeInOut,
+ margin: EdgeInsets.symmetric(vertical: 8.h),
+ decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: true),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ AskDoctorAppointmentCard(
+ askDoctorAppointmentHistoryList: askDoctorVM.askDoctorAppointmentsList[index],
+ myAppointmentsViewModel: myAppointmentsViewModel,
+ )
+ ],
+ ),
+ ),
+ ),
+ ),
+ )
+ : Utils.getNoDataWidget(context, noDataText: LocaleKeys.noAppointmentsYet.tr(context: context));
+ },
+ ).paddingSymmetrical(24.h, 0.h),
+ SizedBox(height: 24.h),
+ ]),
+ ),
+ );
+ },
+ ),
+ );
+ }
+}
diff --git a/lib/presentation/ask_doctor/doctor_response_page.dart b/lib/presentation/ask_doctor/doctor_response_page.dart
new file mode 100644
index 00000000..9cd19ef6
--- /dev/null
+++ b/lib/presentation/ask_doctor/doctor_response_page.dart
@@ -0,0 +1,157 @@
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_staggered_animations/flutter_staggered_animations.dart';
+import 'package:hmg_patient_app_new/core/app_assets.dart';
+import 'package:hmg_patient_app_new/core/utils/date_util.dart';
+import 'package:hmg_patient_app_new/core/utils/size_utils.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/extensions/widget_extensions.dart';
+import 'package:hmg_patient_app_new/features/ask_doctor/ask_doctor_view_model.dart';
+import 'package:hmg_patient_app_new/features/medical_file/models/patient_sickleave_response_model.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart';
+import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
+import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_card.dart';
+import 'package:hmg_patient_app_new/presentation/ask_doctor/widgets/ask_doctor_appointment_card.dart';
+import 'package:hmg_patient_app_new/presentation/ask_doctor/widgets/doctor_response_transactions.dart';
+import 'package:hmg_patient_app_new/presentation/medical_file/widgets/patient_sick_leave_card.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart';
+import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
+import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart';
+import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart';
+import 'package:provider/provider.dart';
+
+class DoctorResponsePage extends StatefulWidget {
+ const DoctorResponsePage({super.key});
+
+ @override
+ State createState() => _DoctorResponsePageState();
+}
+
+class _DoctorResponsePageState extends State {
+ late MyAppointmentsViewModel myAppointmentsViewModel;
+
+ @override
+ Widget build(BuildContext context) {
+ myAppointmentsViewModel = Provider.of(context, listen: false);
+ return Scaffold(
+ backgroundColor: AppColors.bgScaffoldColor,
+ body: CollapsingListView(
+ title: LocaleKeys.doctorResponses.tr(context: context),
+ child: SingleChildScrollView(
+ child: Column(
+ children: [
+ SizedBox(height: 16.h),
+ Consumer(builder: (context, askDoctorVM, child) {
+ return ListView.builder(
+ padding: EdgeInsets.zero,
+ shrinkWrap: true,
+ physics: NeverScrollableScrollPhysics(),
+ itemCount: askDoctorVM.isDoctorResponsesLoading
+ ? 4
+ : askDoctorVM.doctorResponsesList.isNotEmpty
+ ? askDoctorVM.doctorResponsesList.length
+ : 1,
+ itemBuilder: (context, index) {
+ return askDoctorVM.isDoctorResponsesLoading
+ ? Container(
+ decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true),
+ child: PatientSickLeaveCard(
+ patientSickLeavesResponseModel: PatientSickLeavesResponseModel(),
+ isLoading: true,
+ )).paddingSymmetrical(0.w, 12.h)
+ : askDoctorVM.doctorResponsesList.isNotEmpty
+ ? AnimationConfiguration.staggeredList(
+ position: index,
+ duration: const Duration(milliseconds: 500),
+ child: SlideAnimation(
+ verticalOffset: 100.0,
+ child: FadeInAnimation(
+ child: AnimatedContainer(
+ duration: Duration(milliseconds: 300),
+ curve: Curves.easeInOut,
+ margin: EdgeInsets.symmetric(vertical: 8.h),
+ decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: true),
+ child: Padding(
+ padding: EdgeInsets.all(16.w),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ askDoctorVM.doctorResponsesList[index].requestTypeDescription!.toText18(isBold: true),
+ SizedBox(height: 24.h),
+ Row(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Image.network(
+ "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown.png",
+ width: 50.w,
+ height: 50.h,
+ fit: BoxFit.cover,
+ ).circle(100.r),
+ ],
+ ),
+ SizedBox(width: 16.h),
+ Expanded(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ askDoctorVM.doctorResponsesList[index].doctorName!.toText16(isBold: true, maxlines: 1),
+ SizedBox(height: 8.h),
+ Wrap(
+ direction: Axis.horizontal,
+ spacing: 3.h,
+ runSpacing: 4.h,
+ children: [
+ AppCustomChipWidget(
+ labelText: (askDoctorVM.doctorResponsesList[index].clinicName ?? "").length > 15
+ ? '${askDoctorVM.doctorResponsesList[index].clinicName!.substring(0, 12)}...'
+ : askDoctorVM.doctorResponsesList[index].clinicName ?? "",
+ ),
+ AppCustomChipWidget(
+ labelText: (askDoctorVM.doctorResponsesList[index].projectName ?? "").length > 15
+ ? '${askDoctorVM.doctorResponsesList[index].projectName!.substring(0, 12)}...'
+ : askDoctorVM.doctorResponsesList[index].projectName ?? ""),
+ AppCustomChipWidget(
+ labelPadding: EdgeInsetsDirectional.only(start: -4.w, end: 6.w),
+ icon: AppAssets.appointment_calendar_icon,
+ labelText: DateUtil.formatDateToDate(DateUtil.convertStringToDate(askDoctorVM.doctorResponsesList[index].createdOn), false),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ).onPress(() {
+ showCommonBottomSheetWithoutHeight(
+ context,
+ title: askDoctorVM.doctorResponsesList[index].requestTypeDescription!,
+ child: DoctorResponseTransactions(doctorResponseModel: askDoctorVM.doctorResponsesList[index],),
+ callBackFunc: () {},
+ isFullScreen: false,
+ isCloseButtonVisible: true,
+ );
+ }),
+ ),
+ ),
+ )
+ : Utils.getNoDataWidget(context, noDataText: LocaleKeys.noDataAvailable.tr(context: context));
+ },
+ ).paddingSymmetrical(24.h, 0.h);
+ }),
+ SizedBox(height: 24.h),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/presentation/ask_doctor/widgets/ask_doctor_appointment_card.dart b/lib/presentation/ask_doctor/widgets/ask_doctor_appointment_card.dart
new file mode 100644
index 00000000..4ff24c7a
--- /dev/null
+++ b/lib/presentation/ask_doctor/widgets/ask_doctor_appointment_card.dart
@@ -0,0 +1,205 @@
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/app_assets.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/utils/date_util.dart';
+import 'package:hmg_patient_app_new/core/utils/size_utils.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/extensions/widget_extensions.dart';
+import 'package:hmg_patient_app_new/features/ask_doctor/models/ask_doctor_appointments_list.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart';
+import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
+import 'package:hmg_patient_app_new/presentation/appointments/widgets/ask_doctor_request_type_select.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
+import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart';
+import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart';
+import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart';
+
+class AskDoctorAppointmentCard extends StatelessWidget {
+ final AskDoctorAppointmentHistoryList askDoctorAppointmentHistoryList;
+ final MyAppointmentsViewModel myAppointmentsViewModel;
+
+ const AskDoctorAppointmentCard({super.key, required this.askDoctorAppointmentHistoryList, required this.myAppointmentsViewModel});
+
+ @override
+ Widget build(BuildContext context) {
+ final appState = getIt.get();
+ return Padding(
+ padding: EdgeInsets.all(14.h),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ _buildHeader(context, appState),
+ SizedBox(height: 16.h),
+ _buildDoctorRow(context),
+ SizedBox(height: 16.h),
+ _buildActionArea(context, appState),
+ ],
+ ),
+ );
+ }
+
+ Widget _buildHeader(BuildContext context, AppState appState) {
+ return Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Expanded(child: _buildChips(context, appState)),
+ ],
+ );
+ }
+
+ Widget _buildChips(BuildContext context, AppState appState) {
+ return Wrap(
+ alignment: WrapAlignment.start,
+ direction: Axis.horizontal,
+ spacing: 6.w,
+ runSpacing: 6.h,
+ children: [
+ AppCustomChipWidget(
+ icon: AppAssets.walkin_appointment_icon,
+ iconColor: AppColors.textColor,
+ labelText: LocaleKeys.walkin.tr(context: context),
+ backgroundColor: AppColors.greyColor,
+ textColor: AppColors.textColor,
+ ),
+ AppCustomChipWidget(
+ labelText: LocaleKeys.outPatient.tr(context: context),
+ backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.1),
+ textColor: AppColors.primaryRedColor,
+ ),
+ AppCustomChipWidget(
+ labelText: LocaleKeys.booked.tr(context: context),
+ backgroundColor: AppColors.successColor.withValues(alpha: 0.1),
+ textColor: AppColors.successColor,
+ ),
+ ],
+ );
+ }
+
+ Widget _buildDoctorRow(BuildContext context) {
+ return Row(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Image.network(
+ askDoctorAppointmentHistoryList.doctorImageURL!,
+ width: 63.h,
+ height: 63.h,
+ fit: BoxFit.cover,
+ ).circle(100.r),
+ Transform.translate(
+ offset: Offset(0.0, -20.h),
+ child: Container(
+ width: 40.w,
+ height: 40.h,
+ decoration: BoxDecoration(
+ color: AppColors.whiteColor,
+ shape: BoxShape.circle, // Makes the container circular
+ border: Border.all(
+ color: AppColors.scaffoldBgColor, // Color of the border
+ width: 1.5.w, // Width of the border
+ ),
+ ),
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Utils.buildSvgWithAssets(icon: AppAssets.rating_icon, width: 15.w, height: 15.h),
+ SizedBox(height: 2.h),
+ "${askDoctorAppointmentHistoryList.decimalDoctorRate}".toText11(isBold: true, color: AppColors.textColor),
+ ],
+ ),
+ ).circle(100),
+ ),
+ ],
+ ),
+ SizedBox(width: 16.h),
+ Expanded(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ ("${askDoctorAppointmentHistoryList.doctorTitle} ${askDoctorAppointmentHistoryList.doctorName!}").toText16(isBold: true, maxlines: 1),
+ SizedBox(height: 8.h),
+ Wrap(
+ direction: Axis.horizontal,
+ spacing: 3.h,
+ runSpacing: 4.h,
+ children: [
+ AppCustomChipWidget(
+ labelText:
+ askDoctorAppointmentHistoryList.clinicName!.length > 15 ? '${askDoctorAppointmentHistoryList.clinicName!.substring(0, 12)}...' : askDoctorAppointmentHistoryList.clinicName!,
+ ),
+ AppCustomChipWidget(
+ labelText: askDoctorAppointmentHistoryList.projectName!.length > 15
+ ? '${askDoctorAppointmentHistoryList.projectName!.substring(0, 12)}...'
+ : askDoctorAppointmentHistoryList.projectName!),
+ AppCustomChipWidget(
+ labelPadding: EdgeInsetsDirectional.only(start: -4.w, end: 6.w),
+ icon: AppAssets.appointment_calendar_icon,
+ labelText: DateUtil.formatDateToDate(DateUtil.convertStringToDate(askDoctorAppointmentHistoryList.appointmentDate), false),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ],
+ );
+ }
+
+ Widget _buildActionArea(BuildContext context, AppState appState) {
+ return CustomButton(
+ text: LocaleKeys.askDoctor.tr(context: context),
+ onPressed: () async {
+ LoaderBottomSheet.showLoader(loadingText: LocaleKeys.checkingDoctorAvailability.tr(context: context));
+ await myAppointmentsViewModel.isDoctorAvailable(
+ projectID: askDoctorAppointmentHistoryList.projectID!,
+ doctorId: askDoctorAppointmentHistoryList.doctorID!,
+ clinicId: askDoctorAppointmentHistoryList.clinicID!,
+ onSuccess: (value) async {
+ if (value) {
+ await myAppointmentsViewModel.getAskDoctorRequestTypes(onSuccess: (val) {
+ LoaderBottomSheet.hideLoader();
+ showCommonBottomSheetWithoutHeight(
+ context,
+ title: LocaleKeys.askDoctor.tr(context: context),
+ child: AskDoctorRequestTypeSelect(
+ askDoctorRequestTypeList: myAppointmentsViewModel.askDoctorRequestTypeList,
+ myAppointmentsViewModel: myAppointmentsViewModel,
+ patientAppointmentHistoryResponseModel: PatientAppointmentHistoryResponseModel()
+ // myAppointmentsVM.patientAppointmentsHistoryList[index],
+ ),
+ callBackFunc: () {},
+ isFullScreen: false,
+ isCloseButtonVisible: true,
+ );
+ });
+ } else {
+ LoaderBottomSheet.hideLoader();
+ }
+ },
+ onError: (_) {
+ LoaderBottomSheet.hideLoader();
+ },
+ );
+ },
+ backgroundColor: AppColors.secondaryLightRedColor,
+ borderColor: AppColors.secondaryLightRedColor,
+ textColor: AppColors.primaryRedColor,
+ fontSize: 14.f,
+ fontWeight: FontWeight.w500,
+ borderRadius: 12.r,
+ padding: EdgeInsets.symmetric(horizontal: 10.w),
+ // height: isTablet || isFoldable ? 46.h : 40.h,
+ height: 40.h,
+ icon: AppAssets.ask_doctor_icon,
+ iconColor: AppColors.primaryRedColor,
+ iconSize: 16.h,
+ );
+ }
+}
diff --git a/lib/presentation/ask_doctor/widgets/doctor_response_transactions.dart b/lib/presentation/ask_doctor/widgets/doctor_response_transactions.dart
new file mode 100644
index 00000000..33b544d7
--- /dev/null
+++ b/lib/presentation/ask_doctor/widgets/doctor_response_transactions.dart
@@ -0,0 +1,131 @@
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/app_assets.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/utils/date_util.dart';
+import 'package:hmg_patient_app_new/core/utils/size_utils.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/extensions/widget_extensions.dart';
+import 'package:hmg_patient_app_new/features/ask_doctor/models/doctor_response_model.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
+import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart';
+
+class DoctorResponseTransactions extends StatelessWidget {
+ const DoctorResponseTransactions({super.key, required this.doctorResponseModel});
+
+ final DoctorResponseModel doctorResponseModel;
+
+ @override
+ Widget build(BuildContext context) {
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Image.network(
+ "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown.png",
+ width: 50.w,
+ height: 50.h,
+ fit: BoxFit.cover,
+ ).circle(100.r),
+ ],
+ ),
+ SizedBox(width: 16.h),
+ Expanded(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ doctorResponseModel.doctorName!.toText16(isBold: true, maxlines: 1),
+ SizedBox(height: 8.h),
+ Wrap(
+ direction: Axis.horizontal,
+ spacing: 3.h,
+ runSpacing: 4.h,
+ children: [
+ AppCustomChipWidget(
+ labelText: (doctorResponseModel.clinicName ?? "").length > 15 ? '${doctorResponseModel.clinicName!.substring(0, 12)}...' : doctorResponseModel.clinicName ?? "",
+ ),
+ AppCustomChipWidget(
+ labelText: (doctorResponseModel.projectName ?? "").length > 15 ? '${doctorResponseModel.projectName!.substring(0, 12)}...' : doctorResponseModel.projectName ?? ""),
+ AppCustomChipWidget(
+ labelPadding: EdgeInsetsDirectional.only(start: -4.w, end: 6.w),
+ icon: AppAssets.appointment_calendar_icon,
+ labelText: DateUtil.formatDateToDate(DateUtil.convertStringToDate(doctorResponseModel.createdOn), false),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ SizedBox(height: 16.h),
+ Divider(color: AppColors.dividerColor, height: 1.h),
+ SizedBox(height: 16.h),
+ Padding(
+ padding: EdgeInsets.symmetric(horizontal: 72.w),
+ child: CustomButton(
+ text: DateUtil.formatDateToDate(DateUtil.convertStringToDate(doctorResponseModel.createdOn), false),
+ onPressed: () {},
+ backgroundColor: AppColors.greyColor,
+ borderColor: AppColors.greyColor,
+ textColor: AppColors.textColor,
+ fontSize: 14.f,
+ fontWeight: FontWeight.w500,
+ borderRadius: 10.r,
+ height: 40.h,
+ ).paddingSymmetrical(16.w, 0.h),
+ ),
+ SizedBox(height: 16.h),
+ Row(
+ children: [
+ Image.asset(getIt.get().getAuthenticatedUser()?.gender == 1 ? AppAssets.maleImg : AppAssets.femaleImg, width: 42.w, height: 42.h),
+ SizedBox(width: 8.w),
+ Container(
+ padding: EdgeInsets.all(8.w),
+ decoration: BoxDecoration(
+ color: AppColors.infoColor.withAlpha(20),
+ borderRadius: BorderRadius.circular(8.r),
+ ),
+ child: doctorResponseModel.requestTypeDescription!.toText12(color: AppColors.infoColor, fontWeight: FontWeight.w500),
+ ),
+ ],
+ ),
+ SizedBox(height: 24.h),
+ ListView.builder(
+ padding: EdgeInsets.zero,
+ itemCount: doctorResponseModel.transactions!.length,
+ shrinkWrap: true,
+ physics: NeverScrollableScrollPhysics(),
+ itemBuilder: (context, index) {
+ return Column(
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.end,
+ children: [
+ Container(
+ padding: EdgeInsets.all(8.w),
+ decoration: BoxDecoration(
+ color: AppColors.infoColor.withAlpha(20),
+ borderRadius: BorderRadius.circular(8.r),
+ ),
+ child: doctorResponseModel.transactions![index].doctorResponse!.toText12(color: AppColors.textColor, fontWeight: FontWeight.w500),
+ ),
+ SizedBox(width: 8.w),
+ Image.network("https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown.png", fit: BoxFit.cover, width: 42.w, height: 42.h).circle(100.r),
+ ],
+ ),
+ ],
+ );
+ },
+ ),
+ ],
+ );
+ }
+}
diff --git a/lib/presentation/authentication/register.dart b/lib/presentation/authentication/register.dart
index d14419f7..71bddb38 100644
--- a/lib/presentation/authentication/register.dart
+++ b/lib/presentation/authentication/register.dart
@@ -162,10 +162,12 @@ class _RegisterNew extends State {
GestureDetector(
onTap: () {
// Navigate to terms and conditions page
- Navigator.of(context).pushNamed('/terms');
+ Utils.openWebView(
+ url: 'https://hmg.com/en/Pages/Terms.aspx',
+ );
},
child: Text(
- LocaleKeys.termsConditoins.tr(context: context),
+ " ${LocaleKeys.termsConditoins.tr(context: context)}",
style: context.dynamicTextStyle(
fontSize: 14.f,
fontWeight: FontWeight.w500,
diff --git a/lib/presentation/book_appointment/book_appointment_page.dart b/lib/presentation/book_appointment/book_appointment_page.dart
index bc0c49ab..b95e0c26 100644
--- a/lib/presentation/book_appointment/book_appointment_page.dart
+++ b/lib/presentation/book_appointment/book_appointment_page.dart
@@ -314,11 +314,9 @@ class _BookAppointmentPageState extends State {
).paddingSymmetrical(24.h, 0.h);
case 1:
//TODO: Get LiveCare type Select UI from Hussain
- return
- // appState.isAuthenticated
- // ?
- Column(
- children: [
+ return appState.isAuthenticated
+ ? Column(
+ children: [
Container(
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
color: AppColors.whiteColor,
@@ -429,8 +427,7 @@ class _BookAppointmentPageState extends State {
),
],
).paddingSymmetrical(24.h, 0.h)
- // : getLiveCareNotLoggedInUI()
- ;
+ : getLiveCareNotLoggedInUI();
default:
SizedBox.shrink();
}
@@ -459,9 +456,10 @@ class _BookAppointmentPageState extends State {
SizedBox(width: 16.w),
CustomButton(
height: 40.h,
+ width: 40.w,
text: "",
onPressed: () => context.navigateWithName(AppRoutes.userInfoSelection),
- icon: AppAssets.arrow_forward,
+ icon: getIt.get().isArabic() ? AppAssets.arrow_back : AppAssets.arrow_forward,
)
],
).paddingAll(24.w),
diff --git a/lib/presentation/book_appointment/widgets/clinic_card.dart b/lib/presentation/book_appointment/widgets/clinic_card.dart
index cab3b1a4..7e3c8df1 100644
--- a/lib/presentation/book_appointment/widgets/clinic_card.dart
+++ b/lib/presentation/book_appointment/widgets/clinic_card.dart
@@ -32,9 +32,9 @@ class ClinicCard extends StatelessWidget {
child: Column(
children: [
Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
- Utils.buildSvgWithAssets(icon: AppAssets.generic_clinic_icon, width: 24.h, height: 24.h, fit: BoxFit.contain).toShimmer2(isShow: isLoading),
+ Utils.buildSvgWithAssets(icon: "assets/images/clinicIcons/${clinicsListResponseModel.clinicID ?? 1}.svg", width: 24.w, height: 24.h, fit: BoxFit.contain).toShimmer2(isShow: isLoading),
(clinicsListResponseModel.isLiveCareClinicAndOnline ?? true)
- ? Utils.buildSvgWithAssets(icon: AppAssets.livecare_clinic_icon, width: 32.h, height: 32.h, fit: BoxFit.contain).toShimmer2(isShow: isLoading)
+ ? Utils.buildSvgWithAssets(icon: AppAssets.livecare_clinic_icon, width: 32.w, height: 32.h, fit: BoxFit.contain).toShimmer2(isShow: isLoading)
: SizedBox.shrink(),
],
),
diff --git a/lib/presentation/health_trackers/add_health_tracker_entry_page.dart b/lib/presentation/health_trackers/add_health_tracker_entry_page.dart
index cf92c9ba..702875d9 100644
--- a/lib/presentation/health_trackers/add_health_tracker_entry_page.dart
+++ b/lib/presentation/health_trackers/add_health_tracker_entry_page.dart
@@ -10,7 +10,7 @@ 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/extensions/widget_extensions.dart';
import 'package:hmg_patient_app_new/generated/locale_keys.g.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/dialog_service.dart';
import 'package:hmg_patient_app_new/theme/colors.dart';
import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart';
diff --git a/lib/presentation/health_trackers/health_tracker_detail_page.dart b/lib/presentation/health_trackers/health_tracker_detail_page.dart
index 83b37f65..b5f41dae 100644
--- a/lib/presentation/health_trackers/health_tracker_detail_page.dart
+++ b/lib/presentation/health_trackers/health_tracker_detail_page.dart
@@ -16,7 +16,7 @@ import 'package:hmg_patient_app_new/features/health_trackers/models/blood_sugar/
import 'package:hmg_patient_app_new/features/health_trackers/models/weight/week_weight_measurement_result_average.dart';
import 'package:hmg_patient_app_new/features/health_trackers/models/weight/year_weight_measurement_result_average.dart';
import 'package:hmg_patient_app_new/generated/locale_keys.g.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/presentation/health_trackers/widgets/tracker_last_value_card.dart';
import 'package:hmg_patient_app_new/services/dialog_service.dart';
import 'package:hmg_patient_app_new/theme/colors.dart';
diff --git a/lib/presentation/health_trackers/widgets/tracker_last_value_card.dart b/lib/presentation/health_trackers/widgets/tracker_last_value_card.dart
index 570005bf..7e4ac2c9 100644
--- a/lib/presentation/health_trackers/widgets/tracker_last_value_card.dart
+++ b/lib/presentation/health_trackers/widgets/tracker_last_value_card.dart
@@ -6,7 +6,7 @@ import 'package:hmg_patient_app_new/core/enums.dart';
import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
import 'package:hmg_patient_app_new/generated/locale_keys.g.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/theme/colors.dart';
import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart';
import 'package:provider/provider.dart';
diff --git a/lib/presentation/hmg_services/services_view.dart b/lib/presentation/hmg_services/services_view.dart
index 59efb73f..99085a53 100644
--- a/lib/presentation/hmg_services/services_view.dart
+++ b/lib/presentation/hmg_services/services_view.dart
@@ -24,11 +24,12 @@ class ServiceGridViewItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
return InkWell(
- onTap: () => hmgServiceComponentModel.isExternalLink
- ? _openLink(hmgServiceComponentModel.route!)
- : getIt
- .get()
- .pushPageRoute(hmgServiceComponentModel.route!),
+ onTap: () => hmgServiceComponentModel.route != null ? getIt.get().pushPageRoute(hmgServiceComponentModel.route!) : hmgServiceComponentModel.onTap!(),
+ // onTap: () => hmgServiceComponentModel.isExternalLink
+ // ? _openLink(hmgServiceComponentModel.route!)
+ // : getIt
+ // .get()
+ // .pushPageRoute(hmgServiceComponentModel.route!),
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start,
diff --git a/lib/presentation/home/landing_page.dart b/lib/presentation/home/landing_page.dart
index b6334043..ab0d247e 100644
--- a/lib/presentation/home/landing_page.dart
+++ b/lib/presentation/home/landing_page.dart
@@ -249,7 +249,7 @@ class _LandingPageState extends State {
);
}),
!appState.isAuthenticated
- ? Utils.buildSvgWithAssets(icon: appState.isArabic() ? AppAssets.enLangIcon : AppAssets.arLangIcon, height: 18.h, width: 18.h).onPress(() {
+ ? Utils.buildSvgWithAssets(icon: AppAssets.changeLanguageHomePageIcon, height: 18.h, width: 18.h).onPress(() {
context.setLocale(appState.isArabic() ? Locale('en', 'US') : Locale('ar', 'SA'));
})
: SizedBox.shrink()
@@ -654,299 +654,354 @@ class _LandingPageState extends State {
);
}
+ // Main card selector based on index and priority
Widget getIndexSwiperCard(int index) {
+ // Index 0: Priority cards (Queue > LiveCare > Upcoming Appointment > History)
if (index == 0) {
- if (myAppointmentsViewModel.isPatientHasQueueAppointment) {
- return Container(
+ return _buildFirstCardSlot();
+ }
+ // Index 1: Secondary cards based on first card type
+ if (index == 1) {
+ return _buildSecondCardSlot();
+ }
+ // Index 2: Tertiary cards
+ if (index == 2) {
+ return _buildThirdCardSlot();
+ }
+ return Container();
+ }
+
+ // First slot: Shows highest priority card
+ Widget _buildFirstCardSlot() {
+ if (myAppointmentsViewModel.isPatientHasQueueAppointment) {
+ return _buildQueueCard();
+ }
+
+ if (immediateLiveCareViewModel.patientHasPendingLiveCareRequest) {
+ return _buildLiveCareRequestCard();
+ }
+
+ if (myAppointmentsViewModel.patientUpcomingAppointmentsHistoryList.isNotEmpty) {
+ return _buildAppointmentCardWrapper(
+ myAppointmentsViewModel.patientUpcomingAppointmentsHistoryList.first,
+ );
+ }
+
+ return _buildAppointmentCardWrapper(
+ myAppointmentsViewModel.patientAppointmentsHistoryList[0],
+ );
+ }
+
+ // Second slot: Shows appointment or ancillary orders
+ Widget _buildSecondCardSlot() {
+ final hasQueueOrLiveCare = myAppointmentsViewModel.isPatientHasQueueAppointment || immediateLiveCareViewModel.patientHasPendingLiveCareRequest;
+
+ if (hasQueueOrLiveCare) {
+ return _buildAppointmentCardWrapper(
+ myAppointmentsViewModel.patientAppointmentsHistoryList.first,
+ );
+ }
+
+ if (todoSectionViewModel.patientAncillaryOrdersList.isNotEmpty) {
+ return _buildAncillaryOrderCardWrapper(
+ todoSectionViewModel.patientAncillaryOrdersList.first,
+ );
+ }
+
+ return _buildAppointmentCardWrapper(
+ myAppointmentsViewModel.patientAppointmentsHistoryList[1],
+ );
+ }
+
+ // Third slot: Shows ancillary orders or appointment
+ Widget _buildThirdCardSlot() {
+ final hasQueueOrLiveCare = myAppointmentsViewModel.isPatientHasQueueAppointment || immediateLiveCareViewModel.patientHasPendingLiveCareRequest;
+ final hasAncillaryOrders = todoSectionViewModel.patientAncillaryOrdersList.isNotEmpty;
+
+ if (hasQueueOrLiveCare && hasAncillaryOrders) {
+ return _buildAncillaryOrderCardWrapper(
+ todoSectionViewModel.patientAncillaryOrdersList.first,
+ );
+ }
+
+ return _buildAppointmentCardWrapper(
+ myAppointmentsViewModel.patientAppointmentsHistoryList[2],
+ );
+ }
+
+ // Queue Card Widget
+ Widget _buildQueueCard() {
+ final currentQueue = myAppointmentsViewModel.currentPatientQueueDetails;
+ final currentStatus = myAppointmentsViewModel.currentQueueStatus;
+
+ return Container(
+ decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+ color: AppColors.whiteColor,
+ borderRadius: 20.h,
+ hasShadow: false,
+ side: BorderSide(
+ color: Utils.getCardBorderColor(currentStatus),
+ width: 2.w,
+ ),
+ ),
+ child: Padding(
+ padding: EdgeInsets.all(16.h),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ _buildQueueHeader(currentStatus),
+ SizedBox(height: 8.h),
+ _buildQueueGreeting(),
+ SizedBox(height: 2.h),
+ LocaleKeys.thankYouForPatience.tr().toText12(
+ fontWeight: FontWeight.w500,
+ color: AppColors.textColorLight,
+ ),
+ SizedBox(height: 8.h),
+ currentQueue.queueNo!.toText28(isBold: true),
+ SizedBox(height: 6.h),
+ _buildServingNowSection(),
+ SizedBox(height: 5.h),
+ _buildQueueActionButton(currentStatus, currentQueue.roomNo ?? ""),
+ ],
+ ),
+ ),
+ ).onPress(() {
+ Navigator.of(context).push(
+ CustomPageRoute(page: AppointmentQueuePage()),
+ );
+ });
+ }
+
+ // Queue Card: Header with status chip and icon
+ Widget _buildQueueHeader(int currentStatus) {
+ return Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ AppCustomChipWidget(
+ labelText: currentStatus == 0 ? LocaleKeys.inQueue.tr() : LocaleKeys.yourTurn.tr(),
+ backgroundColor: Utils.getCardBorderColor(currentStatus).withValues(alpha: 0.20),
+ textColor: Utils.getCardBorderColor(currentStatus),
+ ),
+ Utils.buildSvgWithAssets(
+ icon: AppAssets.waiting_icon,
+ width: 24.h,
+ height: 24.h,
+ ),
+ ],
+ );
+ }
+
+ // Queue Card: Greeting text
+ Widget _buildQueueGreeting() {
+ return LocaleKeys.halaFirstName.tr(namedArgs: {'firstName': appState.getAuthenticatedUser()!.firstName!}).toText16(isBold: true);
+ }
+
+ // Queue Card: Currently serving section
+ Widget _buildServingNowSection() {
+ if (myAppointmentsViewModel.patientQueueDetailsList.isEmpty) {
+ return SizedBox(height: 12.h);
+ }
+
+ final servingQueue = myAppointmentsViewModel.patientQueueDetailsList.first;
+ final isVitalCall = servingQueue.callType == 1;
+
+ return Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ "${LocaleKeys.servingNow.tr()}: ".toText14(isBold: true),
+ Row(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ servingQueue.queueNo!.toText12(isBold: true),
+ SizedBox(width: 8.w),
+ AppCustomChipWidget(
+ deleteIcon: isVitalCall ? AppAssets.call_for_vitals : AppAssets.call_for_doctor,
+ labelText: isVitalCall ? LocaleKeys.callForVitalSigns.tr() : LocaleKeys.callForDoctor.tr(),
+ iconColor: isVitalCall ? AppColors.primaryRedColor : AppColors.successColor,
+ textColor: isVitalCall ? AppColors.primaryRedColor : AppColors.successColor,
+ iconSize: 14.w,
+ backgroundColor: isVitalCall ? AppColors.primaryRedColor.withValues(alpha: 0.1) : AppColors.successColor.withValues(alpha: 0.1),
+ labelPadding: EdgeInsetsDirectional.only(
+ start: 8.h,
+ end: -2.h,
+ ),
+ ),
+ ],
+ ),
+ ],
+ );
+ }
+
+ // Queue Card: Action button
+ Widget _buildQueueActionButton(int currentStatus, String roomNo) {
+ return CustomButton(
+ text: Utils.getCardButtonText(currentStatus, roomNo),
+ onPressed: () {},
+ backgroundColor: Utils.getCardButtonColor(currentStatus),
+ borderColor: Utils.getCardButtonColor(currentStatus).withValues(alpha: 0.01),
+ textColor: Utils.getCardButtonTextColor(currentStatus),
+ fontSize: 12.f,
+ fontWeight: FontWeight.w600,
+ borderRadius: 12.r,
+ padding: EdgeInsets.symmetric(horizontal: 10.w),
+ height: 40.h,
+ iconColor: AppColors.whiteColor,
+ iconSize: 18.h,
+ );
+ }
+
+ // LiveCare Request Card Widget
+ Widget _buildLiveCareRequestCard() {
+ final liveCareData = immediateLiveCareViewModel.patientLiveCareHistoryList[0];
+
+ return Column(
+ children: [
+ SizedBox(height: 12.h),
+ Container(
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
color: AppColors.whiteColor,
- borderRadius: 20.h,
- hasShadow: false,
- side: BorderSide(color: Utils.getCardBorderColor(myAppointmentsViewModel.currentQueueStatus), width: 2.w),
+ borderRadius: 20.r,
+ hasShadow: true,
+ side: BorderSide(color: AppColors.ratingColorYellow, width: 3.h),
),
child: Padding(
padding: EdgeInsets.all(16.h),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- AppCustomChipWidget(
- labelText: myAppointmentsViewModel.currentQueueStatus == 0 ? LocaleKeys.inQueue.tr() : LocaleKeys.yourTurn.tr(),
- backgroundColor: Utils.getCardBorderColor(myAppointmentsViewModel.currentQueueStatus).withValues(alpha: 0.20),
- textColor: Utils.getCardBorderColor(myAppointmentsViewModel.currentQueueStatus),
- ),
- Utils.buildSvgWithAssets(icon: AppAssets.waiting_icon, width: 24.h, height: 24.h),
- ],
- ),
+ LocaleKeys.immediateLiveCareRequest.tr(context: context).toText16(isBold: true),
+ SizedBox(height: 10.h),
+ _buildLiveCareHeader(liveCareData),
+ SizedBox(height: 10.h),
+ _buildLiveCareGreeting(),
SizedBox(height: 8.h),
- LocaleKeys.halaFirstName.tr(namedArgs: {'firstName': appState.getAuthenticatedUser()!.firstName!}).toText16(isBold: true),
- SizedBox(height: 2.h),
- LocaleKeys.thankYouForPatience.tr().toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight),
+ _buildLiveCareQueueInfo(liveCareData.patCount),
SizedBox(height: 8.h),
- myAppointmentsViewModel.currentPatientQueueDetails.queueNo!.toText28(isBold: true),
- SizedBox(height: 6.h),
- myAppointmentsViewModel.patientQueueDetailsList.isNotEmpty
- ? Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- "${LocaleKeys.servingNow.tr()}: ".toText14(isBold: true),
- Row(
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- myAppointmentsViewModel.patientQueueDetailsList.first.queueNo!.toText12(isBold: true),
- SizedBox(width: 8.w),
- AppCustomChipWidget(
- deleteIcon: myAppointmentsViewModel.patientQueueDetailsList.first.callType == 1
- ? AppAssets.call_for_vitals
- : AppAssets.call_for_doctor,
- labelText: myAppointmentsViewModel.patientQueueDetailsList.first.callType == 1
- ? LocaleKeys.callForVitalSigns.tr()
- : LocaleKeys.callForDoctor.tr(),
- iconColor: myAppointmentsViewModel.patientQueueDetailsList.first.callType == 1
- ? AppColors.primaryRedColor
- : AppColors.successColor,
- textColor: myAppointmentsViewModel.patientQueueDetailsList.first.callType == 1
- ? AppColors.primaryRedColor
- : AppColors.successColor,
- iconSize: 14.w,
- backgroundColor: myAppointmentsViewModel.patientQueueDetailsList.first.callType == 1
- ? AppColors.primaryRedColor.withValues(alpha: 0.1)
- : AppColors.successColor.withValues(alpha: 0.1),
- labelPadding: EdgeInsetsDirectional.only(start: 8.h, end: -2.h),
- ),
- ],
- ),
- ],
- )
- : SizedBox(height: 12.h),
- SizedBox(height: 5.h),
- CustomButton(
- text: Utils.getCardButtonText(
- myAppointmentsViewModel.currentQueueStatus, myAppointmentsViewModel.currentPatientQueueDetails.roomNo ?? ""),
- onPressed: () {},
- backgroundColor: Utils.getCardButtonColor(myAppointmentsViewModel.currentQueueStatus),
- borderColor: Utils.getCardButtonColor(myAppointmentsViewModel.currentQueueStatus).withValues(alpha: 0.01),
- textColor: Utils.getCardButtonTextColor(myAppointmentsViewModel.currentQueueStatus),
- fontSize: 12.f,
- fontWeight: FontWeight.w600,
- borderRadius: 12.r,
- padding: EdgeInsets.symmetric(horizontal: 10.w),
- height: 40.h,
- iconColor: AppColors.whiteColor,
- iconSize: 18.h,
- ),
+ _buildLiveCareWaitingTime(),
],
),
),
- ).onPress(() {
+ ).paddingSymmetrical(0.h, 0.h).onPress(() {
Navigator.of(context).push(
- CustomPageRoute(
- page: AppointmentQueuePage(),
- ),
+ CustomPageRoute(page: ImmediateLiveCarePendingRequestPage()),
);
- });
- } else if (immediateLiveCareViewModel.patientHasPendingLiveCareRequest) {
- return Column(
+ }),
+ SizedBox(height: 12.h),
+ ],
+ );
+ }
+
+ // LiveCare Card: Header with status and date
+ Widget _buildLiveCareHeader(liveCareData) {
+ return Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Row(
children: [
- SizedBox(height: 12.h),
- Container(
- decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
- color: AppColors.whiteColor,
- borderRadius: 20.r,
- hasShadow: true,
- side: BorderSide(color: AppColors.ratingColorYellow, width: 3.h),
- ),
- child: Padding(
- padding: EdgeInsets.all(16.h),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- LocaleKeys.immediateLiveCareRequest.tr(context: context).toText16(isBold: true),
- SizedBox(height: 10.h),
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Row(
- children: [
- AppCustomChipWidget(
- labelText: immediateLiveCareViewModel.patientLiveCareHistoryList[0].stringCallStatus,
- backgroundColor: AppColors.warningColorYellow.withValues(alpha: 0.20),
- textColor: AppColors.alertColor,
- ),
- SizedBox(width: 8.w),
- AppCustomChipWidget(
- icon: AppAssets.appointment_calendar_icon,
- labelText: DateUtil.formatDateToDate(
- DateUtil.convertStringToDate(immediateLiveCareViewModel.patientLiveCareHistoryList[0].arrivalTime), false)),
- ],
- ),
- Utils.buildSvgWithAssets(icon: AppAssets.waiting_icon, width: 24.h, height: 24.h),
- // Lottie.asset(AppAnimations.pending_loading_animation, repeat: true, reverse: false, frameRate: FrameRate(60), width: 80.h, height: 80.h, fit: BoxFit.cover),
- ],
- ),
- SizedBox(height: 10.h),
- LocaleKeys.halaFirstName
- .tr(namedArgs: {'firstName': appState.getAuthenticatedUser()!.firstName!}, context: context).toText16(isBold: true),
- SizedBox(height: 8.h),
- LocaleKeys.yourTurnIsAfterPatients.tr(
- namedArgs: {'count': immediateLiveCareViewModel.patientLiveCareHistoryList[0].patCount.toString()},
- context: context).toText14(isBold: true),
- SizedBox(height: 8.h),
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- "${LocaleKeys.waitingTime.tr()}: ".toText12(isBold: true),
- SizedBox(height: 7.h),
- ValueListenableBuilder(
- valueListenable: immediateLiveCareViewModel.durationNotifier,
- builder: (context, duration, child) {
- return Column(
- mainAxisAlignment: MainAxisAlignment.center,
- children: [
- buildTime(duration),
- ],
- );
- },
- ),
- ],
- ),
- ],
- ),
+ AppCustomChipWidget(
+ labelText: liveCareData.stringCallStatus,
+ backgroundColor: AppColors.warningColorYellow.withValues(alpha: 0.20),
+ textColor: AppColors.alertColor,
+ ),
+ SizedBox(width: 8.w),
+ AppCustomChipWidget(
+ icon: AppAssets.appointment_calendar_icon,
+ labelText: DateUtil.formatDateToDate(
+ DateUtil.convertStringToDate(liveCareData.arrivalTime),
+ false,
),
- ).paddingSymmetrical(0.h, 0.h).onPress(() {
- Navigator.of(context).push(CustomPageRoute(page: ImmediateLiveCarePendingRequestPage()));
- }),
- SizedBox(height: 12.h),
+ ),
],
- );
- } else if (myAppointmentsViewModel.patientUpcomingAppointmentsHistoryList.isNotEmpty) {
- return Container(
- decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
- color: AppColors.whiteColor,
- borderRadius: 24.r,
- hasShadow: true,
- ),
- child: AppointmentCard(
- patientAppointmentHistoryResponseModel: myAppointmentsViewModel.patientUpcomingAppointmentsHistoryList.first,
- myAppointmentsViewModel: myAppointmentsViewModel,
- bookAppointmentsViewModel: bookAppointmentsViewModel,
- isLoading: false,
- isFromHomePage: true,
- ),
- );
- } else {
- return Container(
- decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
- color: AppColors.whiteColor,
- borderRadius: 24.r,
- hasShadow: true,
- ),
- child: AppointmentCard(
- patientAppointmentHistoryResponseModel: myAppointmentsViewModel.patientAppointmentsHistoryList[index],
- myAppointmentsViewModel: myAppointmentsViewModel,
- bookAppointmentsViewModel: bookAppointmentsViewModel,
- isLoading: false,
- isFromHomePage: true,
- ),
- );
- }
- } else if (index == 1) {
- if (myAppointmentsViewModel.isPatientHasQueueAppointment || immediateLiveCareViewModel.patientHasPendingLiveCareRequest) {
- return Container(
- decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
- color: AppColors.whiteColor,
- borderRadius: 24.r,
- hasShadow: true,
- ),
- child: AppointmentCard(
- patientAppointmentHistoryResponseModel: myAppointmentsViewModel.patientAppointmentsHistoryList.first,
- myAppointmentsViewModel: myAppointmentsViewModel,
- bookAppointmentsViewModel: bookAppointmentsViewModel,
- isLoading: false,
- isFromHomePage: true,
- ),
- );
- } else if (todoSectionViewModel.patientAncillaryOrdersList.isNotEmpty) {
- return AncillaryOrderCard(
- order: todoSectionViewModel.patientAncillaryOrdersList.first,
- isLoading: false,
- isOrdersList: false,
- onCheckIn: () {
- log("Check-in for order: ${todoSectionViewModel.patientAncillaryOrdersList.first.orderNo}");
- },
- onViewDetails: () {
- Navigator.of(context).push(
- CustomPageRoute(
- page: AncillaryOrderDetailsList(
- appointmentNoVida: todoSectionViewModel.patientAncillaryOrdersList.first.appointmentNo ?? 0,
- orderNo: todoSectionViewModel.patientAncillaryOrdersList.first.orderNo ?? 0,
- projectID: todoSectionViewModel.patientAncillaryOrdersList.first.projectID ?? 0,
- projectName: todoSectionViewModel.patientAncillaryOrdersList.first.projectName ?? "",
- ),
- ),
- );
- },
- );
- } else {
- return Container(
- decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
- color: AppColors.whiteColor,
- borderRadius: 24.r,
- hasShadow: true,
- ),
- child: AppointmentCard(
- patientAppointmentHistoryResponseModel: myAppointmentsViewModel.patientAppointmentsHistoryList[index],
- myAppointmentsViewModel: myAppointmentsViewModel,
- bookAppointmentsViewModel: bookAppointmentsViewModel,
- isLoading: false,
- isFromHomePage: true,
- ),
- );
- }
- } else if (index == 2) {
- if ((myAppointmentsViewModel.isPatientHasQueueAppointment || immediateLiveCareViewModel.patientHasPendingLiveCareRequest) &&
- todoSectionViewModel.patientAncillaryOrdersList.isNotEmpty) {
- return AncillaryOrderCard(
- order: todoSectionViewModel.patientAncillaryOrdersList.first,
- isLoading: false,
- isOrdersList: false,
- onCheckIn: () {
- log("Check-in for order: ${todoSectionViewModel.patientAncillaryOrdersList.first.orderNo}");
- },
- onViewDetails: () {
- Navigator.of(context).push(
- CustomPageRoute(
- page: AncillaryOrderDetailsList(
- appointmentNoVida: todoSectionViewModel.patientAncillaryOrdersList.first.appointmentNo ?? 0,
- orderNo: todoSectionViewModel.patientAncillaryOrdersList.first.orderNo ?? 0,
- projectID: todoSectionViewModel.patientAncillaryOrdersList.first.projectID ?? 0,
- projectName: todoSectionViewModel.patientAncillaryOrdersList.first.projectName ?? "",
- ),
- ),
+ ),
+ Utils.buildSvgWithAssets(
+ icon: AppAssets.waiting_icon,
+ width: 24.h,
+ height: 24.h,
+ ),
+ ],
+ );
+ }
+
+ // LiveCare Card: Greeting
+ Widget _buildLiveCareGreeting() {
+ return LocaleKeys.halaFirstName.tr(
+ namedArgs: {'firstName': appState.getAuthenticatedUser()!.firstName!},
+ context: context,
+ ).toText16(isBold: true);
+ }
+
+ // LiveCare Card: Queue position info
+ Widget _buildLiveCareQueueInfo(int? patCount) {
+ return LocaleKeys.yourTurnIsAfterPatients.tr(
+ namedArgs: {'count': (patCount ?? 0).toString()},
+ context: context,
+ ).toText14(isBold: true);
+ }
+
+ // LiveCare Card: Waiting time counter
+ Widget _buildLiveCareWaitingTime() {
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ "${LocaleKeys.waitingTime.tr()}: ".toText12(isBold: true),
+ SizedBox(height: 7.h),
+ ValueListenableBuilder(
+ valueListenable: immediateLiveCareViewModel.durationNotifier,
+ builder: (context, duration, child) {
+ return Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ buildTime(duration),
+ ],
);
},
- );
- } else {
- return Container(
- decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
- color: AppColors.whiteColor,
- borderRadius: 24.r,
- hasShadow: true,
- ),
- child: AppointmentCard(
- patientAppointmentHistoryResponseModel: myAppointmentsViewModel.patientAppointmentsHistoryList[index],
- myAppointmentsViewModel: myAppointmentsViewModel,
- bookAppointmentsViewModel: bookAppointmentsViewModel,
- isLoading: false,
- isFromHomePage: true,
+ ),
+ ],
+ );
+ }
+
+ // Appointment Card Wrapper (reusable)
+ Widget _buildAppointmentCardWrapper(appointment) {
+ return Container(
+ decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+ color: AppColors.whiteColor,
+ borderRadius: 24.r,
+ hasShadow: true,
+ ),
+ child: AppointmentCard(
+ patientAppointmentHistoryResponseModel: appointment,
+ myAppointmentsViewModel: myAppointmentsViewModel,
+ bookAppointmentsViewModel: bookAppointmentsViewModel,
+ isLoading: false,
+ isFromHomePage: true,
+ ),
+ );
+ }
+
+ // Ancillary Order Card Wrapper (reusable)
+ Widget _buildAncillaryOrderCardWrapper(order) {
+ return AncillaryOrderCard(
+ order: order,
+ isLoading: false,
+ isOrdersList: false,
+ onCheckIn: () {
+ log("Check-in for order: ${order.orderNo}");
+ },
+ onViewDetails: () {
+ Navigator.of(context).push(
+ CustomPageRoute(
+ page: AncillaryOrderDetailsList(
+ appointmentNoVida: order.appointmentNo ?? 0,
+ orderNo: order.orderNo ?? 0,
+ projectID: order.projectID ?? 0,
+ projectName: order.projectName ?? "",
+ ),
),
);
- }
- }
- return Container();
+ },
+ );
}
void showQuickLogin(BuildContext context) {
diff --git a/lib/presentation/home/widgets/habib_wallet_card.dart b/lib/presentation/home/widgets/habib_wallet_card.dart
index fb04baf3..1ce16006 100644
--- a/lib/presentation/home/widgets/habib_wallet_card.dart
+++ b/lib/presentation/home/widgets/habib_wallet_card.dart
@@ -24,13 +24,13 @@ class HabibWalletCard extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
LocaleKeys.myBalance.tr(context: context).toText16(isBold: true),
- Row(
- children: [
- LocaleKeys.viewAllServices.tr(context: context).toText12(color: AppColors.primaryRedColor),
- SizedBox(width: 2.h),
- Icon(Icons.arrow_forward_ios, color: AppColors.primaryRedColor, size: 10.h),
- ],
- ),
+ // Row(
+ // children: [
+ // LocaleKeys.viewAllServices.tr(context: context).toText12(color: AppColors.primaryRedColor),
+ // SizedBox(width: 2.h),
+ // Icon(Icons.arrow_forward_ios, color: AppColors.primaryRedColor, size: 10.h),
+ // ],
+ // ),
],
).paddingSymmetrical(24.h, 0.h),
SizedBox(height: 16.h),
@@ -127,6 +127,7 @@ class HabibWalletCard extends StatelessWidget {
borderRadius: 12,
padding: EdgeInsets.fromLTRB(10, 0, 10, 0),
height: 35.h,
+ // width: 35.w,
),
],
),
diff --git a/lib/presentation/medical_file/medical_file_page.dart b/lib/presentation/medical_file/medical_file_page.dart
index 3cc7fd36..dd9e4cc4 100644
--- a/lib/presentation/medical_file/medical_file_page.dart
+++ b/lib/presentation/medical_file/medical_file_page.dart
@@ -17,6 +17,7 @@ import 'package:hmg_patient_app_new/extensions/route_extensions.dart';
import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
import 'package:hmg_patient_app_new/features/active_prescriptions/models/active_prescriptions_response_model.dart';
+import 'package:hmg_patient_app_new/features/ask_doctor/ask_doctor_view_model.dart';
import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart';
import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctors_list_response_model.dart';
import 'package:hmg_patient_app_new/features/hmg_services/hmg_services_view_model.dart';
@@ -38,6 +39,7 @@ import 'package:hmg_patient_app_new/presentation/allergies/allergies_list_page.d
import 'package:hmg_patient_app_new/presentation/appointments/my_appointments_page.dart';
import 'package:hmg_patient_app_new/presentation/appointments/my_doctors_page.dart';
import 'package:hmg_patient_app_new/presentation/appointments/widgets/ask_doctor_request_type_select.dart';
+import 'package:hmg_patient_app_new/presentation/ask_doctor/ask_doctor_page.dart';
import 'package:hmg_patient_app_new/presentation/book_appointment/book_appointment_page.dart';
import 'package:hmg_patient_app_new/presentation/book_appointment/doctor_profile_page.dart';
import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/appointment_calendar.dart';
@@ -1347,7 +1349,14 @@ class _MedicalFilePageState extends State {
svgIcon: AppAssets.ask_doctor_medical_file_icon,
isLargeText: true,
iconSize: 36.w,
- ).onPress(() {}),
+ ).onPress(() {
+ getIt.get().initAskDoctorViewModel();
+ Navigator.of(context).push(
+ CustomPageRoute(
+ page: AskDoctorPage(),
+ ),
+ );
+ }),
// MedicalFileCard(
// label: LocaleKeys.internetPairing.tr(context: context),
// textColor: AppColors.blackColor,
diff --git a/lib/presentation/my_invoices/my_invoices_list.dart b/lib/presentation/my_invoices/my_invoices_list.dart
index 9f969e8d..177dde84 100644
--- a/lib/presentation/my_invoices/my_invoices_list.dart
+++ b/lib/presentation/my_invoices/my_invoices_list.dart
@@ -52,7 +52,7 @@ class _MyInvoicesListState extends State {
children: [
SizedBox(height: 24.h),
ListView.builder(
- itemCount: myInvoicesVM.isInvoicesListLoading ? 4 : myInvoicesVM.allInvoicesList.length,
+ itemCount: myInvoicesVM.isInvoicesListLoading ? 4 : myInvoicesVM.allInvoicesList.isEmpty ? 1 : myInvoicesVM.allInvoicesList.length,
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
padding: EdgeInsetsGeometry.zero,
@@ -64,7 +64,7 @@ class _MyInvoicesListState extends State {
index: index,
isLoading: true,
)
- : AnimationConfiguration.staggeredList(
+ : myInvoicesVM.allInvoicesList.isNotEmpty ? AnimationConfiguration.staggeredList(
position: index,
duration: const Duration(milliseconds: 500),
child: SlideAnimation(
@@ -105,7 +105,7 @@ class _MyInvoicesListState extends State {
),
),
),
- );
+ ) : Utils.getNoDataWidget(context);
}).paddingSymmetrical(24.w, 0.h),
],
);
diff --git a/lib/presentation/symptoms_checker/organ_selector_screen.dart b/lib/presentation/symptoms_checker/organ_selector_screen.dart
index e3944c24..9a4a1d96 100644
--- a/lib/presentation/symptoms_checker/organ_selector_screen.dart
+++ b/lib/presentation/symptoms_checker/organ_selector_screen.dart
@@ -99,11 +99,11 @@ class _OrganSelectorPageState extends State {
flipX: _appState.isArabic(),
child: IconButton(
icon: Utils.buildSvgWithAssets(
- icon: AppAssets.arrow_back,
- width: 32.h,
- height: 32.h,
+ icon: AppAssets.forward_top_nav_icon,
+ width: 24.w,
+ height: 24.h,
),
- padding: EdgeInsetsDirectional.only(start: 12),
+ padding: EdgeInsetsDirectional.only(start: 12, end: 12),
onPressed: () => Navigator.pop(context),
highlightColor: Colors.transparent,
),
diff --git a/lib/presentation/symptoms_checker/risk_factors_screen.dart b/lib/presentation/symptoms_checker/risk_factors_screen.dart
index 8264b8b4..484ad2d7 100644
--- a/lib/presentation/symptoms_checker/risk_factors_screen.dart
+++ b/lib/presentation/symptoms_checker/risk_factors_screen.dart
@@ -125,6 +125,7 @@ class _RiskFactorsScreenState extends State {
fontSize: 13.f,
fontWeight: FontWeight.w500,
color: AppColors.greyInfoTextColor,
+ fontFamily: isArabic ? 'GESSTwo' : 'Poppins'
),
children: [
TextSpan(
diff --git a/lib/presentation/symptoms_checker/triage_screen.dart b/lib/presentation/symptoms_checker/triage_screen.dart
index a7975e2c..0811833e 100644
--- a/lib/presentation/symptoms_checker/triage_screen.dart
+++ b/lib/presentation/symptoms_checker/triage_screen.dart
@@ -467,18 +467,14 @@ class _TriagePageState extends State {
text: TextSpan(
text: LocaleKeys.possibleSymptom.tr(context: context),
style: TextStyle(
- color: AppColors.greyTextColor,
- fontWeight: FontWeight.w600,
- fontSize: 14.f,
- ),
+ color: AppColors.greyTextColor, fontWeight: FontWeight.w600, fontSize: 14.f, fontFamily: isArabic ? 'GESSTwo' : 'Poppins'),
children: [
TextSpan(
text: suggestedCondition,
style: TextStyle(
color: AppColors.textColor,
fontWeight: FontWeight.w600,
- fontSize: 14.f,
- ),
+ fontSize: 14.f, fontFamily: isArabic ? 'GESSTwo' : 'Poppins'),
),
],
),
@@ -494,6 +490,7 @@ class _TriagePageState extends State {
text: TextSpan(
text: "${probability.toStringAsFixed(1)}% ",
style: TextStyle(
+ fontFamily: isArabic ? 'GESSTwo' : 'Poppins',
color: AppColors.primaryRedColor,
fontWeight: FontWeight.w600,
fontSize: 14.f,
@@ -505,6 +502,7 @@ class _TriagePageState extends State {
color: AppColors.textColor,
fontWeight: FontWeight.w500,
fontSize: 13.f,
+ fontFamily: isArabic ? 'GESSTwo' : 'Poppins',
),
),
],
diff --git a/lib/presentation/symptoms_checker/user_info_selection.dart b/lib/presentation/symptoms_checker/user_info_selection.dart
index 1d05c5a0..c8d8cde9 100644
--- a/lib/presentation/symptoms_checker/user_info_selection.dart
+++ b/lib/presentation/symptoms_checker/user_info_selection.dart
@@ -282,6 +282,7 @@ class _UserInfoSelectionPageState extends State {
borderColor: Colors.transparent,
textColor: AppColors.primaryRedColor,
fontSize: 16.f,
+ iconSize: 20.w,
),
),
SizedBox(width: 12.w),
@@ -297,6 +298,7 @@ class _UserInfoSelectionPageState extends State {
borderColor: hasEmptyFields ? AppColors.greyLightColor : AppColors.primaryRedColor,
textColor: hasEmptyFields ? AppColors.greyTextColor : AppColors.whiteColor,
fontSize: 16.f,
+ iconSize: 20.w,
),
),
],
diff --git a/lib/widgets/appbar/collapsing_list_view.dart b/lib/widgets/appbar/collapsing_list_view.dart
index 897d2411..3cae1082 100644
--- a/lib/widgets/appbar/collapsing_list_view.dart
+++ b/lib/widgets/appbar/collapsing_list_view.dart
@@ -24,6 +24,7 @@ class CollapsingListView extends StatelessWidget {
VoidCallback? instructions;
VoidCallback? requests;
VoidCallback? sendEmail;
+ VoidCallback? doctorResponse;
Widget? bottomChild;
Widget? trailing;
bool isClose;
@@ -44,6 +45,7 @@ class CollapsingListView extends StatelessWidget {
this.instructions,
this.requests,
this.sendEmail,
+ this.doctorResponse,
this.isLeading = true,
this.trailing,
this.leadingCallback,
@@ -83,6 +85,7 @@ class CollapsingListView extends StatelessWidget {
instructions: instructions,
requests: requests,
sendEmail: sendEmail,
+ doctorResponse: doctorResponse,
bottomChild: bottomChild,
trailing: trailing,
)
@@ -114,6 +117,7 @@ class CollapsingListView extends StatelessWidget {
instructions: instructions,
requests: requests,
sendEmail: sendEmail,
+ doctorResponse: doctorResponse,
bottomChild: bottomChild,
trailing: trailing,
),
@@ -188,6 +192,7 @@ class ScrollAnimatedTitle extends StatefulWidget implements PreferredSizeWidget
VoidCallback? instructions;
VoidCallback? requests;
VoidCallback? sendEmail;
+ VoidCallback? doctorResponse;
Widget? bottomChild;
Widget? trailing;
@@ -203,6 +208,7 @@ class ScrollAnimatedTitle extends StatefulWidget implements PreferredSizeWidget
this.instructions,
this.requests,
this.sendEmail,
+ this.doctorResponse,
this.bottomChild,
this.trailing,
});
@@ -277,6 +283,7 @@ class _ScrollAnimatedTitleState extends State {
if (widget.instructions != null) actionButton(context, t, title: LocaleKeys.instructions.tr(context: context), icon: AppAssets.requests).onPress(widget.instructions!),
if (widget.requests != null) actionButton(context, t, title: LocaleKeys.requests.tr(context: context), icon: AppAssets.insurance_history_icon).onPress(widget.requests!),
if (widget.sendEmail != null) actionButton(context, t, title: LocaleKeys.sendEmail.tr(context: context), icon: AppAssets.email).onPress(widget.sendEmail!),
+ if (widget.doctorResponse != null) actionButton(context, t, title: LocaleKeys.doctorResponses.tr(context: context), icon: AppAssets.doctorResponseIcon).onPress(widget.doctorResponse!),
if (widget.search != null) Utils.buildSvgWithAssets(icon: AppAssets.search_icon).onPress(widget.search!),
if (widget.trailing != null) widget.trailing!,
]
diff --git a/lib/widgets/buttons/custom_button.dart b/lib/widgets/buttons/custom_button.dart
index a81f0ebf..8500ce8e 100644
--- a/lib/widgets/buttons/custom_button.dart
+++ b/lib/widgets/buttons/custom_button.dart
@@ -74,11 +74,9 @@ class CustomButton extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (icon != null)
- Flexible(
- child: Padding(
- padding: text.isNotEmpty ? EdgeInsets.only(right: 4.w, left: 4.w) : EdgeInsets.zero,
- child: Utils.buildSvgWithAssets(icon: icon!, iconColor: iconColor, isDisabled: isDisabled, width: iconS, height: iconS),
- ),
+ Padding(
+ padding: text.isNotEmpty ? EdgeInsets.only(right: 4.w, left: 4.w) : EdgeInsets.zero,
+ child: Utils.buildSvgWithAssets(icon: icon!, iconColor: iconColor, isDisabled: isDisabled, width: iconS, height: iconS),
),
if (text.isNotEmpty)
Text(
diff --git a/pubspec.yaml b/pubspec.yaml
index cdad394c..26903b65 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -115,6 +115,7 @@ flutter:
- assets/images/png/body_parts/female/
- assets/images/svg/
- assets/images/png/
+ - assets/images/clinicIcons/
- assets/images/png/zoom/
- assets/images/png/smartwatches/
- assets/animations/