Project Filter Applied on Packages & Offers

merge-update-with-lab-changes
Zohaib Iqbal Kambrani 4 years ago
parent 94a99a911e
commit 612d9eb019

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

@ -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 أيام في الأسبوع)"},

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

@ -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<OfferProject> project;
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
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<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['name'] = name;
map['id'] = id;
return map;
}
}

@ -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<String, String> packagesAuthHeader = {};
class OffersAndPackagesServices extends BaseService {
AuthenticatedUser patientUser;
List<PackagesCategoriesResponseModel> categoryList = [];
List<OfferProject> projectsList = [];
List<PackagesResponseModel> productList = [];
List<PackagesResponseModel> latestOffersList = [];
List<TamaraPaymentOption> tamaraPaymentOptions = [];
@ -39,7 +41,8 @@ class OffersAndPackagesServices extends BaseService {
PackagesCustomerResponseModel customer;
Future<List<PackagesCategoriesResponseModel>> 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<List<PackagesResponseModel>> getAllProducts({@required OffersProductsRequestModel request, @required BuildContext context, @required bool showLoading = true}) async {
Future errorThrow;
Future<List<OfferProject>> 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<List<PackagesResponseModel>> 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) {

@ -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<PackagesHomePage> {
}
PackagesCategoriesResponseModel selectedClinic;
OfferProject selectedProject;
@override
Widget build(BuildContext context) {
@ -106,6 +108,12 @@ class _PackagesHomePageState extends State<PackagesHomePage> {
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<PackagesHomePage> {
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<RadioSelectionDialogModel> list = [
for (int i = 0; i < clinics.length; i++) RadioSelectionDialogModel(clinics[i].name, i),
];
@ -204,6 +206,38 @@ class _PackagesHomePageState extends State<PackagesHomePage> {
);
}
int _selectedHospital = -1;
showHospitalSelectionList() async {
GifLoaderDialogUtils.showMyDialog(context);
var hospitals = await viewModel.service.getAllStores();
GifLoaderDialogUtils.hideDialog(context);
List<RadioSelectionDialogModel> 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
//----------------------------------

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

Loading…
Cancel
Save