diff --git a/lib/pages/final_products_page.dart b/lib/pages/final_products_page.dart index 31747141..fff272b3 100644 --- a/lib/pages/final_products_page.dart +++ b/lib/pages/final_products_page.dart @@ -49,7 +49,6 @@ class _FinalProductsPageState extends State { Widget build(BuildContext context) { return BaseView( onModelReady: (model) { - //TODO Elham* fix all services in order handel errors in better way in the service if (widget.productType == 1) { model.getFinalProducts(i: id); appBarTitle = TranslationBase.of(context).products; diff --git a/lib/pages/pharmacies/my_reviews.dart b/lib/pages/pharmacies/my_reviews.dart index 7e7e33a0..47aa382f 100644 --- a/lib/pages/pharmacies/my_reviews.dart +++ b/lib/pages/pharmacies/my_reviews.dart @@ -137,7 +137,7 @@ reviewDetails(data, rate, myRate) { : Alignment.topLeft, child: RichText( text: TextSpan( - text: data.product.price.toString() + + text: data.product.quantity.toString() + " " + data.product.currency, style: TextStyle( diff --git a/lib/pages/pharmacies/screens/product-details/availability_info.dart b/lib/pages/pharmacies/screens/product-details/availability_info.dart index 6a6fdfd5..9e717de6 100644 --- a/lib/pages/pharmacies/screens/product-details/availability_info.dart +++ b/lib/pages/pharmacies/screens/product-details/availability_info.dart @@ -78,4 +78,13 @@ class AvailabilityInfo extends StatelessWidget { }, ); } + + convertCityName(txt) { + String stringTxt; + String newTxt; + stringTxt = txt.toString(); + newTxt = stringTxt.split('.')[1]; + + return newTxt; + } } diff --git a/lib/pages/pharmacies/screens/product-details/footor/footer-widget.dart b/lib/pages/pharmacies/screens/product-details/footor/footer-widget.dart index 4233e42a..43abcae5 100644 --- a/lib/pages/pharmacies/screens/product-details/footor/footer-widget.dart +++ b/lib/pages/pharmacies/screens/product-details/footor/footer-widget.dart @@ -19,12 +19,12 @@ class FooterWidget extends StatefulWidget { final PharmacyProduct item; final Function addToCartFunction; - int price; + int quantity; bool isOverQuantity; FooterWidget(this.isAvailable, this.maxQuantity, this.minQuantity, this.quantityLimit, this.item, - {this.price, this.isOverQuantity = false, this.addToCartFunction}); + {this.quantity, this.isOverQuantity = false, this.addToCartFunction}); @override _FooterWidgetState createState() => _FooterWidgetState(); @@ -97,7 +97,7 @@ class _FooterWidgetState extends State { QuantityBox( label: i, onTapFunc: onChangeValue, - isSelected: widget.price == i), + isSelected: widget.quantity == i), Column( children: [ Container( @@ -111,14 +111,14 @@ class _FooterWidgetState extends State { decoration: InputDecoration( labelText: 'quantity #'), onChanged: (text) { - print(widget.price); + print(widget.quantity); print(widget.quantityLimit); if (int.tryParse(text) == null) { text = ''; } else { setState(() { - widget.price = int.parse(text); - if (widget.price >= + widget.quantity = int.parse(text); + if (widget.quantity >= widget.quantityLimit) { widget.isOverQuantity = true; } else { @@ -156,7 +156,7 @@ class _FooterWidgetState extends State { Expanded( flex: 4, child: Text( - widget.price.toString(), + widget.quantity.toString(), style: TextStyle(fontSize: 20), ), ), @@ -186,8 +186,8 @@ class _FooterWidgetState extends State { width: MediaQuery.of(context).size.width * 0.45, child: SecondaryButton( label: TranslationBase.of(context).addToCart.toUpperCase(), - disabled: !widget.isAvailable && widget.price > 0 || - widget.price > widget.quantityLimit || + disabled: !widget.isAvailable && widget.quantity > 0 || + widget.quantity > widget.quantityLimit || widget.item.rxMessage != null, disableColor: Colors.green[400], onTap: () async { @@ -197,7 +197,7 @@ class _FooterWidgetState extends State { ); } else await widget.addToCartFunction( - widget.price, widget.item.id, context); + widget.quantity, widget.item.id, context); }, borderRadius: 5, color: Colors.green, @@ -210,12 +210,12 @@ class _FooterWidgetState extends State { width: MediaQuery.of(context).size.width * 0.35, child: SecondaryButton( label: TranslationBase.of(context).buyNow.toUpperCase(), - disabled: !widget.isAvailable && widget.price > 0 || - widget.price > widget.quantityLimit || + disabled: !widget.isAvailable && widget.quantity > 0 || + widget.quantity > widget.quantityLimit || widget.item.rxMessage != null, onTap: () async { await widget.addToCartFunction( - widget.price, widget.item.id, context); + widget.quantity, widget.item.id, context); Navigator.push( context, FadePage(page: CartOrderPage()), @@ -223,8 +223,8 @@ class _FooterWidgetState extends State { }, borderRadius: 5, disableColor: Colors.grey[700], - color: !widget.isAvailable && widget.price > 0 || - widget.price > widget.quantityLimit || + color: !widget.isAvailable && widget.quantity > 0 || + widget.quantity > widget.quantityLimit || widget.item.rxMessage != null ? Colors.grey : Colors.grey[800], @@ -239,13 +239,12 @@ class _FooterWidgetState extends State { onChangeValue(int i) { setState(() { - ///TODO Elham* Check this if its good - widget.price = i; - if (widget.price >= widget.quantityLimit) { + widget.quantity = i; + if (widget.quantity >= widget.quantityLimit) { widget.isOverQuantity = true; } else { widget.isOverQuantity = false; - return widget.price; + return widget.quantity; } }); } diff --git a/lib/pages/pharmacies/screens/product-details/product-detail.dart b/lib/pages/pharmacies/screens/product-details/product-detail.dart index 63765ed4..f3524b35 100644 --- a/lib/pages/pharmacies/screens/product-details/product-detail.dart +++ b/lib/pages/pharmacies/screens/product-details/product-detail.dart @@ -1,43 +1,28 @@ import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/config/size_config.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart'; -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/product_detail_view_model.dart'; -import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/compare-list.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/screens/product-details/product-name-and-price.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/screens/product-details/recommended_products.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/screens/product-details/reviews_info.dart'; -import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/product-details/shared/custom-divider.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.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/others/app_scafold_detail_page.dart'; -import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart'; -import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:provider/provider.dart'; -import 'package:rating_bar/rating_bar.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/recommendedProduct_model.dart'; -import '../cart-order-page.dart'; -import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; -import 'shared/product_details_app_bar.dart'; import 'availability_info.dart'; import 'details_info.dart'; import 'discount_description.dart'; import 'footor/footer-widget.dart'; +import 'shared/product_details_app_bar.dart'; + + -int price = 0; -bool isOverQuantity = false; -bool isInWishList = false; -bool isSelected = true; String itemID; -var customerId; -CompareList compareItems = new CompareList(); PharmacyProduct specificationData; class ProductDetailPage extends StatefulWidget { @@ -49,23 +34,27 @@ class ProductDetailPage extends StatefulWidget { __ProductDetailPageState createState() => __ProductDetailPageState(); } -class __ProductDetailPageState extends State - with SingleTickerProviderStateMixin { - TabController _tabController; +class __ProductDetailPageState extends State{ AppSharedPreferences sharedPref = AppSharedPreferences(); bool isTrue = true; bool isDetails = true; bool isReviews = false; bool isAvailability = false; + String customerId; + bool isSelected = true; + bool isOverQuantity = false; + bool isInWishList = false; + int quantity = 0; + checkWishlist() async { GifLoaderDialogUtils.showMyDialog(context); - ProductDetailViewModel x = new ProductDetailViewModel(); - await x.checkWishlistData(); + ProductDetailViewModel model = new ProductDetailViewModel(); + await model.checkWishlistData(); - for (int i = 0; i < x.wishListItems.length; i++) { - if (itemID == x.wishListItems[i].product.id) { + for (int i = 0; i < model.wishListItems.length; i++) { + if (itemID == model.wishListItems[i].product.id) { isInWishList = true; break; } else { @@ -77,9 +66,8 @@ class __ProductDetailPageState extends State } void initState() { - price = 1; + quantity = 1; specificationData = widget.product; - _tabController = TabController(length: 3, vsync: this); userInfo(); super.initState(); @@ -87,7 +75,6 @@ class __ProductDetailPageState extends State @override void dispose() { - _tabController.dispose(); super.dispose(); } @@ -111,6 +98,11 @@ class __ProductDetailPageState extends State isShowDecPage: false, customAppBar: ProductAppBar( product: widget.product, + model: model, + addToWishlistFunction: (item) { + addToWishlistFunction(itemID:item,model:model); + setState(() {}); + }, ), body: SingleChildScrollView( child: Column( @@ -143,15 +135,15 @@ class __ProductDetailPageState extends State widget.product, customerId: customerId, addToWishlistFunction: (item) { - addToWishlistFunction(item); + addToWishlistFunction(itemID:item,model:model); setState(() {}); }, deleteFromWishlistFunction: (item) { - deleteFromWishlistFunction(item); + deleteFromWishlistFunction(itemID: item, model: model); setState(() {}); }, notifyMeWhenAvailable: (context, itemId) { - notifyMeWhenAvailable(context, itemId); + notifyMeWhenAvailable(itemId:itemId, customerId: customerId, model: model); }, isInWishList: isInWishList, ), @@ -319,85 +311,33 @@ class __ProductDetailPageState extends State widget.product.orderMinimumQuantity, widget.product.stockQuantity, widget.product, - price: price, + quantity: quantity, isOverQuantity: isOverQuantity, addToCartFunction: addToCartFunction, ), )); } -} - -class CustomDivider extends StatelessWidget { - const CustomDivider({ - Key key, - this.color, - }) : super(key: key); - final Color color; + addToWishlistFunction({itemID, ProductDetailViewModel model}) async { + isInWishList = true; + await model.addToWishlistData(itemID); + } - @override - Widget build(BuildContext context) { - return Container( - width: 120, - height: 2, - color: color, - ); + deleteFromWishlistFunction({itemID, ProductDetailViewModel model}) async { + isInWishList = false; + await model.deletWishlistData(itemID); } } -convertCityName(txt) { - String stringTxt; - String newTxt; - stringTxt = txt.toString(); - newTxt = stringTxt.split('.')[1]; - - return newTxt; -} -addToCartFunction(quantity, itemID, BuildContext context) async { +addToCartFunction({quantity, itemID, BuildContext context,ProductDetailViewModel model}) async { GifLoaderDialogUtils.showMyDialog(context); - ProductDetailViewModel x = new ProductDetailViewModel(); - await x.addToCartData(quantity, itemID); + await model.addToCartData(quantity, itemID); GifLoaderDialogUtils.hideDialog(context); } -notifyMeWhenAvailable(context, itemId) async { - ProductDetailViewModel x = new ProductDetailViewModel(); - await x.notifyMe(customerId, itemId); +notifyMeWhenAvailable({itemId, customerId,ProductDetailViewModel model }) async { + await model.notifyMe(customerId, itemId); } -addToWishlistFunction(itemID) async { - ProductDetailViewModel x = new ProductDetailViewModel(); - isInWishList = true; - await x.addToWishlistData(itemID); -} - -deleteFromWishlistFunction(itemID) async { - ProductDetailViewModel x = new ProductDetailViewModel(); - isInWishList = false; - await x.deletWishlistData(itemID); -} -//TODO Elham* move to file -Widget tabWidget( - Size screenSize, - bool isActive, - String title, -) { - return Center( - child: Container( - height: screenSize.height * 0.070, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - AppText( - title, - fontSize: SizeConfig.textMultiplier * 1.5, - // color: Color(0xFF2B353E), - fontWeight: FontWeight.w700, - ), - ], - ), - ), - ); -} diff --git a/lib/pages/pharmacies/screens/product-details/recommended_products.dart b/lib/pages/pharmacies/screens/product-details/recommended_products.dart index f40f1f08..7222ad85 100644 --- a/lib/pages/pharmacies/screens/product-details/recommended_products.dart +++ b/lib/pages/pharmacies/screens/product-details/recommended_products.dart @@ -1,6 +1,7 @@ import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/recommendedProduct_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/product_detail_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/screens/product-details/product-detail.dart'; @@ -14,8 +15,23 @@ import 'package:rating_bar/rating_bar.dart'; class RecommendedProducts extends StatefulWidget { final PharmacyProduct product; + final String customerId; + final ProductDetailViewModel productDetailViewModel; + final bool isOverQuantity; + final bool isInWishList; + final Function addToWishlistFunction; + final Function deleteFromWishlistFunction; - const RecommendedProducts({Key key, this.product}) : super(key: key); + RecommendedProducts( + {Key key, + this.product, + this.productDetailViewModel, + this.customerId, + this.isOverQuantity = false, + this.isInWishList = false, + this.addToWishlistFunction, + this.deleteFromWishlistFunction}) + : super(key: key); @override _RecommendedProductsState createState() => _RecommendedProductsState(); @@ -39,273 +55,235 @@ class _RecommendedProductsState extends State { padding: EdgeInsets.only(bottom: 5), // margin: EdgeInsets.symmetric(horizontal: 6, vertical: 4), child: BaseView( - onModelReady: (model) => model - .getRecommendedProducts(widget.product.id), + onModelReady: (model) => + model.getRecommendedProducts(widget.product.id), builder: (_, model, wi) => Container( - child: - model.recommendedProductList.length != null + child: model.recommendedProductList.length != null ? ListView.builder( - scrollDirection: - Axis.horizontal, + scrollDirection: Axis.horizontal, shrinkWrap: true, physics: ScrollPhysics(), // physics: NeverScrollableScrollPhysics(), - itemCount: model - .recommendedProductList - .length, + itemCount: model.recommendedProductList.length, itemBuilder: (context, index) { return InkWell( onTap: () async { - GifLoaderDialogUtils - .showMyDialog( - context); - RecommendedProductModel - data = - model.recommendedProductList[ - index]; + GifLoaderDialogUtils.showMyDialog(context); + RecommendedProductModel data = + model.recommendedProductList[index]; var json = data.toJson(); PharmacyProduct product = - new PharmacyProduct - .fromJson(json); - await Navigator - .pushReplacement( + new PharmacyProduct.fromJson(json); + await Navigator.pushReplacement( context, FadePage( - page: - ProductDetailPage( - product), + page: ProductDetailPage(product), ), ); - GifLoaderDialogUtils - .hideDialog(context); + GifLoaderDialogUtils.hideDialog(context); }, child: Card( elevation: 2, - shape: - RoundedRectangleBorder( + shape: RoundedRectangleBorder( side: BorderSide( - color: Colors - .grey[300], - width: 2), - borderRadius: - BorderRadius - .circular(10), + color: Colors.grey[300], width: 2), + borderRadius: BorderRadius.circular(10), ), - margin: - EdgeInsets.symmetric( + margin: EdgeInsets.symmetric( horizontal: 8, vertical: 0, ), child: Container( - decoration: - BoxDecoration( - borderRadius: - BorderRadius.all( + decoration: BoxDecoration( + borderRadius: BorderRadius.all( Radius.circular(15), ), ), - padding: EdgeInsets - .symmetric( - horizontal: 4), - width: MediaQuery.of( - context) - .size - .width / - 3, + padding: EdgeInsets.symmetric(horizontal: 4), + width: MediaQuery.of(context).size.width / 3, child: Column( crossAxisAlignment: - CrossAxisAlignment - .start, + CrossAxisAlignment.start, children: [ Stack(children: [ Container( child: Align( - alignment: - Alignment - .topRight, - child: - IconButton( - icon: Icon(model.recommendedProductList[index].isinwishlist != - true - ? Icons - .favorite_border - : Icons - .favorite), - color: model.recommendedProductList[index].isinwishlist != - true - ? Colors - .grey - : Colors - .red, - onPressed: - () async { - if (customerId != - null) { - if (!isInWishList && - model.recommendedProductList[index].isinwishlist != + alignment: Alignment.topRight, + child: IconButton( + icon: Icon(model + .recommendedProductList[ + index] + .isinwishlist != + true + ? Icons.favorite_border + : Icons.favorite), + color: model + .recommendedProductList[ + index] + .isinwishlist != + true + ? Colors.grey + : Colors.red, + onPressed: () async { + if (widget.customerId != null) { + if (!widget.isInWishList && + model + .recommendedProductList[ + index] + .isinwishlist != true) { - GifLoaderDialogUtils.showMyDialog( - context); - await addToWishlistFunction(model - .recommendedProductList[index] - .id); + GifLoaderDialogUtils + .showMyDialog(context); + await widget.addToWishlistFunction( + itemID: model + .recommendedProductList[ + index] + .id, + model: widget + .productDetailViewModel); // checkWishlist(); - GifLoaderDialogUtils.hideDialog( - context); - setState( - () { - model.recommendedProductList[index].isinwishlist = - true; - }); + GifLoaderDialogUtils + .hideDialog(context); + setState(() { + model + .recommendedProductList[ + index] + .isinwishlist = true; + }); } else { - GifLoaderDialogUtils.showMyDialog( - context); - await deleteFromWishlistFunction(model - .recommendedProductList[index] - .id); - GifLoaderDialogUtils.hideDialog( - context); - setState( - () { - model.recommendedProductList[index].isinwishlist = - false; - }); + GifLoaderDialogUtils + .showMyDialog(context); + await widget.deleteFromWishlistFunction( + itemID: model + .recommendedProductList[ + index] + .id, + model: widget + .productDetailViewModel); + GifLoaderDialogUtils + .hideDialog(context); + setState(() { + model + .recommendedProductList[ + index] + .isinwishlist = false; + }); } } else { return; } - setState( - () { - // checkWishlist(); - }); + setState(() { + // checkWishlist(); + }); }, ), ), ), Container( - margin: EdgeInsets - .fromLTRB( - 0, - 16, - 10, - 16), - alignment: - Alignment - .center, - child: (model.recommendedProductList[index].images != - null && - model.recommendedProductList[index].images.length > - 0) - ? Image - .network( - model - .recommendedProductList[index] - .images[0] - .src - .toString(), - fit: BoxFit - .cover, - height: - 60, - ) - : Image - .asset( - "assets/images/no_image.png", - fit: BoxFit - .cover, - height: - 60, - ), + margin: EdgeInsets.fromLTRB( + 0, 16, 10, 16), + alignment: Alignment.center, + child: (model + .recommendedProductList[ + index] + .images != + null && + model + .recommendedProductList[ + index] + .images + .length > + 0) + ? Image.network( + model + .recommendedProductList[ + index] + .images[0] + .src + .toString(), + fit: BoxFit.cover, + height: 60, + ) + : Image.asset( + "assets/images/no_image.png", + fit: BoxFit.cover, + height: 60, + ), ), Container( width: model - .recommendedProductList[ - index] - .rxMessage != - null + .recommendedProductList[ + index] + .rxMessage != + null ? MediaQuery.of(context) - .size - .width / - 5 + .size + .width / + 5 : 0, - padding: - EdgeInsets - .all(4), - decoration: - BoxDecoration( - color: Color( - 0xffb23838), - borderRadius: - BorderRadius - .only( - topLeft: Radius - .circular( - 6), + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: Color(0xffb23838), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(6), ), ), - child: model.recommendedProductList[index] - .rxMessage != - null + child: model + .recommendedProductList[ + index] + .rxMessage != + null ? Texts( - projectViewModel.isArabic - ? model.recommendedProductList[index].rxMessagen - : model.recommendedProductList[index].rxMessage, - color: Colors - .white, - regular: - true, - fontSize: - 10, - fontWeight: - FontWeight.w400, - ) + projectViewModel.isArabic + ? model + .recommendedProductList[ + index] + .rxMessagen + : model + .recommendedProductList[ + index] + .rxMessage, + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: FontWeight.w400, + ) : Texts(""), ), ]), Container( - margin: EdgeInsets - .symmetric( + margin: EdgeInsets.symmetric( horizontal: 6, vertical: 0, ), child: Column( crossAxisAlignment: - CrossAxisAlignment - .start, + CrossAxisAlignment.start, children: [ Text( - projectViewModel - .isArabic + projectViewModel.isArabic ? model - .recommendedProductList[ - index] - .namen + .recommendedProductList[ + index] + .namen : model - .recommendedProductList[index] - .name, - style: - TextStyle( - color: Colors - .black, - fontSize: - 13.0, + .recommendedProductList[ + index] + .name, + style: TextStyle( + color: Colors.black, + fontSize: 13.0, // fontWeight: FontWeight.bold, ), ), Padding( // padding: const EdgeInsets.only(top: 15, bottom: 10), - padding: const EdgeInsets - .only( - top: 10, - bottom: - 5), - child: - Texts( + padding: const EdgeInsets.only( + top: 10, bottom: 5), + child: Texts( "SAR ${model.recommendedProductList[index].price}", - bold: - true, - fontSize: - 14, + bold: true, + fontSize: 14, ), ), ], @@ -313,47 +291,35 @@ class _RecommendedProductsState extends State { ), Row( crossAxisAlignment: - CrossAxisAlignment - .start, - children: < - Widget>[ + CrossAxisAlignment.start, + children: [ Container( - padding: EdgeInsets.only( - right: - 10), - child: - Align( - alignment: - Alignment - .topLeft, - child: RatingBar - .readOnly( + padding: + EdgeInsets.only(right: 10), + child: Align( + alignment: Alignment.topLeft, + child: RatingBar.readOnly( initialRating: model - .recommendedProductList[index] + .recommendedProductList[ + index] .approvedRatingSum .toDouble(), - size: - 13.0, + size: 13.0, filledColor: - Colors.yellow[700], - emptyColor: - Colors.grey[500], - isHalfAllowed: - true, + Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, halfFilledIcon: - Icons.star_half, - filledIcon: - Icons.star, - emptyIcon: - Icons.star, + Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, ), ), ), Texts( "(${model.recommendedProductList[index].notApprovedTotalReviews.toString()})", // bold: true, - fontSize: - 12, + fontSize: 12, ), ]), ], @@ -363,20 +329,18 @@ class _RecommendedProductsState extends State { ); }) : Container( - // color: Colors.white, - child: Row( - mainAxisAlignment: - MainAxisAlignment.center, - // crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Texts( - TranslationBase.of(context) - .nonRecommended, - color: Colors.black, + // color: Colors.white, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + // crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Texts( + TranslationBase.of(context).nonRecommended, + color: Colors.black, + ), + ], + ), ), - ], - ), - ), ), ), ), diff --git a/lib/pages/pharmacies/screens/product-details/shared/custom-divider.dart b/lib/pages/pharmacies/screens/product-details/shared/custom-divider.dart new file mode 100644 index 00000000..268e79d0 --- /dev/null +++ b/lib/pages/pharmacies/screens/product-details/shared/custom-divider.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +class CustomDivider extends StatelessWidget { + const CustomDivider({ + Key key, + this.color, + }) : super(key: key); + + final Color color; + + @override + Widget build(BuildContext context) { + return Container( + width: 120, + height: 2, + color: color, + ); + } +} \ No newline at end of file diff --git a/lib/pages/pharmacies/screens/product-details/shared/product_details_app_bar.dart b/lib/pages/pharmacies/screens/product-details/shared/product_details_app_bar.dart index 0fd1f03d..95689326 100644 --- a/lib/pages/pharmacies/screens/product-details/shared/product_details_app_bar.dart +++ b/lib/pages/pharmacies/screens/product-details/shared/product_details_app_bar.dart @@ -1,5 +1,6 @@ import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart'; import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/product_detail_view_model.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/screens/product-details/product-detail.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; @@ -13,19 +14,22 @@ import '../../cart-order-page.dart'; import 'icon_with_bg.dart'; class ProductAppBar extends StatelessWidget with PreferredSizeWidget { - final PharmacyProduct product; - ProductAppBar({Key key, this.product}) : super(key: key); + final ProductDetailViewModel model; + final Function addToWishlistFunction; + final int quantity; + + ProductAppBar({Key key, this.product, this.model, this.addToWishlistFunction, this.quantity}) + : super(key: key); AuthenticatedUserObject authenticatedUserObject = - locator(); + locator(); @override Widget build(BuildContext context) { return Container( color: Colors.white, - child: FractionallySizedBox( widthFactor: 0.95, child: Column( @@ -47,29 +51,31 @@ class ProductAppBar extends StatelessWidget with PreferredSizeWidget { ), ], ), - if(authenticatedUserObject.isLogin) - Row( - children: [ - IconWithBg( - icon: Icons.shopping_cart, + if (authenticatedUserObject.isLogin) + Row( + children: [ + IconWithBg( + icon: Icons.shopping_cart, + color: Colors.grey, + onPress: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => CartOrderPage()), + ); + }), + SizedBox( + width: 10, + ), + IconWithBg( + icon: FontAwesomeIcons.ellipsisV, color: Colors.grey, onPress: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => CartOrderPage()), - ); - }), - SizedBox(width: 10,), - IconWithBg( - icon: FontAwesomeIcons.ellipsisV, - color: Colors.grey, - onPress: () { - settingModalBottomSheet(context); - }, - ), - ], - ) + settingModalBottomSheet(context); + }, + ), + ], + ) ], ), ], @@ -78,10 +84,7 @@ class ProductAppBar extends StatelessWidget with PreferredSizeWidget { ); } - - @override - // TODO: implement preferredSize @override Size get preferredSize => Size(double.maxFinite, 50); @@ -92,27 +95,34 @@ class ProductAppBar extends StatelessWidget with PreferredSizeWidget { return Container( child: new Wrap( children: [ - if( product.stockAvailability != 'Out of stock') - new ListTile( - leading: Icon(Icons.shopping_cart), - title: Text( - TranslationBase.of(context).addToCart, - ), - onTap: () => { - if (price > 0) - {addToCartFunction(price, itemID, context)} - else - { - AppToast.showErrorToast( - message: "you should add quantity") - } - }), + if (product.stockAvailability != 'Out of stock') + new ListTile( + leading: Icon(Icons.shopping_cart), + title: Text( + TranslationBase.of(context).addToCart, + ), + onTap: () => { + if (quantity > 0) + { + addToCartFunction( + quantity: quantity, + itemID: itemID, + context: context, + model: model) + } + else + { + AppToast.showErrorToast( + message: "you should add quantity") + } + }), ListTile( leading: Icon(Icons.favorite_border), title: Text( TranslationBase.of(context).addToWishlist, ), - onTap: () => {addToWishlistFunction(itemID)}, + onTap: () => + {addToWishlistFunction(itemID: itemID, model: model)}, ), ListTile( leading: Icon(Icons.compare), @@ -130,5 +140,3 @@ class ProductAppBar extends StatelessWidget with PreferredSizeWidget { }); } } - - diff --git a/lib/widgets/others/app_scafold_detail_page.dart b/lib/widgets/others/app_scafold_detail_page.dart deleted file mode 100644 index 595e0872..00000000 --- a/lib/widgets/others/app_scafold_detail_page.dart +++ /dev/null @@ -1,281 +0,0 @@ -import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/config/size_config.dart'; -import 'package:diplomaticquarterapp/config/size_config.dart'; -import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; -import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; -import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; -import 'package:diplomaticquarterapp/pages/insurance/insurance_update_screen.dart'; -import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/compare-list.dart'; -import 'package:diplomaticquarterapp/routes.dart'; -import 'package:diplomaticquarterapp/uitl/app_toast.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/others/bottom_bar.dart'; -import 'package:diplomaticquarterapp/widgets/progress_indicator/app_loader_widget.dart'; -import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:provider/provider.dart'; - -import '../../locator.dart'; -import 'floating_button_search.dart'; -import '../progress_indicator/app_loader_widget.dart'; -import 'arrow_back.dart'; -import 'network_base_view.dart'; -import 'not_auh_page.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/screens/product-details/product-detail.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/screens/cart-order-page.dart'; - -class DetailPageScafold extends StatefulWidget { - final String appBarTitle; - final Widget body; - final Widget bottomSheet; - final bool isLoading; - final bool isShowAppBar; - final bool hasAppBarParam; - final BaseViewModel baseViewModel; - final bool isBottomBar; - final Widget floatingActionButton; - final bool isPharmacy; - final String title; - final String description; - final String image; - final bool isShowDecPage; - final List infoList; - final Color backgroundColor; - final double preferredSize; - final List appBarIcons; - final PreferredSizeWidget appBarWidget; - - DetailPageScafold( - {@required this.body, - this.appBarTitle = '', - this.isLoading = false, - this.isShowAppBar = false, - this.hasAppBarParam, - this.bottomSheet, - this.baseViewModel, - this.floatingActionButton, - this.isPharmacy = false, - this.title, - this.description, - this.isShowDecPage = true, - this.isBottomBar, - this.backgroundColor, - this.preferredSize = 0.0, - this.appBarIcons, - this.appBarWidget, - this.image, - this.infoList}); - - @override - _DetailPageScafoldState createState() => _DetailPageScafoldState(); -} - -class _DetailPageScafoldState extends State { - AuthenticatedUserObject authenticatedUserObject = - locator(); - - @override - Widget build(BuildContext context) { - AppGlobal.context = context; - PreferredSizeWidget appBar; - - if (this.widget.appBarWidget == null) { - PreferredSizeWidget appBarWidget = AppBarWidget( - widget.appBarTitle, - widget.appBarIcons, - widget.isShowAppBar, - isPharmacy: widget.isPharmacy, - isShowDecPage: widget.isShowDecPage, - image: widget.image, - ); - appBar = widget.preferredSize == 0 - ? appBarWidget - : PreferredSize( - child: appBarWidget, - preferredSize: Size.fromHeight(widget.preferredSize)); - } else { - appBar = this.widget.appBarWidget; - } - - return Scaffold( - backgroundColor: - widget.backgroundColor ?? Theme.of(context).scaffoldBackgroundColor, - appBar: appBar, - body: (!Provider.of(context, listen: false).isLogin && - widget.isShowDecPage) - ? NotAutPage( - title: widget.appBarTitle, - description: widget.description, - infoList: widget.infoList, - ) - : widget.baseViewModel != null - ? NetworkBaseView( - child: buildBodyWidget(), - baseViewModel: widget.baseViewModel, - ) - : buildBodyWidget(), - bottomSheet: widget.bottomSheet, - //floatingActionButton: floatingActionButton ?? floatingActionButton, - // bottomNavigationBar: - // this.isBottomBar == true ? BottomBarSearch() : SizedBox() - // floatingActionButton: FloatingSearchButton(), - ); - } - - buildAppLoaderWidget(bool isLoading) { - return isLoading ? AppLoaderWidget() : Container(); - } - - buildBodyWidget() { - // return body; //Stack(children: [body, buildAppLoaderWidget(isLoading)]); - return Stack(children: [ - widget.body, /*FloatingSearchButton()*/ - ]); - } -} - -class AppBarWidget extends StatelessWidget with PreferredSizeWidget { - final AuthenticatedUserObject authenticatedUserObject = - locator(); - - final String appBarTitle; - final List appBarIcons; - final bool isShowAppBar; - final bool isPharmacy; - final bool isShowDecPage; - final String image; - - AppBarWidget(this.appBarTitle, this.appBarIcons, this.isShowAppBar, - {this.isPharmacy = true, this.isShowDecPage = true, this.image}); - - @override - Widget build(BuildContext context) { - return buildAppBar(context); - } - - Widget buildAppBar(BuildContext context) { - return isShowAppBar - ? AppBar( - elevation: 0, - backgroundColor: Colors.white, -// isPharmacy ? Colors.green : Theme.of(context).appBarTheme.color, - textTheme: TextTheme( - headline6: - TextStyle(color: Colors.white, fontWeight: FontWeight.bold), - ), - title: Texts( - authenticatedUserObject.isLogin || !isShowDecPage - ? appBarTitle.toUpperCase() - : TranslationBase.of(context).serviceInformationTitle, - color: Colors.white, - bold: true, - ), - leading: Builder( - builder: (BuildContext context) { - return GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () => Navigator.pop(context), - child: Icon(Icons.arrow_back_ios, color: Colors.grey), - ); - }, - ), - centerTitle: true, - actions: [ - /// TODO Elham* fix this - if(isPharmacy) - IconButton( - icon: Icon(Icons.shopping_cart), - color: Colors.grey, - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => CartOrderPage()), - ); - }), - image != null - ? InkWell( - onTap: () => Navigator.push( - context, - FadePage( - page: InsuranceUpdate(), - ), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Image.asset( - image, - height: SizeConfig.heightMultiplier * 5, - width: SizeConfig.heightMultiplier * 5, - color: Colors.grey, - ), - ), - ) - : IconButton( - icon: Icon(FontAwesomeIcons.ellipsisV), - color: Colors.grey, - onPressed: () { - settingModalBottomSheet(context); - }, - ), - if (appBarIcons != null) ...appBarIcons - ], - ) - : Container( - height: 0, - width: 0, - ); - } - - @override - Size get preferredSize => Size(double.maxFinite, 60); - - - settingModalBottomSheet(context) { - showModalBottomSheet( - context: context, - builder: (BuildContext bc) { - return Container( - child: new Wrap( - children: [ - new ListTile( - leading: Icon(Icons.shopping_cart), - title: Text( - TranslationBase.of(context).addToCart, - ), - onTap: () => { - if (price > 0) - {addToCartFunction(price, itemID, context)} - else - { - AppToast.showErrorToast( - message: "you should add quantity") - } - }), - ListTile( - leading: Icon(Icons.favorite_border), - title: Text( - TranslationBase.of(context).addToWishlist, - ), - onTap: () => {addToWishlistFunction(itemID)}, - ), - ListTile( - leading: Icon(Icons.compare), - title: Text( - TranslationBase.of(context).compare, - ), - onTap: () => { - Provider.of(context, listen: false) - .addItem(specificationData), - }, - ), - ], - ), - ); - }); - } -}