From 9a169ff77bde4349ed64e5fea20b88a26d738d5d Mon Sep 17 00:00:00 2001 From: mosazaid Date: Thu, 5 Nov 2020 09:57:17 +0200 Subject: [PATCH] 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