From d1ac4080ca6eabb63739aee4759d33888ee8819e Mon Sep 17 00:00:00 2001 From: mosazaid Date: Sun, 1 Nov 2020 14:18:04 +0200 Subject: [PATCH 1/4] working on pharmacy home page --- assets/app_icons/config.json | 170 +++++++++++- assets/app_icons/fonts/DQIcons.ttf | Bin 7016 -> 13824 bytes assets/images/pharmacy_module/bg_1.png | Bin 0 -> 2898 bytes assets/images/pharmacy_module/bg_2.png | Bin 0 -> 1463 bytes assets/images/pharmacy_module/bg_3.png | Bin 0 -> 1651 bytes assets/images/pharmacy_module/bg_4.png | Bin 0 -> 1483 bytes .../pharmacy_module/medication_icon.png | Bin 0 -> 2080 bytes assets/images/pharmacy_module/offer_icon.png | Bin 0 -> 4540 bytes .../pharmacy_module/pharmacy_logo_green.png | Bin 0 -> 41399 bytes .../pharmacy_module/prescription_icon.png | Bin 0 -> 1498 bytes .../pharmacy_module/search_scan_icon.png | Bin 0 -> 1090 bytes lib/config/config.dart | 53 ++-- lib/config/localized_values.dart | 31 ++- lib/core/model/pharmacy_module/Customer.dart | 128 +++++++++ .../model/pharmacy_module/Manufacturer.dart | 98 +++++++ .../pharmacy_module/PharmacyImageObject.dart | 27 ++ .../pharmacy_module/PharmacyProduct.dart | 149 ++++++++++ lib/core/model/pharmacy_module/Reviews.dart | 82 ++++++ lib/core/service/client/base_app_client.dart | 34 ++- .../parmacyModule/parmacy_module_service.dart | 72 +++++ .../pharmacy_module_view_model.dart | 59 ++++ lib/d_q_icons_icons.dart | 12 + lib/locator.dart | 12 +- lib/pages/landing/home_page.dart | 11 +- lib/pages/landing/landing_page.dart | 262 +++++++++--------- .../pharmacyModule/pharmacy_module_page.dart | 233 ++++++++++++++++ .../pharmacyModule/widgets/BannerPager.dart | 88 ++++++ .../widgets/ProductTileItem.dart | 107 +++++++ .../widgets/borderedButton.dart | 59 ++++ .../widgets/manufacturerItem.dart | 35 +++ .../rate_appointment_doctor.dart | 2 +- lib/uitl/date_uitl.dart | 1 + lib/uitl/translations_delegate_base.dart | 9 + lib/uitl/utils.dart | 21 ++ lib/widgets/others/app_scaffold_widget.dart | 7 +- pubspec.yaml | 4 + 36 files changed, 1606 insertions(+), 160 deletions(-) create mode 100644 assets/images/pharmacy_module/bg_1.png create mode 100644 assets/images/pharmacy_module/bg_2.png create mode 100644 assets/images/pharmacy_module/bg_3.png create mode 100644 assets/images/pharmacy_module/bg_4.png create mode 100644 assets/images/pharmacy_module/medication_icon.png create mode 100644 assets/images/pharmacy_module/offer_icon.png create mode 100644 assets/images/pharmacy_module/pharmacy_logo_green.png create mode 100644 assets/images/pharmacy_module/prescription_icon.png create mode 100644 assets/images/pharmacy_module/search_scan_icon.png create mode 100644 lib/core/model/pharmacy_module/Customer.dart create mode 100644 lib/core/model/pharmacy_module/Manufacturer.dart create mode 100644 lib/core/model/pharmacy_module/PharmacyImageObject.dart create mode 100644 lib/core/model/pharmacy_module/PharmacyProduct.dart create mode 100644 lib/core/model/pharmacy_module/Reviews.dart create mode 100644 lib/core/service/parmacyModule/parmacy_module_service.dart create mode 100644 lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart create mode 100644 lib/pages/pharmacyModule/pharmacy_module_page.dart create mode 100644 lib/pages/pharmacyModule/widgets/BannerPager.dart create mode 100644 lib/pages/pharmacyModule/widgets/ProductTileItem.dart create mode 100644 lib/pages/pharmacyModule/widgets/borderedButton.dart create mode 100644 lib/pages/pharmacyModule/widgets/manufacturerItem.dart diff --git a/assets/app_icons/config.json b/assets/app_icons/config.json index 4c7eefa6..e0f1051d 100644 --- a/assets/app_icons/config.json +++ b/assets/app_icons/config.json @@ -131,6 +131,174 @@ "search": [ "parking_icon" ] + }, + { + "uid": "03df3404af4fa2db99c8dfb9e9729367", + "css": "more_menu_icon", + "code": 59401, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "", + "width": 222 + }, + "search": [ + "more_menu_icon" + ] + }, + { + "uid": "8882d4d64a842809f1cb078522c9b867", + "css": "offer_icon", + "code": 59402, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1089.5 567L1107.2 972.1 1406.5 924.4 1467.7 530ZM1089.5 567L1107.2 972.1 934 924.4 873.6 530ZM856.1 506L865 588.4 1083.3 622.8 1080.4 541.3ZM1495.6 506L1482 588.4 1083.3 622.8 1080.4 541.3ZM856.1 506L1080.4 541.3 1495.5 506 1221.9 481.9ZM994.9 527.4L1351 493.3 1288 487.7 934 518.2ZM1336 519.5L1100 489.9 1059 492.6 1272.6 524.9ZM882.9 591.2L886 611 1092.9 645.6 1455.7 608.2 1458.4 590.4 1092 622.1 1083.4 622.8ZM1308.7 940L1251.5 949.1 1272.6 524.9 1336 519.5ZM1328.3 381.2C1277.7 331.5 1175.8 491.5 1175.8 491.5L1178.7 502.5S1296.2 431.6 1332.9 428.5C1361.9 426 1361.3 449.9 1331.2 461.8 1303.7 472.6 1178.7 502.5 1178.7 502.5A747 747 0 0 0 1274.4 487.3C1351.9 473.5 1369.4 456.8 1369.9 431.4S1349.7 402.1 1328.3 381.2ZM1274.4 487.2C1349.2 473.9 1368.1 457.9 1369.8 434A63.5 63.5 0 0 0 1332.9 428.4C1361.9 425.9 1361.3 449.9 1331.2 461.7 1303.7 472.5 1178.7 502.4 1178.7 502.4H1178.7A880 880 0 0 0 1274.4 487.2ZM1249 462.9S1245.7 453.6 1229.5 452.2 1212.6 441.2 1212.6 441.1A594.4 594.4 0 0 0 1175.8 491.5L1178.7 502.5S1212.2 482.4 1249 463ZM1023.4 381.2C1073.9 331.5 1175.8 491.5 1175.8 491.5L1172.9 502.5S1055.4 431.6 1018.7 428.5C989.8 426 990.3 449.9 1020.5 461.8 1047.9 472.6 1172.9 502.5 1172.9 502.5A747 747 0 0 1 1077.3 487.3C999.8 473.5 982.2 456.8 981.7 431.4S1002 402.1 1023.4 381.2ZM1077.3 487.2C1002.5 473.9 983.5 457.9 981.9 434A63.5 63.5 0 0 1 1018.7 428.4C989.8 425.9 990.3 449.9 1020.5 461.7 1047.9 472.5 1172.9 502.4 1172.9 502.4H1172.9A880 880 0 0 1 1077.3 487.2ZM1102.6 462.9S1105.9 453.6 1122.1 452.2 1139.1 441.2 1139.1 441.1A595 595 0 0 1 1175.8 491.5L1172.9 502.5S1139.4 482.4 1102.6 463ZM1211.9 506H1135.9A5 5 0 0 1 1131.2 500.7H1131.2A16.4 16.4 0 0 1 1146.7 483.6H1201.1A16.4 16.4 0 0 1 1216.6 500.7H1216.6A5 5 0 0 1 1211.9 506ZM233.4 567L251.1 972.1 550.4 924.4 611.6 530ZM233.4 567L251.1 972.1 78 924.4 17.5 530ZM0 506L8.9 588.4 227.1 622.8 224.2 541.3ZM639.5 506L625.9 588.4 227.1 622.8 224.3 541.3ZM0 506L224.2 541.3 639.4 506 365.8 481.9ZM138.8 527.4L494.9 493.3 431.9 487.7 78 518.2ZM479.9 519.5L243.9 489.9 202.9 492.6 416.5 524.9ZM26.8 591.2L29.8 611 236.8 645.6 599.6 608.2 602.3 590.4 235.9 622.1 227.2 622.8ZM452.6 940L395.4 949.1 416.5 524.9 479.9 519.5ZM116.8 935.2L167.5 949.1 138.8 527.4 77.9 518.2ZM472.2 381.2C421.6 331.5 319.8 491.5 319.8 491.5L322.7 502.5S440.1 431.6 476.8 428.5C505.8 426 505.3 449.9 475.1 461.8 447.6 472.6 322.7 502.5 322.7 502.5A747 747 0 0 0 418.3 487.3C495.8 473.5 513.4 456.8 513.8 431.4S493.6 402.1 472.2 381.2ZM418.3 487.2C493.1 473.9 512.1 457.9 513.7 434A63.5 63.5 0 0 0 476.8 428.4C505.8 425.9 505.3 449.9 475.1 461.7 447.6 472.5 322.7 502.4 322.7 502.4H322.7A880 880 0 0 0 418.3 487.2ZM393 462.9S389.7 453.6 373.4 452.2 356.5 441.2 356.5 441.1A595.1 595.1 0 0 0 319.8 491.5L322.7 502.5S356.2 482.4 393 463ZM167.3 381.2C217.8 331.5 319.7 491.5 319.7 491.5L316.8 502.5S199.3 431.6 162.6 428.5C133.6 426 134.2 449.9 164.3 461.8 191.8 472.6 316.8 502.5 316.8 502.5A747 747 0 0 1 221.1 487.3C143.6 473.5 126.1 456.8 125.6 431.4S145.9 402.1 167.3 381.2ZM221.1 487.2C146.3 473.9 127.4 457.9 125.7 434A63.5 63.5 0 0 1 162.7 428.4C133.7 426 134.3 449.9 164.4 461.7 191.9 472.6 316.9 502.5 316.9 502.5H316.9A880.2 880.2 0 0 1 221.1 487.2ZM246.5 462.9S249.8 453.6 266.1 452.2 283 441.2 283 441.1A594.5 594.5 0 0 1 319.8 491.5L316.8 502.5S283.4 482.4 246.6 463ZM355.8 506H279.8A5 5 0 0 1 275.1 500.7H275.1A16.4 16.4 0 0 1 290.6 483.6H345A16.4 16.4 0 0 1 360.6 500.7H360.6A5 5 0 0 1 355.8 506ZM442.3 310.5L747.8 362.8 1053.3 310.5 747.8 276ZM595.1 336.7L747.8 362.9 900.6 336.7 747.8 319.4ZM905 493.5L868 497A388.3 388.3 0 0 1 1017.1 154.2 341.6 341.6 0 0 0 1005.2 189.2 271.6 271.6 0 0 1 1037.7 188.2 345.8 345.8 0 0 0 905 493.5ZM977.3 471.4L937.5 464.6C958 318.6 1048.8 196.5 1174.5 145.9A349.9 349.9 0 0 0 1153.7 179.4 299.7 299.7 0 0 1 1188.3 187.6 354.4 354.4 0 0 0 977.3 471.4ZM811.4 491.9L773.1 489.4A555.9 555.9 0 0 1 946.6 109.9 504.1 504.1 0 0 0 938.1 175.9 517.9 517.9 0 0 0 811.4 491.9ZM562.9 381.4L599.5 374.8A366.4 366.4 0 0 0 378.9 82.6 185.9 185.9 0 0 0 366.4 121.2 326.3 326.3 0 0 1 562.9 381.4ZM535.3 463.1L574.1 451.5C538.7 309 435.9 199.1 305.7 164.6A338.6 338.6 0 0 1 329.9 195.3 302.9 302.9 0 0 0 296.4 207.8 343.9 343.9 0 0 1 535.3 463.1ZM688.7 486.7L726.8 483A552.6 552.6 0 0 0 543.9 109 503.8 503.8 0 0 1 554 174.7 515.1 515.1 0 0 1 688.7 486.7ZM747.8 362.8V1000L985.2 937.7 1053.3 310.5ZM747.8 362.8V1000L510.4 937.7 442.3 310.5ZM973.1 823S943.9 837.1 937.9 904.5A135.6 135.6 0 0 1 925.4 953.4L848 973.7A166.3 166.3 0 0 0 871.7 919C879 883.9 879.9 875.1 879.9 875.1S884.8 854.4 935.2 826.3A61.6 61.6 0 0 1 973.1 823ZM879.9 875.2A105 105 0 0 1 927.1 804.3C1032.3 744.5 1161.9 869.9 1161.9 869.9L1143.7 867.9 1147.7 889.3 1126.3 886.3 1135.7 907 1115.5 902.6 1120.9 918.9 1099.4 912.9 1096.5 938.4S1034.2 853.5 998.2 838.5A100.5 100.5 0 0 0 879.9 875.2ZM522.5 823.1S550.4 840.7 559.5 909A160.3 160.3 0 0 0 570.1 953.4L647.6 973.9A166.4 166.4 0 0 1 623.9 919.1C616.6 884 615.7 875.3 615.7 875.3S610.8 854.6 560.3 826.5A61.6 61.6 0 0 0 522.5 823.1ZM615.7 875.3A105.1 105.1 0 0 0 568.5 804.4C463.3 744.7 333.7 870.1 333.7 870.1L351.9 868.1 347.8 889.5 369.3 886.5 359.9 907.2 380.1 902.8 374.7 919 396.2 913.1 399.1 938.6S463.9 854.9 499.8 839.8A96.5 96.5 0 0 1 615.7 875.3ZM463.6 75.2A38.7 38.7 0 0 0 437.4 56.9L441.1 31.4A62 62 0 0 1 482.9 60.6ZM902.8 42.4A41.8 41.8 0 0 0 882.1 67.7L859.9 59.4A66.8 66.8 0 0 1 893.1 18.9ZM1096.4 123.4A32.9 32.9 0 0 0 1070.9 134.7L1056.2 118.6A52.7 52.7 0 0 1 1096.9 100.4ZM773.5 28.6A41.4 41.4 0 0 0 768.4 58.4L748.3 63.4A66.3 66.3 0 0 1 756.3 15.8ZM632.6 122.7A38.6 38.6 0 0 0 617.6 97.3L629.1 78.3A61.8 61.8 0 0 1 653 118.9ZM206 205.9A34.3 34.3 0 0 0 179.8 193.4Q179.8 181.5 179.8 169.6A55 55 0 0 1 221.6 189.6ZM1171.1 285.2A61.2 61.2 0 0 0 1138.9 287.6 83.4 83.4 0 0 1 1197.3 250.9Q1198.5 262.3 1199.6 273.8A60.3 60.3 0 0 0 1171.1 285.2ZM828.8 208.3A75.2 75.2 0 0 0 810.9 238.1 102.1 102.1 0 0 1 819.9 164.4L837.8 176.3A75.9 75.9 0 0 0 828.8 208.3ZM284 117.2A61.7 61.7 0 0 1 315.8 123.5 85.9 85.9 0 0 0 261.4 79.7L256.8 102.2A61.8 61.8 0 0 1 284 117.2ZM278.4 313.3A59.7 59.7 0 0 1 350.7 314.2L360.8 305.2A64.5 64.5 0 0 0 264.1 293.9ZM221.7 4.5L253 0 274.9 19.2 223.6 20.3ZM728.1 145.8L739 178.5 726.9 206.3 714.7 151.2ZM1240.6 60.6L1209.4 66.5 1193.7 92.1 1243 76.4Z", + "width": 1496 + }, + "search": [ + "offer_icon" + ] + }, + { + "uid": "48bf5922e89257ff0ba5f3ae4a47297d", + "css": "prescription_icon", + "code": 59403, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M466 297H414.1V245A19.5 19.5 0 1 0 374.9 245V297H323A19.5 19.5 0 0 0 323 336.1H374.9V388A19.5 19.5 0 0 0 414.1 388V336.1H466A19.5 19.5 0 1 0 466 297ZM394.5 144.6A171.9 171.9 0 1 0 566.4 316.5 172.1 172.1 0 0 0 394.5 144.6ZM394.5 449.3A132.8 132.8 0 1 1 527.3 316.5 133 133 0 0 1 394.5 449.3ZM783.4 179.6L609.5 5.7A19.5 19.5 0 0 0 595.7 0H58.6A58.7 58.7 0 0 0 0 58.6V941.4A58.7 58.7 0 0 0 58.6 1000H431.7A19.5 19.5 0 1 0 431.7 960.8H58.6A19.6 19.6 0 0 1 39.2 941.4V58.6A19.6 19.6 0 0 1 58.7 39.1H576.2V154.2A58.7 58.7 0 0 0 634.8 212.8H750.1V560.5A19.5 19.5 0 1 0 789.2 560.5V193.4A19.5 19.5 0 0 0 783.4 179.6ZM634.8 173.8A19.6 19.6 0 0 1 615.2 154.3V66.7L722.4 173.8H634.8ZM644.5 546.9H305.3A19.5 19.5 0 0 0 305.3 586.1H644.5A19.5 19.5 0 0 0 644.5 546.9ZM208.2 546.9H144.5A19.5 19.5 0 0 0 144.5 586.1H208.2A19.5 19.5 0 0 0 208.2 546.9ZM500 656.3H305.3A19.5 19.5 0 0 0 305.3 695.4H500A19.5 19.5 0 1 0 500 656.3ZM208.2 656.3H144.5A19.5 19.5 0 0 0 144.5 695.4H208.2A19.5 19.5 0 0 0 208.2 656.3ZM319.1 771.4A19.5 19.5 0 1 0 324.9 785.2 19.6 19.6 0 0 0 319.1 771.4ZM208.2 765.6H144.5A19.5 19.5 0 1 0 144.5 804.8H208.2A19.5 19.5 0 1 0 208.2 765.6ZM879 757.8A121.3 121.3 0 0 0 862.1 759 121.1 121.1 0 0 0 660.5 638.6L505.8 793.3A121.1 121.1 0 0 0 677 964.5L758 883.6A121.1 121.1 0 1 0 878.9 757.9ZM649.4 936.9A82 82 0 1 1 533.4 820.9L597 757.4 713 873.4ZM740.6 845.8L624.6 729.8 688.1 666.2A82 82 0 1 1 804.1 782.2ZM859.4 958.6A82 82 0 0 1 859.4 799.3ZM898.6 958.6V799.3A82 82 0 0 1 898.6 958.6Z", + "width": 1000 + }, + "search": [ + "prescription_icon" + ] + }, + { + "uid": "fce0d47a8f283966d22c8450b4c63f70", + "css": "search_scan_icon", + "code": 59404, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M846.2 544.3A19.5 19.5 0 0 1 828.4 532.9 74.4 74.4 0 0 0 729.8 496.2 19.5 19.5 0 0 1 713.5 460.7 113.5 113.5 0 0 1 863.9 516.6 19.5 19.5 0 0 1 846.2 544.3ZM185.6 174.1V500A19.5 19.5 0 0 0 224.7 500V174.1A19.5 19.5 0 0 0 185.6 174.1ZM305.5 465.2V174.1A19.5 19.5 0 0 0 266.4 174.1V465.2A19.5 19.5 0 0 0 305.5 465.2ZM347.2 454.6A19.5 19.5 0 0 0 386.3 454.6V453.1A19.5 19.5 0 1 0 347.2 453.1ZM366.7 389.9A19.5 19.5 0 0 0 386.2 370.4V174.1A19.5 19.5 0 0 0 347.2 174.1V370.4A19.5 19.5 0 0 0 366.7 389.9ZM467 500V174.1A19.5 19.5 0 0 0 428 174.1V500A19.5 19.5 0 1 0 467 500ZM528.3 389.9A19.5 19.5 0 0 0 547.8 370.4V174.1A19.5 19.5 0 1 0 508.7 174.1V370.4A19.5 19.5 0 0 0 528.3 389.9ZM508.7 454.6A19.5 19.5 0 0 0 547.8 454.6V453.1A19.5 19.5 0 1 0 508.7 453.1ZM249.5 96.4A19.5 19.5 0 0 0 230 76.9H96.3A19.5 19.5 0 0 0 76.8 96.4V230.3A19.5 19.5 0 1 0 115.9 230.3V116H230A19.5 19.5 0 0 0 249.5 96.4ZM76.8 597.8A19.5 19.5 0 0 0 96.3 617.3H230A19.5 19.5 0 0 0 230 578.2H115.9V463.9A19.5 19.5 0 1 0 76.8 463.9ZM798.7 249.8A19.5 19.5 0 0 0 818.2 230.3V96.4A19.5 19.5 0 0 0 798.7 76.9H665A19.5 19.5 0 0 0 665 116H779.1V230.3A19.5 19.5 0 0 0 798.7 249.8ZM993.4 896.6L944.6 790.7A19.5 19.5 0 0 0 918.7 781.1L888.1 795.2 859.6 732.9A196 196 0 0 0 895 421.4V52.9A52.9 52.9 0 0 0 842.3 0H52.8A52.9 52.9 0 0 0-0.1 52.9V259.3A19.5 19.5 0 0 0 39 259.3V52.9A13.8 13.8 0 0 1 52.7 39.1H842.3A13.8 13.8 0 0 1 856 52.9V392.8A198.1 198.1 0 0 0 829.1 380.3 193.8 193.8 0 0 0 709.5 374.9V174.1A19.5 19.5 0 1 0 670.4 174.1V390.5A194.3 194.3 0 0 0 628.6 419.9V174.1A19.5 19.5 0 0 0 589.5 174.1V469.9A195.7 195.7 0 0 0 583.2 645.4C584.7 648.7 586.3 651.9 588 655.1H52.8A13.8 13.8 0 0 1 39.1 641.3V434.9A19.5 19.5 0 1 0-0.1 434.9V641.4A52.9 52.9 0 0 0 52.7 694.3H614.8A194.8 194.8 0 0 0 824 749.2L852.5 811.7 821.8 825.9A19.5 19.5 0 0 0 812.3 851.8L861 957.8A72.8 72.8 0 0 0 993.3 896.8ZM826 706.4A156.2 156.2 0 0 1 618.7 629.2 156.9 156.9 0 0 1 695.8 421.5 156.5 156.5 0 0 1 862.7 444.9L863.1 445.3A156.9 156.9 0 0 1 826 706.4ZM941.3 957.8A33.2 33.2 0 0 1 915.7 958.8 33.6 33.6 0 0 1 896.6 941.3L856 853 917.3 824.9 957.8 913A33.9 33.9 0 0 1 941.2 958ZM19.5 366.7A19.5 19.5 0 1 0-0.1 347V347A19.5 19.5 0 0 0 19.5 366.7Z", + "width": 1000 + }, + "search": [ + "search_scan_icon" + ] + }, + { + "uid": "4aab61c6fa11812333db81c2bb204c83", + "css": "share_icon", + "code": 59405, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M872.7 173.8A139.7 139.7 0 1 1 732.9 34.1 139.7 139.7 0 0 1 872.7 173.8ZM313.7 500A139.7 139.7 0 1 1 173.8 360.2 139.7 139.7 0 0 1 313.7 500ZM872.7 826.1A139.7 139.7 0 1 1 732.9 686.4 139.7 139.7 0 0 1 872.7 826.1ZM294.6 570.3L612.8 755.8M612.3 244.2L294.6 429.7", + "width": 907 + }, + "search": [ + "share_icon" + ] + }, + { + "uid": "65fb587059226e09ea7e14cd39772bb1", + "css": "wishlist_add_icon", + "code": 59406, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M785.4 0A320.4 320.4 0 0 0 541.7 114.3 320.4 320.4 0 0 0 297.9 0 294.5 294.5 0 0 0 0 299.7C0 506.8 184.1 673 463 929.4L541.7 1000.3 620.4 929.4C899.2 673.2 1083.4 507.1 1083.4 299.7A294.5 294.5 0 0 0 785.4 0Z", + "width": 1083 + }, + "search": [ + "wishlist_add_icon" + ] + }, + { + "uid": "c752092fa3a1a55f5bc0ae60f4beb4c7", + "css": "wishlist_icon", + "code": 59407, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M785.4 0A320.4 320.4 0 0 0 541.7 114.3 320.4 320.4 0 0 0 297.9 0 294.5 294.5 0 0 0 0 299.7C0 506.8 184.1 673 463 929.4L541.7 1000.3 620.4 929.4C899.2 673.2 1083.4 507.1 1083.4 299.7A294.5 294.5 0 0 0 785.4 0ZM575 857.5L564 867.7 541.6 888 519.2 867.7 508.2 857.5A3310.1 3310.1 0 0 1 188.7 539.8 382.1 382.1 0 0 1 83.6 299.7 216.7 216.7 0 0 1 145.4 145.3 211.9 211.9 0 0 1 298 83.4 238.8 238.8 0 0 1 478 168L541.7 243.8 605.5 168A237.9 237.9 0 0 1 785.4 83.4 212.9 212.9 0 0 1 938.3 145.3 217.1 217.1 0 0 1 1000.1 299.7 384.1 384.1 0 0 1 894.8 539.8 3316.8 3316.8 0 0 1 575 857.5Z", + "width": 1083 + }, + "search": [ + "wishlist_icon" + ] + }, + { + "uid": "88b990d06e49752b331bb5c6704b3d42", + "css": "bg_1", + "code": 59408, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M80.6 6.2H2052.5A74.4 74.4 0 0 1 2126.9 80.6V923.9A74.4 74.4 0 0 1 2052.5 998.3H80.6A74.4 74.4 0 0 1 6.2 923.9V80.6A74.4 74.4 0 0 1 80.6 6.2ZM1063.2 993.8H1037.3L1039 992.1 1036 993.8H987.3L1020.5 981.6 889 993.8H29.8A52.5 52.5 0 0 1 6.2 946.5V867.8L1027.4 962.7 6.2 565.1V321L1034.3 947 89.8 6.2H367.8L1039.9 927.1 645.9 6.2H809L1059.9 937.4 996.5 6.2H1136.5L1074.3 920.2V920.2L1335.1 6.2H1499.5L1081.7 942.6 1765.2 6.2H2043.3L1103.6 942.1V942.1L1103.6 942.1 2126.9 344.5V586.4L1102.1 963.1 2126.9 867.9V946.5A52.5 52.5 0 0 1 2103.3 993.8H1243.6L1103.2 980.8 1136.7 993.8H1063.2Z", + "width": 2133 + }, + "search": [ + "bg_1" + ] + }, + { + "uid": "ace5228aabf92ff4bf5524cef4c6409f", + "css": "bg_2", + "code": 59409, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M75 1000A75 75 0 0 1 0 925V75A75 75 0 0 1 75 0H2062.5A75 75 0 0 1 2137.5 75V925A75 75 0 0 1 2062.5 1000ZM2142 792.6C2084.5 793.1 2087.9 773.2 2043.5 760.2S1990.1 764.4 1953.4 739.3 1930.2 698.9 1905.4 667 1863.7 645 1847.6 605.3 1850.5 559.6 1845.2 519.5 1820.1 479 1824.9 436.1 1848.9 397.8 1863.1 360.3 1860.4 312.2 1886.3 277.7 1926 257.1 1960.1 232.7 1984.7 190.3 2031.5 175.4 2082.4 179.8 2136.4 179.3M2141.7 750.7C2091.8 751.2 2095.1 731.3 2057.1 720.2S2009.8 726.4 1977.9 704.4 1959.6 667.4 1938.2 640 1900 622.7 1886 588.1 1890.9 547.8 1886.4 513.3 1862.3 478.7 1866.5 441.5 1889.7 409.1 1902 376.8 1897.2 334 1919.7 304.1 1956 288 1985.3 267.1 2005.1 228.2 2045.8 215.3 2090.2 221.5 2136.6 221.1M2141.3 711.9C2098.5 712.2 2101.8 692.5 2069.6 683S2028.1 690.9 2000.7 672 1987 638.3 1968.8 615 1933.8 601.9 1921.9 572.2 1928.8 536.8 1925 507.6 1901.4 478.2 1905.1 446.4 1927.7 419.2 1938.2 391.9 1931.5 354 1950.6 328.4 1983.7 316.9 2008.8 298.9 2024.1 263.2 2059.1 252.3 2097.8 260.4 2137.1 260M742.2 1004.9C740.7 947.4 760.5 950.5 772.8 905.9S767.6 852.6 792.1 815.5 832 791.6 863.4 766.3 884.6 724.1 924.1 707.4 969.8 709.4 1009.8 703.4 1049.8 677.6 1092.7 681.7 1131.4 704.9 1169.1 718.5 1217.1 714.9 1252.1 740.1 1273.4 779.4 1298.4 813.1 1341.2 837 1356.9 883.4 1353.5 934.3 1354.9 988.3M784 1003.8C782.6 954 802.5 956.9 813 918.7S806 871.7 827.4 839.3 864 820.4 890.9 798.5 907.6 760 941.9 745.4 982.3 749.6 1016.6 744.5 1050.8 719.8 1088 723.3 1120.9 745.9 1153.4 757.6 1196 752.1 1226.4 774 1243.1 810 1264.5 838.9 1303.7 858 1317.4 898.4 1311.9 942.9 1313.1 989.2M822.8 1002.7C821.7 960 841.5 962.9 850.4 930.5S841.7 889.3 860.1 861.5 893.5 847.3 916.5 828.7 929 793.4 958.4 781 993.9 787.3 1023.1 782.9 1052 758.8 1083.9 762 1111.4 784.1 1138.9 794 1176.6 786.6 1202.5 805.4 1214.7 838.2 1233.1 862.9 1269 877.6 1280.6 912.4 1273.2 951.2 1274.3 990.5", + "width": 2138 + }, + "search": [ + "bg_2" + ] + }, + { + "uid": "0887f8af7107badceb2618215c9d8053", + "css": "bg_3", + "code": 59410, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M808.5 441.7C833.6 416.6 869 452 894.1 426.9S883.8 366.4 908.9 341.3 969.4 351.6 994.5 326.4 984.2 266 1009.4 240.9 1069.8 251.1 1094.9 226 1084.7 165.5 1109.8 140.4 1170.3 150.6 1195.4 125.5 1185.2 65.1 1210.3 39.9 1270.8 50.1 1295.9 25M85.1 848.6C120.5 851.1 117 901 152.4 903.5S191.3 856.1 226.7 858.5 258.7 910.9 294.1 913.4 333 866 368.4 868.4 400.4 920.8 435.8 923.3 474.7 875.9 510.2 878.3 542.1 930.7 577.5 933.2 616.5 885.8 651.9 888.3 683.9 940.6 719.4 943.1", + "width": 2138 + }, + "search": [ + "bg_3" + ] + }, + { + "uid": "15d14398ff70be8823b96215f803bf80", + "css": "bg_4", + "code": 59411, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1546 479.2C1571.1 454.1 1606.5 489.5 1631.6 464.4S1621.3 403.9 1646.4 378.8 1706.9 389.1 1732 363.9 1721.7 303.5 1746.9 278.4 1807.3 288.6 1832.4 263.5 1822.2 203 1847.3 177.9 1907.8 188.1 1932.9 163 1922.7 102.6 1947.8 77.4 2008.3 87.6 2033.4 62.5M1354.2 796L1262.5 743.1V849ZM1549.7 796L1458.1 743.1V849ZM1745.3 796L1653.6 743.1V849Z", + "width": 2138 + }, + "search": [ + "bg_4" + ] + }, + { + "uid": "1ad61f1d7131991dd2361861dd272499", + "css": "medication_icon", + "code": 59412, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M578.7 308A105.9 105.9 0 0 0 476.3 229.1 106.8 106.8 0 0 0 384.1 282.2L317.1 398.2V398.2L250.1 514.2A106.3 106.3 0 0 0 428.9 628.6Q429.2 628.2 429.4 627.8L568.1 388.5A105.3 105.3 0 0 0 578.7 308ZM411.4 616.8A85.1 85.1 0 0 1 268.4 524.8L330.1 418 353 431.2H353L477.4 503ZM549.8 377.9L487.9 484.6 372.7 418.1 402.3 366.9A10.6 10.6 0 0 0 383.9 356.3L354.4 407.6 340.6 399.6 402.3 292.8A85.6 85.6 0 0 1 476.3 250.3 85.1 85.1 0 0 1 549.6 377.8ZM718.7 591.9A407.8 407.8 0 0 0 526.8 591.9C496.1 600.6 480.5 613 480.5 628.6 480.5 628.6 480.5 628.6 480.5 628.6V722.6C480.5 738.4 496 750.6 526.7 759.4A409.2 409.2 0 0 0 718.7 759.4C749.4 750.7 765 738.3 765 722.6V628.6L765 628.6C765 613 749.4 600.7 718.7 591.9ZM532.6 612.2A387.3 387.3 0 0 1 712.8 612.2C738.3 619.5 743.8 627.4 743.8 628.6H743.8C743.8 629.9 738.3 637.7 712.9 645A387.3 387.3 0 0 1 532.6 645C507 637.7 501.6 629.9 501.6 628.6S507 619.5 532.6 612.2ZM743.8 722.7C743.8 724.2 738.3 731.9 712.9 739.1A388.7 388.7 0 0 1 532.5 739.1C507.1 731.9 501.6 724.2 501.6 722.7V655.7A130.1 130.1 0 0 0 526.8 665.4 407.7 407.7 0 0 0 718.7 665.4 130.2 130.2 0 0 0 743.8 655.7V682.1A222 222 0 0 1 688.6 699.8 10.6 10.6 0 1 0 692.6 720.6 257.9 257.9 0 0 0 743.8 705.4ZM414.4 324.9A10.6 10.6 0 0 0 399.9 328.8L399.7 329.1A10.6 10.6 0 1 0 418.1 339.6L418.2 339.3A10.6 10.6 0 0 0 414.4 324.9ZM669.4 713.7A10.6 10.6 0 0 0 657.8 704.2H657.6A10.6 10.6 0 0 0 658.6 725.3L659.6 725.3 659.9 725.3A10.6 10.6 0 0 0 669.4 713.7ZM999.5 500A500 500 0 0 1 499.5 1000 35.7 35.7 0 1 1 499.5 928.6 428.6 428.6 0 0 0 821 217.1V250A35.7 35.7 0 0 1 749.5 250V107.1A35.7 35.7 0 0 1 785.2 71.4H928.1A35.7 35.7 0 1 1 928.1 142.9H820.9V145.7A35.7 35.7 0 0 1 860.2 153.9 496.8 496.8 0 0 1 999.5 500ZM213.8 678.6A35.7 35.7 0 0 0 178.1 714.3V782.9A428.6 428.6 0 0 1 499.5 71.4 35.7 35.7 0 1 0 499.5 0 500 500 0 0 0 116.9 821.4H70.9A35.7 35.7 0 1 0 70.9 892.8H213.8A35.7 35.7 0 0 0 249.6 857.2V714.3A35.7 35.7 0 0 0 213.8 678.6Z", + "width": 1000 + }, + "search": [ + "medication_icon" + ] } ] -} +} \ No newline at end of file diff --git a/assets/app_icons/fonts/DQIcons.ttf b/assets/app_icons/fonts/DQIcons.ttf index 8365db4766e73d654150b1de29fba2b30ceaaf6b..474ea22c23043d46a05e307809bdb7ba605add04 100644 GIT binary patch delta 7320 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 delta 441 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 literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/bg_2.png b/assets/images/pharmacy_module/bg_2.png new file mode 100644 index 0000000000000000000000000000000000000000..96cfd3bc7fa1b57db632233ed49f7d44f31cb2b4 GIT binary patch literal 1463 zcmV;o1xWgdP)Wms`#SaD@nab;L>Wms`#SaD@oab;L?W?6G* zT61SxbZA?2XMZDDzCVtQ|4dT(QUaAbUNWPEXD zeR5|1|Nnu;@7MqU01$LiPE!B|2ODf{ZpO#R$;LhOpf%TAeF{~@YmQV{UgjH~xE7lMe9qUT?5|-tE4*ch^)(2QM^d#yMz75YU zd5u;*n=Xk}0uvN4hdOk&RHB$S==SF!lb>LT8ypq7+QIS;#i%(hfxR%?Vioau%6(d_b?y~3k_hkJBWY> zquj$?{2~wini7QSeHILytp+)>d6X}y1q%c;dk3D|9W@lMcLdQ;Fb_Qrt9^&% zH+anChckQV1EfKP5W94pW6$dCD%Z1PeZxZ^M1ryw1cQAb`m6{Wk9EI?K5!O5GfE!B zdJiS0!8#QQGVbqyuWPKkNAnC=2R-zWSestqD^H@{O^S8fLm%e~AjD$057a(fXQQ*8 z;l2Y+*q~{k!KR1ZD-4?b9KEDTW2uSFY(-J@BG}S7W2sSArb}*>Si~Y+ z%=wNpM1GbODq&k#CyAvdD{O%rZj$IXN9l~Q)Of}sudPM6K$fP7rFz$vtxJ$C*Cs&O zOFK~(b?@H6o%2 zuxARW`H*lvk`2wr-^Z#pTNBp$Y0}F#QCsz{mPQX0l~xC^mSbY6S^%qI1GSUMN(ZW# zpi`%Du~crL)-s!Sk=wse>k97-SdScpiVVuHN}LciPXacLilr32o*u7PzvSM2Z8X?4 zDwbO3kG^j*DTKl&06UHYR(r0y7es05?*n)3);h2KavV^A`vF+j(cf6CW8N+Ia%j1lXc~yBk6C~1 ze`kMxETx_{95O%q#Y!91v_7Ser^ixWx-Kb)kVS2*+PXjvh+-^Ul zbbWhbETsihJLtf;lgqgNdV8HxN*``MeK{qTQiCeW0ZmgHb>qdC-)}yo^e=|lZUn{i R^F#mu002ovPDHLkV1jpIv|9iG literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/bg_3.png b/assets/images/pharmacy_module/bg_3.png new file mode 100644 index 0000000000000000000000000000000000000000..127c266984f68af8a40dc6f9aa0b95d0d7282ef4 GIT binary patch literal 1651 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 literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/medication_icon.png b/assets/images/pharmacy_module/medication_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..95851e4ec9be696a0ad3a16d2100e2159f6aa9e2 GIT binary patch literal 2080 zcmV+*2;cXKP)pk>)xKmY5*<;t_98oDkYltXpihJfjUP0Yr$Si@r?SuuF^G>ZJ-_n+y{KJ zLDluZbHE~CE${}g71$g?c&n`3O!l?FcYwYPs;&X92_YvekQpXv?j(M{OU zNcM5+{t~0*`LY6fsCTI?H3SaZV4^n4VA!$*ksa@tFs~EXkeN%l(Jw+Xo`}HYG+D-jk6$7`Zjhs%0qd`wTs+L*4 z{zrOS6|z^=6Fb3%BKkBMu0JkIIKj4_Y?C^)lWZuWQ;|7&c~P>#>KjSpE$W9l*^Wkf zrABU2cO+$7)j>tbo=h6H*p4}t+l(RQIZvWaT~8HC6O(>uuFbt9+49HEG~P^)2hnW8)h9clBo_c)P2k zOv1)YUW$vV5j>q#npeuQ13bOe4eIv_)SakqSKGbiQ=d!pUyxQBr2Z$VbZ(OZZ!*re zfi~C}t4C(C+P(G~9bAf`aA1>rCD1L`W(`ofC$nMnUE+4AJJ4u1vOD|li12V0@Jdp4 zVBO3nY92Q?BgN=!W~*naD+<&fqwcY2tl5}vYGTKV))ybJ?H1~|CIpeF{ zpv^<-%qHxq#WysuqeUIi8p7qVwh8iz`Zslk`UT_epzhL;_4YpXwC2sK%DXwS=Q7kO zN#Vmy5MQajlPSGJy|F?4R&V&r=FO?eo$j1&NBwP5czsFIL)6#QZ>l4+q57tJy?RiM zHlHuj+s(k3e#zqz)ITSMpD0OshcUA0kv#|F`uDQBTAi5GKiC-QT-TAt<@hHh_AEht zDJdLTf^dj&hu$VuG=^@sWW)Fwby!w@dnU7IM;e!to92QxqHaqHPbxt;Q+=XAo#Tu< z_r2;VoB|9a&ZUEaUBH{bCSV1y z444x__*X%BXC}|9f^m&|Dp$BMgfO@si#ixs2b>;4SX!svFklHVE`%`OxZC(CFgY_~ zNoL4K;}sIfX5!Rn#YEJ@ZHr^;5oKh*GNv!8dShc` z^St^{uIv`$hI(A)p&P;&L5(%$aq7-#<8eVA`_=xH5W?%g3rYRS1>}Dn*bgkqJX$3a zR8hwh&n7FtHMurN0!IOpfYCNcOJ+SkDyx5V*0vr}y_bg&wzTF}9t1|@UVc%%Ereh# zwh+QjV~S)d@C2|c8!AT-=hk%K`&EY5Qs7wNS)ih>BhK;d#7sdi;&2^Abb>9wY@+X| ziR>ePE-9V~*-5i{4Dn<*pT-*-LYSKnokW};3qlC{a^;5*mzBeTEx^JM!j3A6Opo6u zTxE=1Pv-v}Paojz%;4967lD-_ggwS>StW$V>)IujJ~F0frY< zwhXd4JzG74=y|UO<`btxEldK=NXqW4C17FlHU8m&ed5aG-N%|R;8x?kg1VujdUj@P z@9cS0CVy&`y1i_hL0@Xld#6d=8-Y2w=MMuv0y=7gdneJE%u_cIoyl@y)U|^c1oX{* z&*O%AP80R<sCcLJpv$8M0-gxx3K6{>J zyo_;$@mftap3m48j}=j1fNe8g+thz|l#v|)b+~bVnn$to$&BDUYhP!1*NrrK-A#!; zEoLWODJn_he(LGOweAmHp>SEKBZz^-5y`8cgb?Z{s?{$W^QJ}7w5!g-)uTGgJqUHqj^`Le!B_d7OEFoFjZ0u?YebQ5_=2O z5m-qamJgK3&euhk%}HavW(F{Un3dZJYy(yUtB9$`xg}DMh4Ej*k8ke>#I$$-0000< KMNUMnLSTZ_nEP7* literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/offer_icon.png b/assets/images/pharmacy_module/offer_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..64db2b76da01e2797ea12705102fa12f16e90877 GIT binary patch literal 4540 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 literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/prescription_icon.png b/assets/images/pharmacy_module/prescription_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..740004c7bd99820ec858f10c14d1386254af4ecf GIT binary patch literal 1498 zcmV<01tt24P)KYK~!jg&6-HKR;3OG_dn?M8|@MJ6O-78-_P zq|}2E6utTo1rZdfL^mp=QX%yr^HQcLqGsT2rY0>*!^=21W@+j;zaG}No#pQAJ^S1o z|FGF-t?#z}XRYunUNyT`U@0&G=nHfL1_93ib*6Iycp$Lt6Ufr=Vb=CI07;F` zxxN_*%#pN6QnREdopY-b^r|GiCh0{6Nm4ie@ zRz<@kdoRpt;G8=x=_4yXmS?<7sLHAcR7e^osVUmD0aGO1XezhadkQ|+w@O;!oNJJ@ zF{V>eWF{f0hv^@eB%qt5&m~pH^kxR1Yb8At*+{y&ux6$s9}*`ewMgnCNzS={fN7Ej znS83Gk@7?5C#zd!@2K$+nUW$i3FllZP%mi&Fx)v;=bXDZ`GDc_B$henzKWSg>qPNq zhaAXvVlTJ%b6E|5u4)@%EAot&IY>S!wjXc`I1h}8$>v%r9TclyXfZMoDEm4QG#31J zqBcdZ3V6eGn}ER?{gwy#&s=Pw@MpX_6+&FM2&C9g+0Cq-B!UIOixdMrIV+6Xil7J&|vUy&{n~oPf@f z!einw=iI?S-b2!mBICD6+U=ZcEyhXOoLDdE?x1`YxXwA(XytlI*Ax@nFi+B3LHSJV z-7eBdESB_lP(C2(L{NTT(mh!NCE%RecDNC?NqR!k=B!TgKAx5fKwn8?B@K|&C~1Rp z?od|a4$V&ZlivdTkvGHz;8UPi7AGA>0_Xv3u{NB--<-?`7Sr}qLmkkkJx4i7n6rKO z!~cF@9sZUglD`+o(w-f_$OHmgE&dMR+L*j2@QukoE0o07vF>dGdIs_=cSq5%m>Bb2 z6A;)A)Fia627jT}N^EzWl|+So8_`o8lUK#$Nl*7e2n70Xo9@gcox~Jt3($!ac}to+ zp+Pm0R!bTssXEQOFbQy3NbJfnNe2Y-qrlD#1i~zIaSq_mBZ)+S zF2J`r+7Mw4QKCs9aVPLn&=Zqm^3lK@?GSLls-#JrM8pWJGrPmqbI}28Hqc<7HvpAo zUF?9z&Hs-C={ctJbVwuzfx)JC(CVu3!)&jWXO)}8O7ow32OA@@GZ->+1D%T`to%sS z8|5bP3x1)>*$Xk2;+>Oh-29vlB=x_Ctt!^LC z+v>uJ-35Og1TarPBYrP`eHlnp0N+`#Ex^6_v|9m;0e*-RFgq6`Hxc;5%Hsn9yMfN( zUFlii&k{Wwflk(--uQeT;WTh2C~qdmpJVWw$Ivd0J;1=QOBc}g8*(YoKrnoOO8mmM z7N7eMe*xQo7efF40T@-7YVv`P3;+NC07*qoM6N<$f}yj+ A761SM literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/search_scan_icon.png b/assets/images/pharmacy_module/search_scan_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d168b0e665eb4e591866e699b15a767b2d702fc0 GIT binary patch literal 1090 zcmV-I1ikx-P)}>0*#I;S_ek1|plr zpn@!d#Pp%?rH4uogEGu|3GD(>FNzamG`$&JBs06~pn-v7l#^lQCA9hVu-7^5*>ldB zInH?YA2w_4?^|o_-}%m7Ykg~@cBuQzSO2P?tCx{cQ1=7p0Pg|A*#>n|Bk(xT8$wt- z!V`bN+FY8?%cucp2mU_$IA^AY z5W-)1LsU~CPW?rBgH%!jumd^~qRYno3Ih z)S06Il6JGzo$9dKo%R)grg#B-29%8qa3WPU0rvoHW!lXl*&>VM1M~u2A%sKf3iT)T zxcZ~|G_V(#59|isR4+->ml9U>clGTG5o}cNP(zsrlp>h1Z;Lr!OUkxM{ZxHR{Wdz z>^D7@Ct)<;8j{2`tM6-k2qbCSFmMaWd1So06*vkE05EFSOrqj!9aNjg*}g5V%kLCz zLH&dzYG)Fqv2+p1@nAy;VaXV9jU>BF2QWK?uoservN9l%D+Ai4?y|DVetsFXZPfv^4Y(R; zAvp`}0{Tea*S2c8VQx~pV-#1Z8`YQdW*Q;&wz%A-bxqz}z=)jjsL3ak>(!I$ro7pJ z(&SNnDrMUcXZ59dvK3(p>K=8!Iwjg>nPk_m@{vf0<r;0c8XD!_0;*nE(I)07*qo IM6N<$f^Q53M*si- literal 0 HcmV?d00001 diff --git a/lib/config/config.dart b/lib/config/config.dart index 40ffc502..457a1a76 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -6,7 +6,8 @@ import 'package:diplomaticquarterapp/widgets/mobile-no/mobile_no.dart'; const MAX_SMALL_SCREEN = 660; -const BASE_URL = 'https://uat.hmgwebservices.com/'; +// const BASE_URL = 'https://hmgwebservices.com/'; +const BASE_URL = 'https://uat.hmgwebservices.com//'; const GET_PROJECT = 'Services/Lists.svc/REST/GetProject'; @@ -57,11 +58,16 @@ const GET_NEAREST_HOSPITAL = 'Services/Patients.svc/REST/Patient_GetProjectAvgERWaitingTime'; ///Er Nearest -const GET_AMBULANCE_REQUEST = 'Services/Patients.svc/REST/PatientER_RRT_GetAllTransportationMethod'; -const GET_PATIENT_ALL_PRES_ORDERS= 'Services/Patients.svc/REST/PatientER_GetPatientAllPresOrders'; -const GET_PICK_UP_REQUEST_BY_PRES_ORDER_ID= 'Services/Patients.svc/REST/PatientER_RRT_GetPickUpRequestByPresOrderID'; -const UPDATE_PRESS_ORDER = 'Services/Patients.svc/REST/PatientER_UpdatePresOrder'; -const INSERT_ER_INERT_PRES_ORDER = 'Services/Patients.svc/REST/PatientER_InsertPresOrder'; +const GET_AMBULANCE_REQUEST = + 'Services/Patients.svc/REST/PatientER_RRT_GetAllTransportationMethod'; +const GET_PATIENT_ALL_PRES_ORDERS = + 'Services/Patients.svc/REST/PatientER_GetPatientAllPresOrders'; +const GET_PICK_UP_REQUEST_BY_PRES_ORDER_ID = + 'Services/Patients.svc/REST/PatientER_RRT_GetPickUpRequestByPresOrderID'; +const UPDATE_PRESS_ORDER = + 'Services/Patients.svc/REST/PatientER_UpdatePresOrder'; +const INSERT_ER_INERT_PRES_ORDER = + 'Services/Patients.svc/REST/PatientER_InsertPresOrder'; ///FindUs const GET_FINDUS_REQUEST = 'Services/Lists.svc/REST/Get_HMG_Locations'; @@ -141,7 +147,8 @@ const GET_PATIENT_SHARE = "Services/Doctors.svc/REST/GetCheckinScreenAppointmentDetailsByAppointmentNO"; //URL to get patient appointment history -const GET_PATIENT_APPOINTMENT_HISTORY = "Services/Doctors.svc/REST/PateintHasAppoimentHistory"; +const GET_PATIENT_APPOINTMENT_HISTORY = + "Services/Doctors.svc/REST/PateintHasAppoimentHistory"; //URL to get patient appointment curfew history const GET_PATIENT_APPOINTMENT_CURFEW_HISTORY = @@ -264,13 +271,14 @@ const SEND_ACTIVATION_CODE_FOR_ADVANCE_PAYMENT = const CHECK_ACTIVATION_CODE_FOR_ADVANCE_PAYMENT = 'Services/Authentication.svc/REST/CheckActivationCodeForAdvancePayment'; +const GET_COVID_DRIVETHRU_PROJECT_LIST = + 'Services/Doctors.svc/REST/COVID19_ProjectDriveThroughTestingCenter'; -const GET_COVID_DRIVETHRU_PROJECT_LIST = 'Services/Doctors.svc/REST/COVID19_ProjectDriveThroughTestingCenter'; - -const GET_COVID_DRIVETHRU_PAYMENT_INFO = 'Services/Doctors.svc/REST/COVID19_GetPatientPaymentInormation'; - -const GET_COVID_DRIVETHRU_FREE_SLOTS = 'Services/Doctors.svc/REST/COVID19_GetFreeSlots'; +const GET_COVID_DRIVETHRU_PAYMENT_INFO = + 'Services/Doctors.svc/REST/COVID19_GetPatientPaymentInormation'; +const GET_COVID_DRIVETHRU_FREE_SLOTS = + 'Services/Doctors.svc/REST/COVID19_GetFreeSlots'; ///My Trackers const GET_DIABETIC_RESULT_AVERAGE = @@ -324,14 +332,23 @@ const GET_ALL_CITIES = 'services/Lists.svc/rest/GetAllCities'; const CREATE_E_REFERRAL = "Services/Patients.svc/REST/CreateEReferral"; const GET_E_REFERRALS = "Services/Patients.svc/REST/GetEReferrals"; +// pharmacy +const GET_PHARMACY_BANNER = "epharmacy/api/promotionbanners"; +const GET_PHARMACY_TOP_MANUFACTURER = "epharmacy/api/topmanufacturer"; +const GET_PHARMACY_BEST_SELLER_PRODUCT = "epharmacy/api/bestsellerproducts"; // Home Health Care -const HHC_GET_ALL_SERVICES = "Services/Patients.svc/REST/PatientER_HHC_GetAllServices"; -const HHC_GET_ALL_CMC_SERVICES = "Services/Patients.svc/REST/PatientER_CMC_GetAllServices"; -const PATIENT_ER_UPDATE_PRES_ORDER ="Services/Patients.svc/REST/PatientER_UpdatePresOrder"; -const GET_ORDER_DETAIL_BY_ID ="Services/Patients.svc/REST/PatientER_HHC_GetTransactionsForOrder"; -const GET_CMC_ORDER_DETAIL_BY_ID ="Services/Patients.svc/REST/PatientER_CMC_GetTransactionsForOrder"; -const GET_CHECK_UP_ITEMS ="Services/Patients.svc/REST/GetCheckUpItems"; +const HHC_GET_ALL_SERVICES = + "Services/Patients.svc/REST/PatientER_HHC_GetAllServices"; +const HHC_GET_ALL_CMC_SERVICES = + "Services/Patients.svc/REST/PatientER_CMC_GetAllServices"; +const PATIENT_ER_UPDATE_PRES_ORDER = + "Services/Patients.svc/REST/PatientER_UpdatePresOrder"; +const GET_ORDER_DETAIL_BY_ID = + "Services/Patients.svc/REST/PatientER_HHC_GetTransactionsForOrder"; +const GET_CMC_ORDER_DETAIL_BY_ID = + "Services/Patients.svc/REST/PatientER_CMC_GetTransactionsForOrder"; +const GET_CHECK_UP_ITEMS = "Services/Patients.svc/REST/GetCheckUpItems"; const TIMER_MIN = 10; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index a44ffec6..10d82424 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -344,7 +344,7 @@ const Map> localizedValues = { "en": "Home Health Care Service", 'ar': 'الرعاية الصحية المنزلية' }, - "OnlinePharmacy": {"en": "Online Pharmacy", 'ar': 'صيدلايات الحبيب'}, + "OnlinePharmacy": {"en": "Online Pharmacy", 'ar': 'صيدليات الحبيب'}, "EmergencyService": {"en": "Emergency Service", 'ar': 'الفحص الطبي الشامل'}, "OnlinePaymentService": { "en": "Online Payment Service", @@ -621,4 +621,33 @@ const Map> localizedValues = { "ar": "خدمة الاشعة: هذه الخدمة تمكنك من الاطلاع على تقارير وصور الاشعة التي تمت في مجموعة الحبيب الطبية وكذلك ارسال التقرير عن طريق الايميل." }, + // pharmacy module + "medicationRefill": { + "en": "MEDICATION REFILL", + "ar": "إعادة تعبئة الدواء" + }, + "offersAndPromotions": { + "en": "OFFERS & SPECIAL PROMOTIONS", + "ar": "العروض والترقيات الخاصة" + }, + "myPrescriptions": { + "en": "MY PRESCRIPTIONS", + "ar": "وصفاتي" + }, + "searchAndScanMedication": { + "en": "SEARCH & SCAN FOR MEDICATION", + "ar": "البحث والمسح للأدوية" + }, + "shopByBrands": { + "en": "Shop By Brands", + "ar": "تسوق حسب الماركات" + }, + "recentlyViewed": { + "en": "Recently Viewed", + "ar": "شوهدت مؤخرا" + }, + "bestSellers": { + "en": "Best Sellers", + "ar": "أفضل البائعين" + }, }; diff --git a/lib/core/model/pharmacy_module/Customer.dart b/lib/core/model/pharmacy_module/Customer.dart new file mode 100644 index 00000000..a5311489 --- /dev/null +++ b/lib/core/model/pharmacy_module/Customer.dart @@ -0,0 +1,128 @@ +class Customer { + String fileNumber; + String iqamaNumber; + int isOutSa; + int patientType; + String gender; + String birthDate; + String phone; + String countryCode; + String yahalaAccountno; + String billingAddress; + String shippingAddress; + String id; + String username; + String email; + String firstName; + String lastName; + String languageId; + String adminComment; + String isTaxExempt; + String hasShoppingCartItems; + String active; + String deleted; + String isSystemAccount; + String systemName; + String lastIpAddress; + String createdOnUtc; + String lastLoginDateUtc; + String lastActivityDateUtc; + String registeredInStoreId; + + Customer( + {this.fileNumber, + this.iqamaNumber, + this.isOutSa, + this.patientType, + this.gender, + this.birthDate, + this.phone, + this.countryCode, + this.yahalaAccountno, + this.billingAddress, + this.shippingAddress, + this.id, + this.username, + this.email, + this.firstName, + this.lastName, + this.languageId, + this.adminComment, + this.isTaxExempt, + this.hasShoppingCartItems, + this.active, + this.deleted, + this.isSystemAccount, + this.systemName, + this.lastIpAddress, + this.createdOnUtc, + this.lastLoginDateUtc, + this.lastActivityDateUtc, + this.registeredInStoreId}); + + Customer.fromJson(Map json) { + fileNumber = json['file_number']; + iqamaNumber = json['iqama_number']; + isOutSa = json['is_out_sa']; + patientType = json['patient_type']; + gender = json['gender']; + birthDate = json['birth_date']; + phone = json['phone']; + countryCode = json['country_code']; + yahalaAccountno = json['yahala_accountno']; + billingAddress = json['billing_address']; + shippingAddress = json['shipping_address']; + id = json['id']; + username = json['username']; + email = json['email']; + firstName = json['first_name']; + lastName = json['last_name']; + languageId = json['language_id']; + adminComment = json['admin_comment']; + isTaxExempt = json['is_tax_exempt']; + hasShoppingCartItems = json['has_shopping_cart_items']; + active = json['active']; + deleted = json['deleted']; + isSystemAccount = json['is_system_account']; + systemName = json['system_name']; + lastIpAddress = json['last_ip_address']; + createdOnUtc = json['created_on_utc']; + lastLoginDateUtc = json['last_login_date_utc']; + lastActivityDateUtc = json['last_activity_date_utc']; + registeredInStoreId = json['registered_in_store_id']; + } + + Map toJson() { + final Map data = new Map(); + data['file_number'] = this.fileNumber; + data['iqama_number'] = this.iqamaNumber; + data['is_out_sa'] = this.isOutSa; + data['patient_type'] = this.patientType; + data['gender'] = this.gender; + data['birth_date'] = this.birthDate; + data['phone'] = this.phone; + data['country_code'] = this.countryCode; + data['yahala_accountno'] = this.yahalaAccountno; + data['billing_address'] = this.billingAddress; + data['shipping_address'] = this.shippingAddress; + data['id'] = this.id; + data['username'] = this.username; + data['email'] = this.email; + data['first_name'] = this.firstName; + data['last_name'] = this.lastName; + data['language_id'] = this.languageId; + data['admin_comment'] = this.adminComment; + data['is_tax_exempt'] = this.isTaxExempt; + data['has_shopping_cart_items'] = this.hasShoppingCartItems; + data['active'] = this.active; + data['deleted'] = this.deleted; + data['is_system_account'] = this.isSystemAccount; + data['system_name'] = this.systemName; + data['last_ip_address'] = this.lastIpAddress; + data['created_on_utc'] = this.createdOnUtc; + data['last_login_date_utc'] = this.lastLoginDateUtc; + data['last_activity_date_utc'] = this.lastActivityDateUtc; + data['registered_in_store_id'] = this.registeredInStoreId; + return data; + } +} \ No newline at end of file diff --git a/lib/core/model/pharmacy_module/Manufacturer.dart b/lib/core/model/pharmacy_module/Manufacturer.dart new file mode 100644 index 00000000..3b16337b --- /dev/null +++ b/lib/core/model/pharmacy_module/Manufacturer.dart @@ -0,0 +1,98 @@ +import 'PharmacyImageObject.dart'; + +class Manufacturer { + String id; + String name; + String namen; + // List localizedNames; + String description; + int manufacturerTemplateId; + String metaKeywords; + String metaDescription; + String metaTitle; + int pageSize; + String pageSizeOptions; + String priceRanges; + bool published; + bool deleted; + int displayOrder; + String createdOnUtc; + String updatedOnUtc; + PharmacyImageObject image; + + Manufacturer( + {this.id, + this.name, + this.namen, + // this.localizedNames, + this.description, + this.manufacturerTemplateId, + this.metaKeywords, + this.metaDescription, + this.metaTitle, + this.pageSize, + this.pageSizeOptions, + this.priceRanges, + this.published, + this.deleted, + this.displayOrder, + this.createdOnUtc, + this.updatedOnUtc, + this.image}); + + Manufacturer.fromJson(Map json) { + id = json['id']; + name = json['name']; + namen = json['namen']; + // if (json['localized_names'] != null) { + // localizedNames = new List(); + // json['localized_names'].forEach((v) { + // localizedNames.add(new LocalizedNames.fromJson(v)); + // }); + // } + description = json['description']; + manufacturerTemplateId = json['manufacturer_template_id']; + metaKeywords = json['meta_keywords']; + metaDescription = json['meta_description']; + metaTitle = json['meta_title']; + pageSize = json['page_size']; + pageSizeOptions = json['page_size_options']; + priceRanges = json['price_ranges']; + published = json['published']; + deleted = json['deleted']; + displayOrder = json['display_order']; + createdOnUtc = json['created_on_utc']; + updatedOnUtc = json['updated_on_utc']; + image = json['image'] != null + ? new PharmacyImageObject.fromJson(json['image']) + : null; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['namen'] = this.namen; + // if (this.localizedNames != null) { + // data['localized_names'] = + // this.localizedNames.map((v) => v.toJson()).toList(); + // } + data['description'] = this.description; + data['manufacturer_template_id'] = this.manufacturerTemplateId; + data['meta_keywords'] = this.metaKeywords; + data['meta_description'] = this.metaDescription; + data['meta_title'] = this.metaTitle; + data['page_size'] = this.pageSize; + data['page_size_options'] = this.pageSizeOptions; + data['price_ranges'] = this.priceRanges; + data['published'] = this.published; + data['deleted'] = this.deleted; + data['display_order'] = this.displayOrder; + data['created_on_utc'] = this.createdOnUtc; + data['updated_on_utc'] = this.updatedOnUtc; + if (this.image != null) { + data['image'] = this.image.toJson(); + } + return data; + } +} diff --git a/lib/core/model/pharmacy_module/PharmacyImageObject.dart b/lib/core/model/pharmacy_module/PharmacyImageObject.dart new file mode 100644 index 00000000..d3db634b --- /dev/null +++ b/lib/core/model/pharmacy_module/PharmacyImageObject.dart @@ -0,0 +1,27 @@ +class PharmacyImageObject { + int id; + int position; + String src; + String thumb; + String attachment; + + PharmacyImageObject({this.id, this.position, this.src, this.thumb, this.attachment}); + + PharmacyImageObject.fromJson(Map json) { + id = json['id']; + position = json['position']; + src = json['src']; + thumb = json['thumb']; + attachment = json['attachment']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['position'] = this.position; + data['src'] = this.src; + data['thumb'] = this.thumb; + data['attachment'] = this.attachment; + return data; + } +} diff --git a/lib/core/model/pharmacy_module/PharmacyProduct.dart b/lib/core/model/pharmacy_module/PharmacyProduct.dart new file mode 100644 index 00000000..cd461ae5 --- /dev/null +++ b/lib/core/model/pharmacy_module/PharmacyProduct.dart @@ -0,0 +1,149 @@ +import 'PharmacyImageObject.dart'; +import 'Reviews.dart'; + +class PharmacyProduct { + String id; + String name; + String namen; + String shortDescription; + String fullDescription; + String fullDescriptionn; + int approvedRatingSum; + int approvedTotalReviews; + String sku; + bool isRx; + String rxMessage; + String rxMessagen; + int stockQuantity; + String stockAvailability; + String stockAvailabilityn; + bool allowBackInStockSubscriptions; + int orderMinimumQuantity; + int orderMaximumQuantity; + double price; + double oldPrice; + String discountName; + String discountNamen; + String discountPercentage; + int displayOrder; + List discountIds; + List reviews; + List images; + + PharmacyProduct( + {this.id, + this.name, + this.namen, + this.shortDescription, + this.fullDescription, + this.fullDescriptionn, + this.approvedRatingSum, + this.approvedTotalReviews, + this.sku, + this.isRx, + this.rxMessage, + this.rxMessagen, + this.stockQuantity, + this.stockAvailability, + this.stockAvailabilityn, + this.allowBackInStockSubscriptions, + this.orderMinimumQuantity, + this.orderMaximumQuantity, + this.price, + this.oldPrice, + this.discountName, + this.discountNamen, + this.discountPercentage, + this.displayOrder, + this.discountIds, + this.reviews, + this.images}); + + PharmacyProduct.fromJson(Map json) { + try { + id = json['id']; + name = json['name']; + namen = json['namen']; + shortDescription = json['short_description']; + fullDescription = json['full_description']; + fullDescriptionn = json['full_descriptionn']; + approvedRatingSum = json['approved_rating_sum']; + approvedTotalReviews = json['approved_total_reviews']; + sku = json['sku']; + isRx = json['is_rx']; + rxMessage = json['rx_message']; + rxMessagen = json['rx_messagen']; + stockQuantity = json['stock_quantity']; + stockAvailability = json['stock_availability']; + stockAvailabilityn = json['stock_availabilityn']; + allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; + orderMinimumQuantity = json['order_minimum_quantity']; + orderMaximumQuantity = json['order_maximum_quantity']; + price = json['price']; + oldPrice = json['old_price']; + discountName = json['discount_name']; + discountNamen = json['discount_namen']; + discountPercentage = json['discount_percentage']; + displayOrder = json['display_order']; + if (json['discount_ids'] != null) { + discountIds = new List(); + json['discount_ids'].forEach((v) { + discountIds.add(v); + }); + } + if (json['reviews'] != null) { + reviews = new List(); + json['reviews'].forEach((v) { + reviews.add(new Reviews.fromJson(v)); + }); + } + if (json['images'] != null) { + images = new List(); + json['images'].forEach((v) { + images.add(new PharmacyImageObject.fromJson(v)); + }); + } + } catch (e) { + print(e); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['namen'] = this.namen; + data['short_description'] = this.shortDescription; + data['full_description'] = this.fullDescription; + data['full_descriptionn'] = this.fullDescriptionn; + data['approved_rating_sum'] = this.approvedRatingSum; + data['approved_total_reviews'] = this.approvedTotalReviews; + data['sku'] = this.sku; + data['is_rx'] = this.isRx; + data['rx_message'] = this.rxMessage; + data['rx_messagen'] = this.rxMessagen; + data['stock_quantity'] = this.stockQuantity; + data['stock_availability'] = this.stockAvailability; + data['stock_availabilityn'] = this.stockAvailabilityn; + data['allow_back_in_stock_subscriptions'] = + this.allowBackInStockSubscriptions; + data['order_minimum_quantity'] = this.orderMinimumQuantity; + data['order_maximum_quantity'] = this.orderMaximumQuantity; + data['price'] = this.price; + data['old_price'] = this.oldPrice; + data['discount_name'] = this.discountName; + data['discount_namen'] = this.discountNamen; + data['discount_percentage'] = this.discountPercentage; + data['display_order'] = this.displayOrder; + if (this.discountIds != String) { + data['discount_ids'] = this.discountIds.map((v) => v).toList(); + } + if (this.reviews != String) { + data['reviews'] = this.reviews.map((v) => v.toJson()).toList(); + } + if (this.images != String) { + data['images'] = this.images.map((v) => v.toJson()).toList(); + } + return data; + } +} diff --git a/lib/core/model/pharmacy_module/Reviews.dart b/lib/core/model/pharmacy_module/Reviews.dart new file mode 100644 index 00000000..ec0de75e --- /dev/null +++ b/lib/core/model/pharmacy_module/Reviews.dart @@ -0,0 +1,82 @@ +import 'Customer.dart'; + +class Reviews { + int id; + int position; + int reviewId; + int customerId; + int productId; + int storeId; + bool isApproved; + String title; + String reviewText; + Null replyText; + int rating; + int helpfulYesTotal; + int helpfulNoTotal; + String createdOnUtc; + Customer customer; + Null product; + + Reviews( + {this.id, + this.position, + this.reviewId, + this.customerId, + this.productId, + this.storeId, + this.isApproved, + this.title, + this.reviewText, + this.replyText, + this.rating, + this.helpfulYesTotal, + this.helpfulNoTotal, + this.createdOnUtc, + this.customer, + this.product}); + + Reviews.fromJson(Map json) { + id = json['id']; + position = json['position']; + reviewId = json['review_id']; + customerId = json['customer_id']; + productId = json['product_id']; + storeId = json['store_id']; + isApproved = json['is_approved']; + title = json['title']; + reviewText = json['review_text']; + replyText = json['reply_text']; + rating = json['rating']; + helpfulYesTotal = json['helpful_yes_total']; + helpfulNoTotal = json['helpful_no_total']; + createdOnUtc = json['created_on_utc']; + customer = json['customer'] != null + ? new Customer.fromJson(json['customer']) + : null; + product = json['product']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['position'] = this.position; + data['review_id'] = this.reviewId; + data['customer_id'] = this.customerId; + data['product_id'] = this.productId; + data['store_id'] = this.storeId; + data['is_approved'] = this.isApproved; + data['title'] = this.title; + data['review_text'] = this.reviewText; + data['reply_text'] = this.replyText; + data['rating'] = this.rating; + data['helpful_yes_total'] = this.helpfulYesTotal; + data['helpful_no_total'] = this.helpfulNoTotal; + data['created_on_utc'] = this.createdOnUtc; + if (this.customer != null) { + data['customer'] = this.customer.toJson(); + } + data['product'] = this.product; + return data; + } +} \ No newline at end of file diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index d2bfa4fa..11319d96 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -77,7 +77,7 @@ class BaseAppClient { body['PatientID'] = body['PatientID'] != null ? body['PatientID'] : user['PatientID']; body['PatientOutSA'] = user['OutSA']; - body['SessionID'] = SESSION_ID;//getSessionId(token); + body['SessionID'] = SESSION_ID; //getSessionId(token); } } @@ -139,6 +139,38 @@ class BaseAppClient { } } + get(String endPoint, + {Function(dynamic response, int statusCode) onSuccess, + Function(String error, int statusCode) onFailure, + bool isAllowAny = false, + Map queryParams}) async { + String url = BASE_URL + endPoint; + if (queryParams != null) { + String queryString = Uri(queryParameters: queryParams).query; + url += '?' + queryString; + } + + print("URL : $url"); + + if (await Utils.checkConnection()) { + final response = await http.get(url.trim(), headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }); + final int statusCode = response.statusCode; + print("statusCode :$statusCode"); + + if (statusCode < 200 || statusCode >= 400 || json == null) { + onFailure('Error While Fetching data', statusCode); + } else { + var parsed = json.decode(response.body.toString()); + onSuccess(parsed, statusCode); + } + } else { + onFailure('Please Check The Internet Connection', -1); + } + } + logout() async { await sharedPref.remove(LOGIN_TOKEN_ID); Navigator.of(AppGlobal.context).pushReplacementNamed(LOGIN_TYPE); diff --git a/lib/core/service/parmacyModule/parmacy_module_service.dart b/lib/core/service/parmacyModule/parmacy_module_service.dart new file mode 100644 index 00000000..3bec5ba5 --- /dev/null +++ b/lib/core/service/parmacyModule/parmacy_module_service.dart @@ -0,0 +1,72 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy_module/Manufacturer.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy_module/PharmacyImageObject.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy_module/PharmacyProduct.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; + +class PharmacyModuleService extends BaseService { + bool isFinished = true; + bool hasError = false; + String errorMsg = ''; + + List bannerItems = List(); + List manufacturerList = List(); + List bestSellerProducts = List(); + + Future getBannerListList() async { + hasError = false; + try { + await baseAppClient.get(GET_PHARMACY_BANNER, + onSuccess: (dynamic response, int statusCode) { + bannerItems.clear(); + response['images'].forEach((item) { + bannerItems.add(PharmacyImageObject.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }); + } catch (error) { + throw error; + } + } + + Future getTopManufacturerList() async { + Map queryParams = {'page': '1', 'limit': '8'}; + try { + await baseAppClient.get(GET_PHARMACY_TOP_MANUFACTURER, + onSuccess: (dynamic response, int statusCode) { + manufacturerList.clear(); + response['manufacturer'].forEach((item) { + manufacturerList.add(Manufacturer.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, queryParams: queryParams); + } catch (error) { + throw error; + } + } + + Future getBestSellerProducts() async { + Map queryParams = { + 'fields': + 'id,discount_ids,name,namen,localized_names,display_order,short_description,full_description,full_descriptionn,sku,order_minimum_quantity,order_maximum_quantity,price,old_price,images,is_rx,rx_message,rx_messagen,discount_name,discount_namen,approved_rating_sum,approved_total_reviews,allow_back_in_stock_subscriptions,stock_quantity,stock_availability,stock_availabilityn,discount_percentage,reviews', + }; + try { + await baseAppClient.get(GET_PHARMACY_BEST_SELLER_PRODUCT, + onSuccess: (dynamic response, int statusCode) { + bestSellerProducts.clear(); + response['products'].forEach((item) { + bestSellerProducts.add(PharmacyProduct.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, queryParams: queryParams); + } catch (error) { + throw error; + } + } +} diff --git a/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart b/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart new file mode 100644 index 00000000..8d9207b0 --- /dev/null +++ b/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart @@ -0,0 +1,59 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy_module/Manufacturer.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy_module/PharmacyImageObject.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy_module/PharmacyProduct.dart'; +import 'package:diplomaticquarterapp/core/service/parmacyModule/parmacy_module_service.dart'; +import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; + +import '../../../locator.dart'; + +class PharmacyModuleViewModel extends BaseViewModel { + PharmacyModuleService _pharmacyService = locator(); + + List get bannerList => _pharmacyService.bannerItems; + + List get manufacturerList => _pharmacyService.manufacturerList; + + List get bestSellerProduct => _pharmacyService.bestSellerProducts; + + Future getPharmacyHomeData() async { + setState(ViewState.Busy); + await _pharmacyService.getBannerListList(); + if (_pharmacyService.hasError) { + error = _pharmacyService.error; + setState(ViewState.Error); + } else { + _getTopManufacturerList(); + } + } + + List getBannerImagesUrl() { + List images = List(); + images.add('assets/images/pharmacy_module/pharmacy_logo_green.png'); + _pharmacyService.bannerItems.forEach((element) { + images.add(element.src); + }); + + return images; + } + + _getTopManufacturerList() async { + await _pharmacyService.getTopManufacturerList(); + if (_pharmacyService.hasError) { + error = _pharmacyService.error; + setState(ViewState.Error); + } else { + _getBestSellerProducts(); + } + } + + _getBestSellerProducts() async { + await _pharmacyService.getBestSellerProducts(); + if (_pharmacyService.hasError) { + error = _pharmacyService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } +} diff --git a/lib/d_q_icons_icons.dart b/lib/d_q_icons_icons.dart index fc9679ca..040e6e08 100644 --- a/lib/d_q_icons_icons.dart +++ b/lib/d_q_icons_icons.dart @@ -30,4 +30,16 @@ class DQIcons { static const IconData thermometer = IconData(0xe806, fontFamily: _kFontFam, fontPackage: _kFontPkg); static const IconData weight_scale = IconData(0xe807, fontFamily: _kFontFam, fontPackage: _kFontPkg); static const IconData parking_icon = IconData(0xe808, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData more_menu_icon = IconData(0xe809, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData offer_icon = IconData(0xe80a, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData prescription_icon = IconData(0xe80b, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData search_scan_icon = IconData(0xe80c, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData share_icon = IconData(0xe80d, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData wishlist_add_icon = IconData(0xe80e, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData wishlist_icon = IconData(0xe80f, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData bg_1 = IconData(0xe810, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData bg_2 = IconData(0xe811, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData bg_3 = IconData(0xe812, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData bg_4 = IconData(0xe813, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData medication_icon = IconData(0xe814, fontFamily: _kFontFam, fontPackage: _kFontPkg); } diff --git a/lib/locator.dart b/lib/locator.dart index a71d7964..203bd8a0 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -43,6 +43,8 @@ import 'core/service/medical/radiology_service.dart'; import 'core/service/medical/reports_monthly_service.dart'; import 'core/service/medical/vital_sign_service.dart'; import 'core/viewModels/AlHabibMedicalService/cmc_view_model.dart'; +import 'core/service/parmacyModule/parmacy_module_service.dart'; + import 'core/viewModels/all_habib_medical_services/e_referral_view_model.dart'; import 'core/viewModels/appointment_rate_view_model.dart'; import 'core/viewModels/blooddonation/blood_details_view_model.dart'; @@ -78,6 +80,7 @@ import 'core/viewModels/pharmacies_view_model.dart'; import 'core/service/pharmacies_service.dart'; import 'core/service/insurance_service.dart'; import 'core/viewModels/insurance_card_View_model.dart'; +import 'core/viewModels/pharmacyModule/pharmacy_module_view_model.dart'; import 'core/viewModels/qr_view_model.dart'; import 'core/viewModels/vaccine_view_model.dart'; import 'core/service/vaccine_service.dart'; @@ -132,9 +135,10 @@ void setupLocator() { locator.registerLazySingleton(() => CreteNewBabyService()); locator.registerLazySingleton(() => DeleteBabyService()); + locator.registerLazySingleton(() => VaccinationTableService()); - locator.registerLazySingleton(() => VaccinationTableService()); + locator.registerLazySingleton(() => PharmacyModuleService()); /// View Model @@ -177,8 +181,14 @@ void setupLocator() { locator.registerFactory(() => EyeViewModel()); locator.registerFactory(() => ActiveMedicationsViewModel()); locator.registerFactory(() => AskDoctorViewModel()); + locator.registerFactory(() => AllergiesViewModel()); locator.registerFactory(() => HomeHealthCareViewModel()); locator.registerFactory(() => CMCViewModel()); + + + + locator.registerFactory(() => PharmacyModuleViewModel()); + } diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index 06ac1577..59f01705 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -10,6 +10,7 @@ import 'package:diplomaticquarterapp/pages/ErService/ErOptions.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/livecare/livecare_home.dart'; import 'package:diplomaticquarterapp/pages/paymentService/payment_service.dart'; +import 'package:diplomaticquarterapp/pages/pharmacyModule/pharmacy_module_page.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; @@ -478,6 +479,8 @@ class _HomePageState extends State { opacity: 0.5, ), DashboardItem( + onTap: () => Navigator.push(context, FadePage(page: PharmacyPage())), + child: Center( child: Padding( padding: const EdgeInsets.all(15.0), @@ -782,7 +785,8 @@ class DashboardItem extends StatelessWidget { this.width, this.height, this.color, - this.opacity = 0.4}) + this.opacity = 0.4, + this.hasColorFilter = true}) : super(key: key); final bool hasBorder; final String imageName; @@ -792,6 +796,7 @@ class DashboardItem extends StatelessWidget { final double height; final Color color; final double opacity; + final bool hasColorFilter; @override Widget build(BuildContext context) { @@ -818,8 +823,8 @@ class DashboardItem extends StatelessWidget { ? DecorationImage( image: ExactAssetImage('assets/images/$imageName'), fit: BoxFit.cover, - colorFilter: new ColorFilter.mode( - Colors.black.withOpacity(0.2), BlendMode.dstIn), + colorFilter: hasColorFilter ? new ColorFilter.mode( + Colors.black.withOpacity(0.2), BlendMode.dstIn) : null, ) : null, ), diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index ff21d73e..439622b7 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -124,137 +124,137 @@ class _LandingPageState extends State with WidgetsBindingObserver { }); _requestIOSPermissions(); pageController = PageController(keepPage: true); - _firebaseMessaging.setAutoInitEnabled(true); - - if (Platform.isIOS) { - _firebaseMessaging.requestNotificationPermissions(); - } - - _firebaseMessaging.getToken().then((String token) { - sharedPref.setString(PUSH_TOKEN, token); - if (token != null) { - checkUserStatus(token); - } - requestPermissions(); - }).catchError((err) { - print(err); - }); - - //_firebase Background message handler - _firebaseMessaging.configure( - // onMessage: (Map message) async { - // showDialog("onMessage: $message"); - // print("onMessage: $message"); - // print(message); - // print(message['name']); - // print(message['appointmentdate']); - // - // if (Platform.isIOS) { - // if (message['is_call'] == "true") { - // var route = ModalRoute.of(context); - // - // if (route != null) { - // print(route.settings.name); - // } - // - // Map myMap = new Map.from(message); - // print(myMap); - // LandingPage.isOpenCallPage = true; - // LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); - // if (!isPageNavigated) { - // isPageNavigated = true; - // Navigator.push( - // context, - // MaterialPageRoute( - // builder: (context) => IncomingCall( - // incomingCallData: LandingPage.incomingCallData))) - // .then((value) { - // isPageNavigated = false; - // }); - // } - // } else { - // print("Is Call Not Found iOS"); - // } - // } else { - // print("Is Call Not Found iOS"); - // } - // - // if (Platform.isAndroid) { - // if (message['data'].containsKey("is_call")) { - // var route = ModalRoute.of(context); - // - // if (route != null) { - // print(route.settings.name); - // } - // - // Map myMap = - // new Map.from(message['data']); - // print(myMap); - // LandingPage.isOpenCallPage = true; - // LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); - // if (!isPageNavigated) { - // isPageNavigated = true; - // Navigator.push( - // context, - // MaterialPageRoute( - // builder: (context) => IncomingCall( - // incomingCallData: LandingPage.incomingCallData))) - // .then((value) { - // isPageNavigated = false; - // }); - // } - // } else { - // print("Is Call Not Found Android"); - // } - // } else { - // print("Is Call Not Found Android"); - // } - // }, - // onBackgroundMessage: Platform.isIOS ? null : myBackgroundMessageHandler, - // onLaunch: (Map message) async { - // print("onLaunch: $message"); - // showDialog("onLaunch: $message"); - // }, - // onResume: (Map message) async { - // print("onResume: $message"); - // print(message); - // print(message['name']); - // print(message['appointmentdate']); - // - // showDialog("onResume: $message"); - // - // if (Platform.isIOS) { - // if (message['is_call'] == "true") { - // var route = ModalRoute.of(context); - // - // if (route != null) { - // print(route.settings.name); - // } - // - // Map myMap = - // new Map.from(message); - // print(myMap); - // LandingPage.isOpenCallPage = true; - // LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); - // if (!isPageNavigated) { - // isPageNavigated = true; - // Navigator.push( - // context, - // MaterialPageRoute( - // builder: (context) => IncomingCall( - // incomingCallData: LandingPage.incomingCallData))) - // .then((value) { - // isPageNavigated = false; - // }); - // } - // } else { - // print("Is Call Not Found iOS"); - // } - // } else { - // print("Is Call Not Found iOS"); - // } - // }, - ); + // _firebaseMessaging.setAutoInitEnabled(true); + // + // if (Platform.isIOS) { + // _firebaseMessaging.requestNotificationPermissions(); + // } + // + // _firebaseMessaging.getToken().then((String token) { + // sharedPref.setString(PUSH_TOKEN, token); + // if (token != null) { + // checkUserStatus(token); + // } + // requestPermissions(); + // }).catchError((err) { + // print(err); + // }); + // + // //_firebase Background message handler + // _firebaseMessaging.configure( + // // onMessage: (Map message) async { + // // showDialog("onMessage: $message"); + // // print("onMessage: $message"); + // // print(message); + // // print(message['name']); + // // print(message['appointmentdate']); + // // + // // if (Platform.isIOS) { + // // if (message['is_call'] == "true") { + // // var route = ModalRoute.of(context); + // // + // // if (route != null) { + // // print(route.settings.name); + // // } + // // + // // Map myMap = new Map.from(message); + // // print(myMap); + // // LandingPage.isOpenCallPage = true; + // // LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); + // // if (!isPageNavigated) { + // // isPageNavigated = true; + // // Navigator.push( + // // context, + // // MaterialPageRoute( + // // builder: (context) => IncomingCall( + // // incomingCallData: LandingPage.incomingCallData))) + // // .then((value) { + // // isPageNavigated = false; + // // }); + // // } + // // } else { + // // print("Is Call Not Found iOS"); + // // } + // // } else { + // // print("Is Call Not Found iOS"); + // // } + // // + // // if (Platform.isAndroid) { + // // if (message['data'].containsKey("is_call")) { + // // var route = ModalRoute.of(context); + // // + // // if (route != null) { + // // print(route.settings.name); + // // } + // // + // // Map myMap = + // // new Map.from(message['data']); + // // print(myMap); + // // LandingPage.isOpenCallPage = true; + // // LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); + // // if (!isPageNavigated) { + // // isPageNavigated = true; + // // Navigator.push( + // // context, + // // MaterialPageRoute( + // // builder: (context) => IncomingCall( + // // incomingCallData: LandingPage.incomingCallData))) + // // .then((value) { + // // isPageNavigated = false; + // // }); + // // } + // // } else { + // // print("Is Call Not Found Android"); + // // } + // // } else { + // // print("Is Call Not Found Android"); + // // } + // // }, + // // onBackgroundMessage: Platform.isIOS ? null : myBackgroundMessageHandler, + // // onLaunch: (Map message) async { + // // print("onLaunch: $message"); + // // showDialog("onLaunch: $message"); + // // }, + // // onResume: (Map message) async { + // // print("onResume: $message"); + // // print(message); + // // print(message['name']); + // // print(message['appointmentdate']); + // // + // // showDialog("onResume: $message"); + // // + // // if (Platform.isIOS) { + // // if (message['is_call'] == "true") { + // // var route = ModalRoute.of(context); + // // + // // if (route != null) { + // // print(route.settings.name); + // // } + // // + // // Map myMap = + // // new Map.from(message); + // // print(myMap); + // // LandingPage.isOpenCallPage = true; + // // LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); + // // if (!isPageNavigated) { + // // isPageNavigated = true; + // // Navigator.push( + // // context, + // // MaterialPageRoute( + // // builder: (context) => IncomingCall( + // // incomingCallData: LandingPage.incomingCallData))) + // // .then((value) { + // // isPageNavigated = false; + // // }); + // // } + // // } else { + // // print("Is Call Not Found iOS"); + // // } + // // } else { + // // print("Is Call Not Found iOS"); + // // } + // // }, + // ); } showDialogs(String message) { diff --git a/lib/pages/pharmacyModule/pharmacy_module_page.dart b/lib/pages/pharmacyModule/pharmacy_module_page.dart new file mode 100644 index 00000000..60d55437 --- /dev/null +++ b/lib/pages/pharmacyModule/pharmacy_module_page.dart @@ -0,0 +1,233 @@ +import 'package:diplomaticquarterapp/config/size_config.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/landing/home_page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacyModule/widgets/BannerPager.dart'; +import 'package:diplomaticquarterapp/pages/pharmacyModule/widgets/ProductTileItem.dart'; +import 'package:diplomaticquarterapp/pages/pharmacyModule/widgets/borderedButton.dart'; +import 'package:diplomaticquarterapp/pages/pharmacyModule/widgets/manufacturerItem.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; + +class PharmacyPage extends StatelessWidget { + + @override + Widget build(BuildContext context) { + return BaseView( + // onModelReady: (model) => model.getPharmacyHomeData(), + onModelReady: (model) => model.getPharmacyHomeData(), + builder: (_, model, wi) => AppScaffold( + title: "", + isShowAppBar: true, + isShowDecPage: false, + baseViewModel: model, + backgroundColor: Colors.white, + body: Container( + width: double.infinity, + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + BannerPager(model), + GridViewButtons(), + /*BannerPager(model.getBannerImagesUrl()),*/ + Container( + margin: EdgeInsets.fromLTRB(10, 0, 10, 0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Texts( + TranslationBase.of(context).shopByBrands, + bold: true, + ), + BorderedButton( + TranslationBase.of(context).viewAll, + hasBorder: true, + vPadding: 6, + borderColor: Colors.green, + color: Colors.green, + handler: () {}, + ), + ], + ), + ), + Container( + height: 60, + child: ListView.builder( + itemBuilder: (ctx, i) => + ManufacturerItem(model.manufacturerList[i]), + scrollDirection: Axis.horizontal, + itemCount: model.manufacturerList.length, + ), + ), + Container( + margin: EdgeInsets.fromLTRB(10, 10, 10, 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Texts( + TranslationBase.of(context).recentlyViewed, + bold: true, + ), + BorderedButton( + TranslationBase.of(context).viewAll, + hasBorder: true, + vPadding: 6, + borderColor: Colors.green, + color: Colors.green, + handler: () {}, + ), + ], + ), + ), + Container(), + Container( + margin: EdgeInsets.fromLTRB(10, 10, 10, 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Texts( + TranslationBase.of(context).bestSellers, + bold: true, + ), + BorderedButton( + TranslationBase.of(context).viewAll, + hasBorder: true, + borderColor: Colors.green, + color: Colors.green, + vPadding: 6, + handler: () {}, + ), + ], + ), + ), + Container( + height: MediaQuery.of(context).size.height / 4, + child: ListView.builder( + itemBuilder: (ctx, i) => + ProductTileItem(model.bestSellerProduct[i]), + scrollDirection: Axis.horizontal, + itemCount: model.bestSellerProduct.length, + ), + ), + ], + ), + ), + ), + ), + ); + } +} + +class GridViewButtons extends StatelessWidget { + @override + Widget build(BuildContext context) { + final gridHeight = (MediaQuery.of(context).size.width * 0.3) * 1.8; + return Container( + child: SizedBox( + height: gridHeight, + child: GridView.count( + childAspectRatio: 2.2, + crossAxisSpacing: 10, + mainAxisSpacing: 10, + controller: new ScrollController(keepScrollOffset: false), + shrinkWrap: true, + padding: const EdgeInsets.all(4.0), + crossAxisCount: 2, + children: [ + DashboardItem( + imageName: 'pharmacy_module/bg_1.png', + hasColorFilter: false, + opacity: 0.8, + child: GridViewCard( + TranslationBase.of(context).offersAndPromotions, + 'assets/images/pharmacy_module/offer_icon.png', + () {}), + ), + DashboardItem( + imageName: 'pharmacy_module/bg_2.png', + opacity: 0, + hasColorFilter: false, + child: GridViewCard(TranslationBase.of(context).medicationRefill, + 'assets/images/pharmacy_module/medication_icon.png', () {}), + ), + DashboardItem( + imageName: 'pharmacy_module/bg_3.png', + opacity: 0, + hasColorFilter: false, + child: GridViewCard(TranslationBase.of(context).myPrescriptions, + 'assets/images/pharmacy_module/prescription_icon.png', () {}), + ), + DashboardItem( + imageName: 'pharmacy_module/bg_4.png', + opacity: 0, + hasColorFilter: false, + child: GridViewCard( + TranslationBase.of(context).searchAndScanMedication, + 'assets/images/pharmacy_module/search_scan_icon.png', + () {}), + ), + ], + ), + ), + ); + } +} + +class GridViewCard extends StatelessWidget { + final String text; + final String cardImage; + final Function handler; + + GridViewCard(this.text, this.cardImage, this.handler); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(4.0), + child: Container( + child: Row( + children: [ + Expanded( + flex: 2, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + flex: 2, + child: Padding( + padding: const EdgeInsets.all(6), + child: Texts( + text, + color: Colors.white, + fontSize: SizeConfig.textMultiplier * 1.5, + ), + ), + ), + Expanded( + child: BorderedButton( + TranslationBase.of(context).viewAll, + handler: () {}, + ), + ), + ], + ), + ), + Expanded( + child: Align( + alignment: Alignment.centerRight, + child: Image.asset( + cardImage, + fit: BoxFit.cover, + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/pharmacyModule/widgets/BannerPager.dart b/lib/pages/pharmacyModule/widgets/BannerPager.dart new file mode 100644 index 00000000..989c7557 --- /dev/null +++ b/lib/pages/pharmacyModule/widgets/BannerPager.dart @@ -0,0 +1,88 @@ +import 'package:carousel_slider/carousel_slider.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart'; +import 'package:flutter/material.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; + +class BannerPager extends StatefulWidget { + final PharmacyModuleViewModel _model; + + BannerPager(this._model); + + @override + _BannerPagerState createState() => _BannerPagerState(); +} + +class _BannerPagerState extends State { + int _current = 0; + + @override + Widget build(BuildContext context) { + return Container( + child: Column( + children: [ + CarouselSlider( + options: CarouselOptions( + aspectRatio: 7 / 2, + enlargeCenterPage: true, + enableInfiniteScroll: false, + initialPage: 0, + autoPlay: true, + autoPlayInterval: Duration(seconds: 3), + autoPlayAnimationDuration: Duration(milliseconds: 800), + autoPlayCurve: Curves.decelerate, + onPageChanged: (index, reason) { + setState(() { + _current = index; + }); + }, + ), + items: widget._model + .getBannerImagesUrl() + .mapIndexed( + (item, index) => Container( + margin: EdgeInsets.symmetric(horizontal: 1.0), + child: ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(5.0)), + child: Center( + child: index == 0 + ? Image.asset( + item, + fit: BoxFit.cover, + ) + : Image.network( + item, + fit: BoxFit.cover, + ), + ), + ), + ), + ) + .toList(), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: widget._model + .getBannerImagesUrl() + .mapIndexed( + (item, index) => Container( + width: 12.0, + height: 4.0, + margin: + EdgeInsets.symmetric(vertical: 0.0, horizontal: 2.0), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: _current == index + ? Color.fromRGBO(0, 250, 0, 0.9) + : Color.fromRGBO(0, 0, 0, 0.4), + ), + ), + ) + .toList(), + ), + ) + ], + )); + } +} diff --git a/lib/pages/pharmacyModule/widgets/ProductTileItem.dart b/lib/pages/pharmacyModule/widgets/ProductTileItem.dart new file mode 100644 index 00000000..fdce3559 --- /dev/null +++ b/lib/pages/pharmacyModule/widgets/ProductTileItem.dart @@ -0,0 +1,107 @@ +import 'package:diplomaticquarterapp/core/model/pharmacy_module/PharmacyProduct.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ProductTileItem extends StatelessWidget { + final PharmacyProduct item; + + ProductTileItem(this.item); + + @override + Widget build(BuildContext context) { + ProjectViewModel projectProvider = Provider.of(context); + return Card( + elevation: 2, + shape: Border(right: BorderSide(color: Colors.grey.shade300, width: 1)), + margin: EdgeInsets.symmetric( + horizontal: 8, + vertical: 4, + ), + child: Container( + padding: EdgeInsets.symmetric(horizontal: 0), + width: MediaQuery.of(context).size.width / 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Stack( + children: [ + Container( + margin: EdgeInsets.fromLTRB(0, 16, 0, 0), + alignment: Alignment.center, + child: Image.network( + item.images[0].src, + fit: BoxFit.cover, + height: 80, + ), + ), + Container( + width: item.rxMessage != null + ? MediaQuery.of(context).size.width / 5 + : 0, + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: Color(0xffb23838), + borderRadius: + BorderRadius.only(topLeft: Radius.circular(6)), + ), + child: Texts( + item.rxMessage != null ? item.rxMessage : "", + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: FontWeight.w400, + ), + ) + ], + ), + Container( + margin: EdgeInsets.symmetric( + horizontal: 6, + vertical: 0, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + projectProvider.isArabic ? item.name : item.namen, + regular: true, + fontSize: 12, + fontWeight: FontWeight.w400, + ), + Padding( + padding: const EdgeInsets.only(top: 4, bottom: 4), + child: Texts( + "SAR ${item.price}", + bold: true, + fontSize: 14, + ), + ), + Row( + children: [ + StarRating( + totalAverage: item.approvedTotalReviews > 0 + ? (item.approvedRatingSum.toDouble() / + item.approvedTotalReviews.toDouble()) + .toDouble() + : 0, + forceStars: true), + Texts( + "(${item.approvedTotalReviews})", + regular: true, + fontSize: 10, + fontWeight: FontWeight.w400, + ) + ], + ), + ], + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/pages/pharmacyModule/widgets/borderedButton.dart b/lib/pages/pharmacyModule/widgets/borderedButton.dart new file mode 100644 index 00000000..5e05448e --- /dev/null +++ b/lib/pages/pharmacyModule/widgets/borderedButton.dart @@ -0,0 +1,59 @@ +import 'package:diplomaticquarterapp/config/size_config.dart'; +import 'package:flutter/material.dart'; + +class BorderedButton extends StatelessWidget { + final String text; + final Function handler; + final Color color; + final bool hasBorder; + final Color borderColor; + final Color backgroundColor; + final double vPadding; + final double hPadding; + + BorderedButton( + this.text, { + this.handler, + this.color, + this.hasBorder = false, + this.borderColor, + this.backgroundColor, + this.vPadding = 0, + this.hPadding = 0, + }); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 4, vertical: 4), + child: ButtonTheme( + //adds padding inside the button + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + //limits the touch area to the button area + minWidth: 0, + //wraps child's width + height: 0, + //wraps child's height + child: RaisedButton( + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + padding: EdgeInsets.symmetric(horizontal: 12, vertical: vPadding), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(4.0), + side: BorderSide(color: hasBorder ? borderColor : Colors.white, width: 0.8),), + color: backgroundColor ?? Colors.white, + textColor: color ?? Color(0xffc4aa54), + disabledTextColor: color ?? Colors.black, + disabledColor: backgroundColor ?? Colors.white, + onPressed: handler, + child: Text( + text, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: SizeConfig.textMultiplier * 1.6, + fontWeight: FontWeight.normal), + ), + ), //your original button + ), + ); + } +} diff --git a/lib/pages/pharmacyModule/widgets/manufacturerItem.dart b/lib/pages/pharmacyModule/widgets/manufacturerItem.dart new file mode 100644 index 00000000..e29de45c --- /dev/null +++ b/lib/pages/pharmacyModule/widgets/manufacturerItem.dart @@ -0,0 +1,35 @@ +import 'package:diplomaticquarterapp/core/model/pharmacy_module/Manufacturer.dart'; +import 'package:flutter/material.dart'; + +class ManufacturerItem extends StatelessWidget { + final Manufacturer item; + + ManufacturerItem(this.item); + + @override + Widget build(BuildContext context) { + return Card( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + margin: EdgeInsets.symmetric( + horizontal: 8, + vertical: 4, + ), + child: Container( + decoration: BoxDecoration( + border: Border( + right: BorderSide(color: Colors.grey.shade300, width: 1), + bottom: BorderSide(color: Colors.grey.shade300, width: 1), + left: BorderSide(color: Colors.grey.shade300, width: 1), + top: BorderSide(color: Colors.grey.shade300, width: 1)), + ), + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 8), + child: Image.network( + item.image.src, + fit: BoxFit.cover, + ), + ), + ), + ); + } +} diff --git a/lib/pages/rateAppointment/rate_appointment_doctor.dart b/lib/pages/rateAppointment/rate_appointment_doctor.dart index 83674906..d36ef9db 100644 --- a/lib/pages/rateAppointment/rate_appointment_doctor.dart +++ b/lib/pages/rateAppointment/rate_appointment_doctor.dart @@ -100,7 +100,7 @@ class _RateAppointmentDoctorState extends State { height: 4, ), Texts( - model.appointmentDetails.clinicName, + model.appointmentDetails.clinicName??'', bold: true, ), SizedBox( diff --git a/lib/uitl/date_uitl.dart b/lib/uitl/date_uitl.dart index b35bbcf4..8ffaf97c 100644 --- a/lib/uitl/date_uitl.dart +++ b/lib/uitl/date_uitl.dart @@ -265,6 +265,7 @@ class DateUtil { break; case DayOfWeek.Sunday: return "Sunday"; + break; } return ""; diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index e1559bd4..61e24391 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -685,6 +685,15 @@ class TranslationBase { String get serviceInformationTitle => localizedValues['ServiceInformationTitle'][locale.languageCode]; String get infoLab => localizedValues['info-lab'][locale.languageCode]; String get infoRadiology => localizedValues['info-radiology'][locale.languageCode]; + + // pharmacy module + String get medicationRefill => localizedValues['medicationRefill'][locale.languageCode]; + String get offersAndPromotions => localizedValues['offersAndPromotions'][locale.languageCode]; + String get myPrescriptions => localizedValues['myPrescriptions'][locale.languageCode]; + String get searchAndScanMedication => localizedValues['searchAndScanMedication'][locale.languageCode]; + String get shopByBrands => localizedValues['shopByBrands'][locale.languageCode]; + String get recentlyViewed => localizedValues['recentlyViewed'][locale.languageCode]; + String get bestSellers => localizedValues['bestSellers'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/uitl/utils.dart b/lib/uitl/utils.dart index 33a1d072..3b9fa975 100644 --- a/lib/uitl/utils.dart +++ b/lib/uitl/utils.dart @@ -1,4 +1,7 @@ import 'dart:convert'; +import 'dart:core'; +import 'dart:core'; +import 'dart:core'; import 'dart:typed_data'; import 'package:connectivity/connectivity.dart'; @@ -152,4 +155,22 @@ class Utils { static Uint8List dataFromBase64String(String base64String) { return base64Decode(base64String); } + +} +// extension function that use in iterations(list.. etc) to iterate items and get index and item it self +extension IndexedIterable on Iterable { + Iterable mapIndexed(T Function(E e, int i) f) { + var i = 0; + return map((e) => f(e, i++)); + } } +/* + userBoard.asMap().map((i, element) => MapEntry(i, Stack( + GestureDetector(onTap: () { + setState(() { + // print("element=${element.toString()}"); + // print("element=${userBoard[i].toString()}"); + }); + }), + ))).values.toList(); + */ diff --git a/lib/widgets/others/app_scaffold_widget.dart b/lib/widgets/others/app_scaffold_widget.dart index 1bf3cb19..31005606 100644 --- a/lib/widgets/others/app_scaffold_widget.dart +++ b/lib/widgets/others/app_scaffold_widget.dart @@ -35,6 +35,7 @@ class AppScaffold extends StatelessWidget { final String title; final String description; final bool isShowDecPage; + final Color backgroundColor; AuthenticatedUserObject authenticatedUserObject = locator(); @@ -50,14 +51,14 @@ class AppScaffold extends StatelessWidget { this.floatingActionButton, this.title, this.description, - this.isShowDecPage = true, this.isBottomBar}); + this.isShowDecPage = true, this.isBottomBar,this.backgroundColor}); @override Widget build(BuildContext context) { AppGlobal.context = context; return Scaffold( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, + backgroundColor: backgroundColor ?? Theme.of(context).scaffoldBackgroundColor, appBar: isShowAppBar ? AppBar( elevation: 0, @@ -110,6 +111,6 @@ class AppScaffold extends StatelessWidget { buildBodyWidget() { // return body; //Stack(children: [body, buildAppLoaderWidget(isLoading)]); - return Stack(children: [body, FloatingSearchButton()]); + return Stack(children: [body, /*FloatingSearchButton()*/]); } } diff --git a/pubspec.yaml b/pubspec.yaml index 24dc3a23..8155dc59 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -75,6 +75,9 @@ dependencies: # charts charts_flutter: ^0.9.0 + #image banner slider + carousel_slider: ^2.3.1 + # Qr code Scanner TODO fix it #barcode_scan: ^3.0.1 @@ -171,6 +174,7 @@ flutter: - assets/images/svg/ - assets/tracker/ - assets/images/AlHabibMedicalService/ + - assets/images/pharmacy_module/ fonts: From 9a169ff77bde4349ed64e5fea20b88a26d738d5d Mon Sep 17 00:00:00 2001 From: mosazaid Date: Thu, 5 Nov 2020 09:57:17 +0200 Subject: [PATCH 2/4] finish home page and start working on order preview page --- lib/config/config.dart | 2 + lib/config/localized_values.dart | 4 + lib/config/shared_pref_kay.dart | 1 + lib/core/model/pharmacies/Addresses.dart | 85 ++++++++++ .../Customer.dart | 0 .../Manufacturer.dart | 0 .../PharmacyImageObject.dart | 0 .../PharmacyProduct.dart | 0 .../Reviews.dart | 2 +- lib/core/service/client/base_app_client.dart | 2 +- .../parmacyModule/order-preview-service.dart | 29 ++++ .../parmacyModule/parmacy_module_service.dart | 31 +++- .../pharmacyModule/OrderPreviewViewModel.dart | 8 + .../pharmacy_module_view_model.dart | 22 ++- lib/locator.dart | 5 +- lib/pages/landing/home_page.dart | 2 +- .../screens/order-preview-page.dart | 48 ++++++ .../screens}/pharmacy_module_page.dart | 26 +++- .../screens/phramacy-product-detail-page.dart | 19 +++ .../widgets/BannerPager.dart | 0 .../pharmacies/widgets/ProductOrderItem.dart | 13 ++ .../pharmacies/widgets/ProductTileItem.dart | 146 ++++++++++++++++++ .../widgets/manufacturerItem.dart | 2 +- .../widgets/ProductTileItem.dart | 107 ------------- lib/uitl/translations_delegate_base.dart | 1 + lib/widgets/buttons/GestureIconButton.dart | 70 +++++++++ .../buttons}/borderedButton.dart | 0 27 files changed, 499 insertions(+), 126 deletions(-) create mode 100644 lib/core/model/pharmacies/Addresses.dart rename lib/core/model/{pharmacy_module => pharmacies}/Customer.dart (100%) rename lib/core/model/{pharmacy_module => pharmacies}/Manufacturer.dart (100%) rename lib/core/model/{pharmacy_module => pharmacies}/PharmacyImageObject.dart (100%) rename lib/core/model/{pharmacy_module => pharmacies}/PharmacyProduct.dart (100%) rename lib/core/model/{pharmacy_module => pharmacies}/Reviews.dart (98%) create mode 100644 lib/core/service/parmacyModule/order-preview-service.dart create mode 100644 lib/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart create mode 100644 lib/pages/pharmacies/screens/order-preview-page.dart rename lib/pages/{pharmacyModule => pharmacies/screens}/pharmacy_module_page.dart (87%) create mode 100644 lib/pages/pharmacies/screens/phramacy-product-detail-page.dart rename lib/pages/{pharmacyModule => pharmacies}/widgets/BannerPager.dart (100%) create mode 100644 lib/pages/pharmacies/widgets/ProductOrderItem.dart create mode 100644 lib/pages/pharmacies/widgets/ProductTileItem.dart rename lib/pages/{pharmacyModule => pharmacies}/widgets/manufacturerItem.dart (92%) delete mode 100644 lib/pages/pharmacyModule/widgets/ProductTileItem.dart create mode 100644 lib/widgets/buttons/GestureIconButton.dart rename lib/{pages/pharmacyModule/widgets => widgets/buttons}/borderedButton.dart (100%) diff --git a/lib/config/config.dart b/lib/config/config.dart index 457a1a76..20bf9caa 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -336,6 +336,8 @@ const GET_E_REFERRALS = "Services/Patients.svc/REST/GetEReferrals"; const GET_PHARMACY_BANNER = "epharmacy/api/promotionbanners"; const GET_PHARMACY_TOP_MANUFACTURER = "epharmacy/api/topmanufacturer"; const GET_PHARMACY_BEST_SELLER_PRODUCT = "epharmacy/api/bestsellerproducts"; +const GET_PHARMACY_PRODUCTs_BY_IDS = "epharmacy/api/productsbyids/"; +const GET_CUSTOMERS_ADDRESSES = "epharmacy/api/Customers/"; // Home Health Care const HHC_GET_ALL_SERVICES = diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 10d82424..4b693fcd 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -650,4 +650,8 @@ const Map> localizedValues = { "en": "Best Sellers", "ar": "أفضل البائعين" }, + "deleteAllItems": { + "en": "Delete All Items", + "ar": "حذف كافة العناصر" + }, }; diff --git a/lib/config/shared_pref_kay.dart b/lib/config/shared_pref_kay.dart index 7422052d..c5fafe03 100644 --- a/lib/config/shared_pref_kay.dart +++ b/lib/config/shared_pref_kay.dart @@ -16,3 +16,4 @@ const USER_LONG = 'user-long'; const IS_GO_TO_PARKING = 'IS_GO_TO_PARKING'; const IS_SEARCH_APPO = 'is-search-appo'; const IS_LIVECARE_APPOINTMENT = 'is_livecare_appointment'; +const PHARMACY_LAST_VISITED_PRODUCTS = 'last-visited'; diff --git a/lib/core/model/pharmacies/Addresses.dart b/lib/core/model/pharmacies/Addresses.dart new file mode 100644 index 00000000..74d5a591 --- /dev/null +++ b/lib/core/model/pharmacies/Addresses.dart @@ -0,0 +1,85 @@ +class Addresses { + String id; + String firstName; + String lastName; + String email; + String company; + int countryId; + String country; + String stateProvinceId; + String city; + String address1; + String address2; + String zipPostalCode; + String phoneNumber; + String faxNumber; + String customerAttributes; + String createdOnUtc; + String province; + String latLong; + + Addresses( + {this.id, + this.firstName, + this.lastName, + this.email, + this.company, + this.countryId, + this.country, + this.stateProvinceId, + this.city, + this.address1, + this.address2, + this.zipPostalCode, + this.phoneNumber, + this.faxNumber, + this.customerAttributes, + this.createdOnUtc, + this.province, + this.latLong}); + + Addresses.fromJson(Map json) { + id = json['id']; + firstName = json['first_name']; + lastName = json['last_name']; + email = json['email']; + company = json['company']; + countryId = json['country_id']; + country = json['country']; + stateProvinceId = json['state_province_id']; + city = json['city']; + address1 = json['address1']; + address2 = json['address2']; + zipPostalCode = json['zip_postal_code']; + phoneNumber = json['phone_number']; + faxNumber = json['fax_number']; + customerAttributes = json['customer_attributes']; + createdOnUtc = json['created_on_utc']; + province = json['province']; + latLong = json['lat_long']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['first_name'] = this.firstName; + data['last_name'] = this.lastName; + data['email'] = this.email; + data['company'] = this.company; + data['country_id'] = this.countryId; + data['country'] = this.country; + data['state_province_id'] = this.stateProvinceId; + data['city'] = this.city; + data['address1'] = this.address1; + data['address2'] = this.address2; + data['zip_postal_code'] = this.zipPostalCode; + data['phone_number'] = this.phoneNumber; + data['fax_number'] = this.faxNumber; + data['customer_attributes'] = this.customerAttributes; + data['created_on_utc'] = this.createdOnUtc; + data['province'] = this.province; + data['lat_long'] = this.latLong; + return data; + } + +} diff --git a/lib/core/model/pharmacy_module/Customer.dart b/lib/core/model/pharmacies/Customer.dart similarity index 100% rename from lib/core/model/pharmacy_module/Customer.dart rename to lib/core/model/pharmacies/Customer.dart diff --git a/lib/core/model/pharmacy_module/Manufacturer.dart b/lib/core/model/pharmacies/Manufacturer.dart similarity index 100% rename from lib/core/model/pharmacy_module/Manufacturer.dart rename to lib/core/model/pharmacies/Manufacturer.dart diff --git a/lib/core/model/pharmacy_module/PharmacyImageObject.dart b/lib/core/model/pharmacies/PharmacyImageObject.dart similarity index 100% rename from lib/core/model/pharmacy_module/PharmacyImageObject.dart rename to lib/core/model/pharmacies/PharmacyImageObject.dart diff --git a/lib/core/model/pharmacy_module/PharmacyProduct.dart b/lib/core/model/pharmacies/PharmacyProduct.dart similarity index 100% rename from lib/core/model/pharmacy_module/PharmacyProduct.dart rename to lib/core/model/pharmacies/PharmacyProduct.dart diff --git a/lib/core/model/pharmacy_module/Reviews.dart b/lib/core/model/pharmacies/Reviews.dart similarity index 98% rename from lib/core/model/pharmacy_module/Reviews.dart rename to lib/core/model/pharmacies/Reviews.dart index ec0de75e..f924dce3 100644 --- a/lib/core/model/pharmacy_module/Reviews.dart +++ b/lib/core/model/pharmacies/Reviews.dart @@ -1,4 +1,4 @@ -import 'Customer.dart'; +import '../pharmacies/Customer.dart'; class Reviews { int id; diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index 11319d96..dba6181e 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -156,7 +156,7 @@ class BaseAppClient { final response = await http.get(url.trim(), headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' - }); + },); final int statusCode = response.statusCode; print("statusCode :$statusCode"); diff --git a/lib/core/service/parmacyModule/order-preview-service.dart b/lib/core/service/parmacyModule/order-preview-service.dart new file mode 100644 index 00000000..1f3f9ddd --- /dev/null +++ b/lib/core/service/parmacyModule/order-preview-service.dart @@ -0,0 +1,29 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; + +class OrderPreviewService extends BaseService{ + bool isFinished = true; + bool hasError = false; + String errorMsg = ''; + + List addresses = List(); + + Future getBannerListList() async { + hasError = false; + try { + await baseAppClient.get(GET_CUSTOMERS_ADDRESSES, + onSuccess: (dynamic response, int statusCode) { + addresses.clear(); + response['customers'][0]['addresses'].forEach((item) { + addresses.add(Addresses.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }); + } catch (error) { + throw error; + } + } +} \ No newline at end of file diff --git a/lib/core/service/parmacyModule/parmacy_module_service.dart b/lib/core/service/parmacyModule/parmacy_module_service.dart index 3bec5ba5..8584e140 100644 --- a/lib/core/service/parmacyModule/parmacy_module_service.dart +++ b/lib/core/service/parmacyModule/parmacy_module_service.dart @@ -1,7 +1,8 @@ import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy_module/Manufacturer.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy_module/PharmacyImageObject.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy_module/PharmacyProduct.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/Manufacturer.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyImageObject.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; class PharmacyModuleService extends BaseService { @@ -12,6 +13,7 @@ class PharmacyModuleService extends BaseService { List bannerItems = List(); List manufacturerList = List(); List bestSellerProducts = List(); + List lastVisitedProducts = List(); Future getBannerListList() async { hasError = false; @@ -69,4 +71,27 @@ class PharmacyModuleService extends BaseService { throw error; } } + + Future getLastVisitedProducts() async { + String lastVisited = ""; + if (await this.sharedPref.getString(PHARMACY_LAST_VISITED_PRODUCTS) != + null) { + lastVisited = + await this.sharedPref.getString(PHARMACY_LAST_VISITED_PRODUCTS); + try { + await baseAppClient.get("$GET_PHARMACY_PRODUCTs_BY_IDS$lastVisited", + onSuccess: (dynamic response, int statusCode) { + lastVisitedProducts.clear(); + response['products'].forEach((item) { + lastVisitedProducts.add(PharmacyProduct.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }); + } catch (error) { + throw error; + } + } + } } diff --git a/lib/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart b/lib/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart new file mode 100644 index 00000000..00f4819b --- /dev/null +++ b/lib/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart @@ -0,0 +1,8 @@ +import 'package:diplomaticquarterapp/core/service/parmacyModule/order-preview-service.dart'; + +import '../../../locator.dart'; +import '../base_view_model.dart'; + +class OrderPreviewViewModel extends BaseViewModel { + OrderPreviewService _orderService = locator(); +} diff --git a/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart b/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart index 8d9207b0..f8c574f7 100644 --- a/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart +++ b/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart @@ -1,7 +1,7 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy_module/Manufacturer.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy_module/PharmacyImageObject.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy_module/PharmacyProduct.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/Manufacturer.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyImageObject.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart'; import 'package:diplomaticquarterapp/core/service/parmacyModule/parmacy_module_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; @@ -14,7 +14,11 @@ class PharmacyModuleViewModel extends BaseViewModel { List get manufacturerList => _pharmacyService.manufacturerList; - List get bestSellerProduct => _pharmacyService.bestSellerProducts; + List get bestSellerProduct => + _pharmacyService.bestSellerProducts; + + List get lastVisitedProducts => + _pharmacyService.lastVisitedProducts; Future getPharmacyHomeData() async { setState(ViewState.Busy); @@ -49,6 +53,16 @@ class PharmacyModuleViewModel extends BaseViewModel { _getBestSellerProducts() async { await _pharmacyService.getBestSellerProducts(); + if (_pharmacyService.hasError) { + error = _pharmacyService.error; + setState(ViewState.Error); + } else { + _getLastVisitedProducts(); + } + } + + _getLastVisitedProducts() async { + await _pharmacyService.getLastVisitedProducts(); if (_pharmacyService.hasError) { error = _pharmacyService.error; setState(ViewState.Error); diff --git a/lib/locator.dart b/lib/locator.dart index 203bd8a0..a7352b47 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -42,6 +42,7 @@ import 'core/service/medical/prescriptions_service.dart'; import 'core/service/medical/radiology_service.dart'; import 'core/service/medical/reports_monthly_service.dart'; import 'core/service/medical/vital_sign_service.dart'; +import 'core/service/parmacyModule/order-preview-service.dart'; import 'core/viewModels/AlHabibMedicalService/cmc_view_model.dart'; import 'core/service/parmacyModule/parmacy_module_service.dart'; @@ -80,6 +81,7 @@ import 'core/viewModels/pharmacies_view_model.dart'; import 'core/service/pharmacies_service.dart'; import 'core/service/insurance_service.dart'; import 'core/viewModels/insurance_card_View_model.dart'; +import 'core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; import 'core/viewModels/pharmacyModule/pharmacy_module_view_model.dart'; import 'core/viewModels/qr_view_model.dart'; import 'core/viewModels/vaccine_view_model.dart'; @@ -139,6 +141,7 @@ void setupLocator() { locator.registerLazySingleton(() => PharmacyModuleService()); + locator.registerLazySingleton(() => OrderPreviewService()); /// View Model @@ -188,7 +191,7 @@ void setupLocator() { - locator.registerFactory(() => PharmacyModuleViewModel()); + locator.registerFactory(() => OrderPreviewViewModel()); } diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index 59f01705..8cd9923f 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -10,7 +10,7 @@ import 'package:diplomaticquarterapp/pages/ErService/ErOptions.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/livecare/livecare_home.dart'; import 'package:diplomaticquarterapp/pages/paymentService/payment_service.dart'; -import 'package:diplomaticquarterapp/pages/pharmacyModule/pharmacy_module_page.dart'; +import 'file:///C:/Users/admin/AndroidStudioProjects/diplomatic-quarter/lib/pages/pharmacies/screens/pharmacy_module_page.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; diff --git a/lib/pages/pharmacies/screens/order-preview-page.dart b/lib/pages/pharmacies/screens/order-preview-page.dart new file mode 100644 index 00000000..d9646fcf --- /dev/null +++ b/lib/pages/pharmacies/screens/order-preview-page.dart @@ -0,0 +1,48 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/GestureIconButton.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; + +class OrderPreviewPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return BaseView( + builder: (_, model, wi) => AppScaffold( + title: "Shopping Cart", + isShowAppBar: true, + isShowDecPage: false, + baseViewModel: model, + backgroundColor: Colors.white, + body: Container( + width: double.infinity, + child: SingleChildScrollView( + child: Container( + margin: EdgeInsets.all(10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + GestureIconButton( + TranslationBase.of(context).deleteAllItems, + Icon(Icons.delete_outline_sharp, color: Colors.grey.shade800,), + onTap: () => {}, + ), + const Divider( + color: Colors.grey, + height: 20, + thickness: 1, + indent: 0, + endIndent: 0, + ), + + ], + ), + ), + ), + ), + ), + ); + } +} + diff --git a/lib/pages/pharmacyModule/pharmacy_module_page.dart b/lib/pages/pharmacies/screens/pharmacy_module_page.dart similarity index 87% rename from lib/pages/pharmacyModule/pharmacy_module_page.dart rename to lib/pages/pharmacies/screens/pharmacy_module_page.dart index 60d55437..f9c6cdeb 100644 --- a/lib/pages/pharmacyModule/pharmacy_module_page.dart +++ b/lib/pages/pharmacies/screens/pharmacy_module_page.dart @@ -2,13 +2,15 @@ import 'package:diplomaticquarterapp/config/size_config.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/landing/home_page.dart'; -import 'package:diplomaticquarterapp/pages/pharmacyModule/widgets/BannerPager.dart'; -import 'package:diplomaticquarterapp/pages/pharmacyModule/widgets/ProductTileItem.dart'; -import 'package:diplomaticquarterapp/pages/pharmacyModule/widgets/borderedButton.dart'; -import 'package:diplomaticquarterapp/pages/pharmacyModule/widgets/manufacturerItem.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/order-preview-page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/widgets/BannerPager.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/widgets/ProductTileItem.dart'; +import 'file:///C:/Users/admin/AndroidStudioProjects/diplomatic-quarter/lib/widgets/buttons/borderedButton.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/widgets/manufacturerItem.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/material.dart'; class PharmacyPage extends StatelessWidget { @@ -82,7 +84,15 @@ class PharmacyPage extends StatelessWidget { ], ), ), - Container(), + Container( + height: model.lastVisitedProducts.length > 0 ? MediaQuery.of(context).size.height / 4 : 0, + child: ListView.builder( + itemBuilder: (ctx, i) => + ProductTileItem(model.lastVisitedProducts[i]), + scrollDirection: Axis.horizontal, + itemCount: model.lastVisitedProducts.length, + ), + ), Container( margin: EdgeInsets.fromLTRB(10, 10, 10, 10), child: Row( @@ -144,7 +154,9 @@ class GridViewButtons extends StatelessWidget { child: GridViewCard( TranslationBase.of(context).offersAndPromotions, 'assets/images/pharmacy_module/offer_icon.png', - () {}), + () { + Navigator.push(context, FadePage(page: OrderPreviewPage())); + }), ), DashboardItem( imageName: 'pharmacy_module/bg_2.png', @@ -210,7 +222,7 @@ class GridViewCard extends StatelessWidget { Expanded( child: BorderedButton( TranslationBase.of(context).viewAll, - handler: () {}, + handler: handler, ), ), ], diff --git a/lib/pages/pharmacies/screens/phramacy-product-detail-page.dart b/lib/pages/pharmacies/screens/phramacy-product-detail-page.dart new file mode 100644 index 00000000..afbd2b06 --- /dev/null +++ b/lib/pages/pharmacies/screens/phramacy-product-detail-page.dart @@ -0,0 +1,19 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; + +class ProductDetailScreen extends StatelessWidget { + final PharmacyProduct product; + + ProductDetailScreen(this.product); + + @override + Widget build(BuildContext context) { + return AppScaffold( + body: Center( + child: Texts("id = ${product.id}"), + ), + ); + } +} diff --git a/lib/pages/pharmacyModule/widgets/BannerPager.dart b/lib/pages/pharmacies/widgets/BannerPager.dart similarity index 100% rename from lib/pages/pharmacyModule/widgets/BannerPager.dart rename to lib/pages/pharmacies/widgets/BannerPager.dart diff --git a/lib/pages/pharmacies/widgets/ProductOrderItem.dart b/lib/pages/pharmacies/widgets/ProductOrderItem.dart new file mode 100644 index 00000000..81b6068a --- /dev/null +++ b/lib/pages/pharmacies/widgets/ProductOrderItem.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; + +class ProductOrderItem extends StatelessWidget { + @override + Widget build(BuildContext context) { + return ListTile( + leading: Icon( + Icons.delete_outline_sharp, + color: Colors.grey.shade800, + ), + ); + } +} diff --git a/lib/pages/pharmacies/widgets/ProductTileItem.dart b/lib/pages/pharmacies/widgets/ProductTileItem.dart new file mode 100644 index 00000000..62493387 --- /dev/null +++ b/lib/pages/pharmacies/widgets/ProductTileItem.dart @@ -0,0 +1,146 @@ +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/phramacy-product-detail-page.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ProductTileItem extends StatelessWidget { + final AppSharedPreferences sharedPref = AppSharedPreferences(); + final PharmacyProduct item; + + ProductTileItem(this.item); + + void productOnClick(BuildContext ctx) { + _saveLastVisitProducts(); + Navigator.push(ctx, FadePage(page: ProductDetailScreen(item))); + } + + void _saveLastVisitProducts() async { + String lastVisited = ""; + bool isIdExist = false; + if (await this.sharedPref.getString(PHARMACY_LAST_VISITED_PRODUCTS) != + null) { + lastVisited = + await this.sharedPref.getString(PHARMACY_LAST_VISITED_PRODUCTS); + lastVisited.split(",").forEach((id) { + if (id == item.id) { + isIdExist = true; + } + }); + } + if (!isIdExist) { + if (lastVisited == "") { + // it means there is no lastVisited yet + lastVisited = "${item.id}"; + } else { + // there is lastVisited id's and this product id is not found + lastVisited += ",${item.id}"; + } + sharedPref.setString(PHARMACY_LAST_VISITED_PRODUCTS, lastVisited); + } + } + + @override + Widget build(BuildContext context) { + ProjectViewModel projectProvider = Provider.of(context); + return InkWell( + onTap: () => productOnClick(context), + splashColor: Theme.of(context).primaryColor, + child: Card( + elevation: 2, + shape: Border(right: BorderSide(color: Colors.grey.shade300, width: 1)), + margin: EdgeInsets.symmetric( + horizontal: 8, + vertical: 4, + ), + child: Container( + padding: EdgeInsets.symmetric(horizontal: 0), + width: MediaQuery.of(context).size.width / 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Stack( + children: [ + Container( + margin: EdgeInsets.fromLTRB(0, 16, 0, 0), + alignment: Alignment.center, + child: Image.network( + item.images[0].src, + fit: BoxFit.cover, + height: 80, + ), + ), + Container( + width: item.rxMessage != null + ? MediaQuery.of(context).size.width / 5 + : 0, + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: Color(0xffb23838), + borderRadius: + BorderRadius.only(topLeft: Radius.circular(6)), + ), + child: Texts( + item.rxMessage != null ? item.rxMessage : "", + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: FontWeight.w400, + ), + ) + ], + ), + Container( + margin: EdgeInsets.symmetric( + horizontal: 6, + vertical: 0, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + projectProvider.isArabic ? item.name : item.namen, + regular: true, + fontSize: 12, + fontWeight: FontWeight.w400, + ), + Padding( + padding: const EdgeInsets.only(top: 4, bottom: 4), + child: Texts( + "SAR ${item.price}", + bold: true, + fontSize: 14, + ), + ), + Row( + children: [ + StarRating( + totalAverage: item.approvedTotalReviews > 0 + ? (item.approvedRatingSum.toDouble() / + item.approvedTotalReviews.toDouble()) + .toDouble() + : 0, + forceStars: true), + Texts( + "(${item.approvedTotalReviews})", + regular: true, + fontSize: 10, + fontWeight: FontWeight.w400, + ) + ], + ), + ], + ), + ) + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/pharmacyModule/widgets/manufacturerItem.dart b/lib/pages/pharmacies/widgets/manufacturerItem.dart similarity index 92% rename from lib/pages/pharmacyModule/widgets/manufacturerItem.dart rename to lib/pages/pharmacies/widgets/manufacturerItem.dart index e29de45c..7ffa3d89 100644 --- a/lib/pages/pharmacyModule/widgets/manufacturerItem.dart +++ b/lib/pages/pharmacies/widgets/manufacturerItem.dart @@ -1,4 +1,4 @@ -import 'package:diplomaticquarterapp/core/model/pharmacy_module/Manufacturer.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/Manufacturer.dart'; import 'package:flutter/material.dart'; class ManufacturerItem extends StatelessWidget { diff --git a/lib/pages/pharmacyModule/widgets/ProductTileItem.dart b/lib/pages/pharmacyModule/widgets/ProductTileItem.dart deleted file mode 100644 index fdce3559..00000000 --- a/lib/pages/pharmacyModule/widgets/ProductTileItem.dart +++ /dev/null @@ -1,107 +0,0 @@ -import 'package:diplomaticquarterapp/core/model/pharmacy_module/PharmacyProduct.dart'; -import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; - -class ProductTileItem extends StatelessWidget { - final PharmacyProduct item; - - ProductTileItem(this.item); - - @override - Widget build(BuildContext context) { - ProjectViewModel projectProvider = Provider.of(context); - return Card( - elevation: 2, - shape: Border(right: BorderSide(color: Colors.grey.shade300, width: 1)), - margin: EdgeInsets.symmetric( - horizontal: 8, - vertical: 4, - ), - child: Container( - padding: EdgeInsets.symmetric(horizontal: 0), - width: MediaQuery.of(context).size.width / 3, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Stack( - children: [ - Container( - margin: EdgeInsets.fromLTRB(0, 16, 0, 0), - alignment: Alignment.center, - child: Image.network( - item.images[0].src, - fit: BoxFit.cover, - height: 80, - ), - ), - Container( - width: item.rxMessage != null - ? MediaQuery.of(context).size.width / 5 - : 0, - padding: EdgeInsets.all(4), - decoration: BoxDecoration( - color: Color(0xffb23838), - borderRadius: - BorderRadius.only(topLeft: Radius.circular(6)), - ), - child: Texts( - item.rxMessage != null ? item.rxMessage : "", - color: Colors.white, - regular: true, - fontSize: 10, - fontWeight: FontWeight.w400, - ), - ) - ], - ), - Container( - margin: EdgeInsets.symmetric( - horizontal: 6, - vertical: 0, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Texts( - projectProvider.isArabic ? item.name : item.namen, - regular: true, - fontSize: 12, - fontWeight: FontWeight.w400, - ), - Padding( - padding: const EdgeInsets.only(top: 4, bottom: 4), - child: Texts( - "SAR ${item.price}", - bold: true, - fontSize: 14, - ), - ), - Row( - children: [ - StarRating( - totalAverage: item.approvedTotalReviews > 0 - ? (item.approvedRatingSum.toDouble() / - item.approvedTotalReviews.toDouble()) - .toDouble() - : 0, - forceStars: true), - Texts( - "(${item.approvedTotalReviews})", - regular: true, - fontSize: 10, - fontWeight: FontWeight.w400, - ) - ], - ), - ], - ), - ) - ], - ), - ), - ); - } -} diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 61e24391..84eddbbb 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -694,6 +694,7 @@ class TranslationBase { String get shopByBrands => localizedValues['shopByBrands'][locale.languageCode]; String get recentlyViewed => localizedValues['recentlyViewed'][locale.languageCode]; String get bestSellers => localizedValues['bestSellers'][locale.languageCode]; + String get deleteAllItems => localizedValues['deleteAllItems'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/buttons/GestureIconButton.dart b/lib/widgets/buttons/GestureIconButton.dart new file mode 100644 index 00000000..841d7ea6 --- /dev/null +++ b/lib/widgets/buttons/GestureIconButton.dart @@ -0,0 +1,70 @@ +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:flutter/material.dart'; + +class GestureIconButton extends StatefulWidget { + GestureIconButton( + this.label, + this.icon, { + Key key, + this.onTap, + this.backgroundColor, + }) : super(key: key); + + final String label; + final Widget icon; + final VoidCallback onTap; + final Color backgroundColor; + + @override + _GestureIconButtonState createState() => _GestureIconButtonState(); +} + +class _GestureIconButtonState extends State { + bool _buttonLongPress = false; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onLongPressStart: (_) => + setState(() => _buttonLongPress = !_buttonLongPress), + onLongPressEnd: (_) => + setState(() => _buttonLongPress = !_buttonLongPress), + child: Wrap( + children: [ + Container( + decoration: BoxDecoration( + border: Border.all( + color: widget.backgroundColor != null + ? widget.backgroundColor + : Colors.grey[200], + ), + color: widget.backgroundColor != null + ? widget.backgroundColor + : Colors.grey.shade200, + borderRadius: BorderRadius.all(Radius.circular(8))), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + child: Expanded( + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.only(right: 8.0), + child: widget.icon, + ), + Texts( + widget.label, + color: _buttonLongPress ? Colors.white : Colors.black, + ), + ], + ), + ), + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/pages/pharmacyModule/widgets/borderedButton.dart b/lib/widgets/buttons/borderedButton.dart similarity index 100% rename from lib/pages/pharmacyModule/widgets/borderedButton.dart rename to lib/widgets/buttons/borderedButton.dart From dade295656da3b0b3c363fecc8c29ff2473fe996 Mon Sep 17 00:00:00 2001 From: mosazaid Date: Thu, 5 Nov 2020 10:26:04 +0200 Subject: [PATCH 3/4] fix merge issue --- lib/uitl/translations_delegate_base.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 2b794af9..c5246e35 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -706,8 +706,6 @@ class TranslationBase { String get recentlyViewed => localizedValues['recentlyViewed'][locale.languageCode]; String get bestSellers => localizedValues['bestSellers'][locale.languageCode]; String get deleteAllItems => localizedValues['deleteAllItems'][locale.languageCode]; - String get infoRadiology => - localizedValues['info-radiology'][locale.languageCode]; String get termsService => localizedValues['TermsService'][locale.languageCode]; From 2095f2c62aa074ebac74be3e84232f25d3707d68 Mon Sep 17 00:00:00 2001 From: mosazaid Date: Thu, 5 Nov 2020 10:28:59 +0200 Subject: [PATCH 4/4] fix merge issue --- lib/core/service/client/base_app_client.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index dba6181e..696489c6 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -142,7 +142,6 @@ class BaseAppClient { get(String endPoint, {Function(dynamic response, int statusCode) onSuccess, Function(String error, int statusCode) onFailure, - bool isAllowAny = false, Map queryParams}) async { String url = BASE_URL + endPoint; if (queryParams != null) {