From 612d9eb019441501115d6d10acc514eeacd92f05 Mon Sep 17 00:00:00 2001 From: Zohaib Iqbal Kambrani <> Date: Thu, 26 May 2022 16:11:30 +0300 Subject: [PATCH] Project Filter Applied on Packages & Offers --- lib/config/config.dart | 1 + lib/config/localized_values.dart | 4 +- .../requests/OffersProductsRequestModel.dart | 6 ++- .../offers_stores_response_model.dart | 44 +++++++++++++++++ .../PackagesOffersServices.dart | 26 ++++++++-- .../packages_offers/OfferAndPackagesPage.dart | 48 ++++++++++++++++--- lib/uitl/translations_delegate_base.dart | 4 ++ 7 files changed, 120 insertions(+), 13 deletions(-) create mode 100644 lib/core/model/packages_offers/responses/offers_stores_response_model.dart diff --git a/lib/config/config.dart b/lib/config/config.dart index a9aacb75..0a4113ed 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -11,6 +11,7 @@ final OPENTOK_API_KEY = '46209962'; var EXA_CART_API_BASE_URL = 'https://mdlaboratories.com/offersdiscounts'; // var EXA_CART_API_BASE_URL = 'http://10.200.101.75:9000'; var PACKAGES_CATEGORIES = '/api/categories'; +var PACKAGES_STORES = '/api/stores'; var PACKAGES_TOKEN = '/api/token'; var PACKAGES_PRODUCTS = '/api/products'; var PACKAGES_CUSTOMER = '/api/customers'; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index ac845410..7f2242a3 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -870,6 +870,7 @@ const Map localizedValues = { "number": {"en": "Number", "ar": "الرقم"}, "not-classified": {"en": "Not classified", "ar": "غير محدد"}, "selectClinic": {"en": "Select Clinic", "ar": " بحث بالعيادة"}, + "selectProject": {"en": "Select Hospital", "ar": " بحث المستشفى"}, "searchItemError": {"en": "Item name should be more than 3 character ", "ar": "يجب أن يكون الاسم المدخل أكثر من 3 أحرف"}, "YouCanFind": {"en": "You Can Find ", "ar": "باستطاعتك العثور على "}, "ItemInSearch": {"en": " Item in Search", "ar": " عنصر في البحث "}, @@ -1032,7 +1033,7 @@ const Map localizedValues = { "ar": "يمكنك الان التحدث مباشرة مع قسم المواعيد عن طريق خدمة المحادثة النصية أو طلب معاودة الاتصال" }, "instructions-pharmacies": {"en": "You can now talk directly to the pharmacist by chat or request a call back", "ar": "يمكنك الآن التحدث مباشرة إلى الصيدلي عن طريق الدردشة أو طلب معاودة الاتصال"}, - "select-hospital": {"en": "Choose Hospital", "ar": "اختر المستشفى"}, + "select-hospital": {"en": "Choose Hospital", "ar": "اختر المستشفىالمستشفى"}, "start": {"en": "Start", "ar": "ابدأ"}, "info-chat": { "en": "This service allows you to chat with customer service directly without the need to call.", @@ -1738,6 +1739,7 @@ const Map localizedValues = { "estimates": {"en": "Estimates the total body fat based on\nthe size", "ar": "تقدير إجمالي الدهون في الجسم بناءً على \ n الحجم"}, "myCart": {"en": "My Cart", "ar": "عربة التسوق"}, "browseOffers": {"en": "Browse offers by clinic", "ar": "تصفح العروض حسب العيادة"}, + "browseOffersByProject": {"en": "Browse offers by hospital", "ar": "تصفح العروض حسب المستشفى"}, "inactiveAct": {"en": "Almost inactive (little or no exercise)", "ar": "غير نشط تقريبا (ممارسة الرياضة قليلة أو منعدمة)"}, "light": {"en": "Lightly active (1-3) days per week", "ar": "خفيف النشاط (1-3 أيام في الأسبوع)"}, "moderate": {"en": "Moderately active (3-5) days per week)", "ar": "معتدل النشاط (3-5 أيام في الأسبوع)"}, diff --git a/lib/core/model/packages_offers/requests/OffersProductsRequestModel.dart b/lib/core/model/packages_offers/requests/OffersProductsRequestModel.dart index 583932bb..79e401a8 100644 --- a/lib/core/model/packages_offers/requests/OffersProductsRequestModel.dart +++ b/lib/core/model/packages_offers/requests/OffersProductsRequestModel.dart @@ -1,10 +1,11 @@ class OffersProductsRequestModel { final int categoryId; + final int storeId; final int limit; // final int page; int sinceId; - OffersProductsRequestModel({this.categoryId, this.limit = 50}); + OffersProductsRequestModel({this.categoryId, this.limit = 50, this.storeId}); Map toFlatMap() { return { @@ -18,6 +19,9 @@ class OffersProductsRequestModel { if(categoryId != null && categoryId > 0) "categoryId": categoryId.toString(), + if(storeId != null && storeId > 0) + "store_id": storeId.toString(), + "sinceId": sinceId != null ? sinceId.toString() : "0", }; } diff --git a/lib/core/model/packages_offers/responses/offers_stores_response_model.dart b/lib/core/model/packages_offers/responses/offers_stores_response_model.dart new file mode 100644 index 00000000..6a596e5d --- /dev/null +++ b/lib/core/model/packages_offers/responses/offers_stores_response_model.dart @@ -0,0 +1,44 @@ +class OfferProjectsResponseModel { + OfferProjectsResponseModel({ + this.project,}); + + OfferProjectsResponseModel.fromJson(dynamic json) { + if (json['stores'] != null) { + project = []; + json['stores'].forEach((v) { + project.add(OfferProject.fromJson(v)); + }); + } + } + List project; + + Map toJson() { + final map = {}; + if (project != null) { + map['stores'] = project.map((v) => v.toJson()).toList(); + } + return map; + } + +} + +class OfferProject { + OfferProject({ + this.name, + this.id,}); + + OfferProject.fromJson(dynamic json) { + name = json['name']; + id = json['id']; + } + String name; + int id; + + Map toJson() { + final map = {}; + map['name'] = name; + map['id'] = id; + return map; + } + +} \ No newline at end of file diff --git a/lib/core/service/packages_offers/PackagesOffersServices.dart b/lib/core/service/packages_offers/PackagesOffersServices.dart index 978164bd..67ce6b39 100644 --- a/lib/core/service/packages_offers/PackagesOffersServices.dart +++ b/lib/core/service/packages_offers/PackagesOffersServices.dart @@ -13,6 +13,7 @@ import 'package:diplomaticquarterapp/core/model/packages_offers/responses/Packag import 'package:diplomaticquarterapp/core/model/packages_offers/responses/PackagesCategoriesResponseModel.dart'; import 'package:diplomaticquarterapp/core/model/packages_offers/responses/PackagesCustomerResponseModel.dart'; import 'package:diplomaticquarterapp/core/model/packages_offers/responses/PackagesResponseModel.dart'; +import 'package:diplomaticquarterapp/core/model/packages_offers/responses/offers_stores_response_model.dart'; import 'package:diplomaticquarterapp/core/model/packages_offers/responses/order_response_model.dart'; import 'package:diplomaticquarterapp/core/model/packages_offers/responses/tamara_payment_option.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; @@ -25,6 +26,7 @@ Map packagesAuthHeader = {}; class OffersAndPackagesServices extends BaseService { AuthenticatedUser patientUser; List categoryList = []; + List projectsList = []; List productList = []; List latestOffersList = []; List tamaraPaymentOptions = []; @@ -39,7 +41,8 @@ class OffersAndPackagesServices extends BaseService { PackagesCustomerResponseModel customer; Future> getAllCategories(OffersCategoriesRequestModel request) async { - Future errorThrow; + if(categoryList.isNotEmpty) + return categoryList; var url = EXA_CART_API_BASE_URL + PACKAGES_CATEGORIES; await baseAppClient.simpleGet(url, headers: packagesAuthHeader, onSuccess: (dynamic stringResponse, int statusCode) { @@ -54,11 +57,26 @@ class OffersAndPackagesServices extends BaseService { return categoryList; } - Future> getAllProducts({@required OffersProductsRequestModel request, @required BuildContext context, @required bool showLoading = true}) async { - Future errorThrow; + Future> getAllStores() async { + if(projectsList.isNotEmpty) + return projectsList; + + var url = EXA_CART_API_BASE_URL + PACKAGES_STORES; + await baseAppClient.simpleGet(url, headers: packagesAuthHeader, onSuccess: (dynamic stringResponse, int statusCode) { + if (statusCode == 200) { + var jsonResponse = json.decode(stringResponse); + final response = OfferProjectsResponseModel.fromJson(jsonResponse); + projectsList = response.project; + } + }, onFailure: (String error, int statusCode) { + throw error; + }, queryParams: {'fields' : 'id,name'}); - request.sinceId = (productList.isNotEmpty) ? productList.last.id : 0; + return projectsList; + } + Future> getAllProducts({@required OffersProductsRequestModel request, @required BuildContext context, @required bool showLoading = true, bool byOffset = true}) async { + Future errorThrow; productList = []; var url = EXA_CART_API_BASE_URL + PACKAGES_PRODUCTS; await baseAppClient.simpleGet(url, headers: packagesAuthHeader, onSuccess: (dynamic stringResponse, int statusCode) { diff --git a/lib/pages/packages_offers/OfferAndPackagesPage.dart b/lib/pages/packages_offers/OfferAndPackagesPage.dart index 6f8d06b5..a388ad25 100644 --- a/lib/pages/packages_offers/OfferAndPackagesPage.dart +++ b/lib/pages/packages_offers/OfferAndPackagesPage.dart @@ -6,6 +6,7 @@ import 'package:diplomaticquarterapp/core/model/packages_offers/requests/OffersC import 'package:diplomaticquarterapp/core/model/packages_offers/requests/OffersProductsRequestModel.dart'; import 'package:diplomaticquarterapp/core/model/packages_offers/responses/PackagesCategoriesResponseModel.dart'; import 'package:diplomaticquarterapp/core/model/packages_offers/responses/PackagesResponseModel.dart'; +import 'package:diplomaticquarterapp/core/model/packages_offers/responses/offers_stores_response_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/packages_offers/PackagesOffersViewModel.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; @@ -88,6 +89,7 @@ class _PackagesHomePageState extends State { } PackagesCategoriesResponseModel selectedClinic; + OfferProject selectedProject; @override Widget build(BuildContext context) { @@ -106,6 +108,12 @@ class _PackagesHomePageState extends State { if(OFFERS_VIEW_ONLY) inputWidget(TranslationBase.of(context).search, "", _searchTextController, isInputTypeNum: false), SizedBox(height: 12), + Padding( + padding: const EdgeInsets.only(left: 21, right: 21), + child: CommonDropDownView(TranslationBase.of(context).browseOffersByProject, selectedProject?.name ?? TranslationBase.of(context).selectProject, () => showHospitalSelectionList()) + .withBorderedContainer, + ), + SizedBox(height: 12), Padding( padding: const EdgeInsets.only(left: 21, right: 21), child: CommonDropDownView(TranslationBase.of(context).browseOffers, selectedClinic?.name ?? TranslationBase.of(context).selectClinic, () => showClinicSelectionList()) @@ -174,13 +182,7 @@ class _PackagesHomePageState extends State { int _selectedClinic = -1; showClinicSelectionList() async { - var clinics = viewModel.service.categoryList; - if (clinics.isEmpty) { - GifLoaderDialogUtils.showMyDialog(context); - clinics = await viewModel.service.getAllCategories(OffersCategoriesRequestModel()); - GifLoaderDialogUtils.hideDialog(context); - } - + var clinics = await viewModel.service.getAllCategories(OffersCategoriesRequestModel()); List list = [ for (int i = 0; i < clinics.length; i++) RadioSelectionDialogModel(clinics[i].name, i), ]; @@ -204,6 +206,38 @@ class _PackagesHomePageState extends State { ); } + int _selectedHospital = -1; + + showHospitalSelectionList() async { + GifLoaderDialogUtils.showMyDialog(context); + var hospitals = await viewModel.service.getAllStores(); + GifLoaderDialogUtils.hideDialog(context); + + List list = [ + for (int i = 0; i < hospitals.length; i++) RadioSelectionDialogModel(hospitals[i].name, i), + ]; + showDialog( + context: context, + builder: (cxt) => RadioSelectionDialog( + listData: list, + selectedIndex: _selectedHospital, + isScrollable: true, + onValueSelected: (index) async { + _selectedHospital = index; + selectedProject = hospitals[index]; + var request = OffersProductsRequestModel(storeId: selectedProject.id); + request.sinceId = 0; + var products = await viewModel.service.getAllProducts(request: request, context: context, showLoading: true); + if (products.isNotEmpty) + Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context) => ClinicPackagesPage(products: products))); + else + utils.Utils.showErrorToast("No offers available for this clinic"); + setState(() {}); + }, + ), + ); + } + //---------------------------------- // Main Widgets of Page //---------------------------------- diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index a2d4fcca..917c3d01 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -1351,6 +1351,8 @@ class TranslationBase { String get selectClinic => localizedValues['selectClinic'][locale.languageCode]; + String get selectProject => localizedValues['selectProject'][locale.languageCode]; + String get orderStatus => localizedValues['orderStatus'][locale.languageCode]; String get findUs => localizedValues['FindUs'][locale.languageCode]; @@ -2678,6 +2680,8 @@ class TranslationBase { String get browseOffers => localizedValues["browseOffers"][locale.languageCode]; + String get browseOffersByProject => localizedValues["browseOffersByProject"][locale.languageCode]; + String get myCart => localizedValues["myCart"][locale.languageCode]; String get neck => localizedValues["neck"][locale.languageCode];