From 12c337a6c189282252e344a4e99b2a06fad96a78 Mon Sep 17 00:00:00 2001 From: ahmadrns <106388520+ahmadrns@users.noreply.github.com> Date: Thu, 22 Sep 2022 12:00:55 +0500 Subject: [PATCH 1/2] added buy button in expanded view in purchase screen --- .../purchase_item/purchase_item_screen.dart | 77 +++++++++++++++++-- 1 file changed, 70 insertions(+), 7 deletions(-) diff --git a/wallet/lib/pages/purchase_item/purchase_item_screen.dart b/wallet/lib/pages/purchase_item/purchase_item_screen.dart index 8cafcb9ba5..6027c870ec 100644 --- a/wallet/lib/pages/purchase_item/purchase_item_screen.dart +++ b/wallet/lib/pages/purchase_item/purchase_item_screen.dart @@ -64,16 +64,15 @@ class _PurchaseItemScreenState extends State { widget.purchaseItemViewModel.destroyPlayers(widget.nft); return true; }, - child: const PurchaseItemContent( - )), + child: const PurchaseItemContent()), ); } } class PurchaseItemContent extends StatefulWidget { - - - const PurchaseItemContent({Key? key,}) : super(key: key); + const PurchaseItemContent({ + Key? key, + }) : super(key: key); @override _PurchaseItemContentState createState() => _PurchaseItemContentState(); @@ -285,7 +284,6 @@ class _OwnerBottomDrawerState extends State { onTap: () async { final Size size = MediaQuery.of(context).size; context.read().shareNFTLink(size: size); - }, child: Container( padding: EdgeInsets.only(bottom: 12.h), @@ -657,7 +655,6 @@ class _OwnerBottomDrawerState extends State { onTap: () async { final Size size = MediaQuery.of(context).size; context.read().shareNFTLink(size: size); - }, child: SvgPicture.asset( SVGUtil.OWNER_SHARE, @@ -670,6 +667,72 @@ class _OwnerBottomDrawerState extends State { ], ), ), + if (viewModel.nft.amountMinted < viewModel.nft.quantity) + ClipPath( + clipper: BuyClipper(), + child: InkWell( + onTap: () async { + bool balancesFetchResult = true; + if (viewModel.nft.price != kZeroInt) { + final balancesEither = await viewModel.getBalanceOfSelectedCurrency( + selectedDenom: viewModel.nft.denom, + requiredAmount: double.parse(viewModel.nft.price) / kBigIntBase, + ); + + if (balancesEither.isLeft()) { + balancesEither.swap().getOrElse(() => '').show(); + return; + } + + balancesFetchResult = balancesEither.getOrElse(() => false); + } + + final PayNowDialog payNowDialog = PayNowDialog( + buildContext: context, + nft: viewModel.nft, + purchaseItemViewModel: viewModel, + onPurchaseDone: (txId) { + showTransactionCompleteDialog(txId); + }, + shouldBuy: balancesFetchResult); + payNowDialog.show(); + }, + child: Container( + width: 200.w, + height: 60.h, + color: kDarkRed.withOpacity(0.8), + child: Row( + children: [ + Container( + padding: EdgeInsets.only(left: 20.w), + alignment: Alignment.center, + child: Container( + height: 10.w, + width: 10.w, + decoration: const BoxDecoration(shape: BoxShape.circle, color: kButtonBuyNowColor), + ), + ), + const Spacer(), + Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "${"buy_for".tr()} ${viewModel.nft.ibcCoins.getCoinWithProperDenomination(viewModel.nft.price)}", + style: TextStyle(color: Colors.white, fontSize: 16.sp), + ), + SizedBox( + width: 8.w, + ), + viewModel.nft.ibcCoins.getAssets(), + ], + ), + const Spacer(), + ], + ), + ), + ), + ) ], ), ), From 669014881dbf809bec7bd19086ebbfe6d5dd5a49 Mon Sep 17 00:00:00 2001 From: ahmadrns <106388520+ahmadrns@users.noreply.github.com> Date: Tue, 27 Sep 2022 15:41:58 +0500 Subject: [PATCH 2/2] Added test case for is buy button exists in expanded view on purchase screen --- .../purchase_item/purchase_item_screen.dart | 2 + wallet/lib/utils/constants.dart | 2 + wallet/test/mocks/mock_constants.dart | 3 + .../buttons/nft_buy_button_test.dart | 62 +++++++++++++++++++ 4 files changed, 69 insertions(+) create mode 100644 wallet/test/widget_testing/components/buttons/nft_buy_button_test.dart diff --git a/wallet/lib/pages/purchase_item/purchase_item_screen.dart b/wallet/lib/pages/purchase_item/purchase_item_screen.dart index 8d1ac22be9..4dd161323d 100644 --- a/wallet/lib/pages/purchase_item/purchase_item_screen.dart +++ b/wallet/lib/pages/purchase_item/purchase_item_screen.dart @@ -250,6 +250,7 @@ class _OwnerBottomDrawerState extends State { children: [ Expanded(child: _title(nft: viewModel.nft, owner: viewModel.nft.type == NftType.TYPE_RECIPE ? viewModel.nft.creator : viewModel.nft.owner)), IconButton( + key: const Key(kKeyboardUpButtonKeyValue), icon: Icon( Icons.keyboard_arrow_up, size: 32.h, @@ -669,6 +670,7 @@ class _OwnerBottomDrawerState extends State { ), if (viewModel.nft.amountMinted < viewModel.nft.quantity) ClipPath( + key: const Key(kExpandedBuyButtonKeyValue), clipper: BuyClipper(), child: InkWell( onTap: () async { diff --git a/wallet/lib/utils/constants.dart b/wallet/lib/utils/constants.dart index 00a0f3de34..fdba1d8a2c 100644 --- a/wallet/lib/utils/constants.dart +++ b/wallet/lib/utils/constants.dart @@ -390,3 +390,5 @@ const kMaxDescription = 256; const kOwnerViewKeyValue = "owner_view_key"; const kOwnerViewDrawerKeyValue = "ownerview_header"; const kOwnerViewBottomSheetKeyValue = "bottom_sheet"; +const kKeyboardUpButtonKeyValue = "keyboard_up_button"; +const kExpandedBuyButtonKeyValue = "expanded_buy_button"; diff --git a/wallet/test/mocks/mock_constants.dart b/wallet/test/mocks/mock_constants.dart index 6e8d806ee0..aa11ffb142 100644 --- a/wallet/test/mocks/mock_constants.dart +++ b/wallet/test/mocks/mock_constants.dart @@ -267,3 +267,6 @@ NftOwnershipHistory MOCK_NFT_OWNERSHIP_HISTORY = NftOwnershipHistory( receiver: "xyz", senderName: "abcxyz", ); + +int MOCK_NFT_QUANTITY = 50; +int MOCK_NFT_MINTED = 10; diff --git a/wallet/test/widget_testing/components/buttons/nft_buy_button_test.dart b/wallet/test/widget_testing/components/buttons/nft_buy_button_test.dart new file mode 100644 index 0000000000..43740c0633 --- /dev/null +++ b/wallet/test/widget_testing/components/buttons/nft_buy_button_test.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:provider/provider.dart'; +import 'package:pylons_wallet/pages/purchase_item/purchase_item_screen.dart'; +import 'package:pylons_wallet/pages/purchase_item/purchase_item_view_model.dart'; +import 'package:pylons_wallet/services/repository/repository.dart'; +import 'package:pylons_wallet/services/third_party_services/audio_player_helper.dart'; +import 'package:pylons_wallet/services/third_party_services/share_helper.dart'; +import 'package:pylons_wallet/services/third_party_services/video_player_helper.dart'; +import 'package:pylons_wallet/stores/wallet_store.dart'; +import 'package:pylons_wallet/utils/constants.dart'; + +import '../../../mocks/mock_audio_player.dart'; +import '../../../mocks/mock_constants.dart'; +import '../../../mocks/mock_repository.dart'; +import '../../../mocks/mock_share_helper.dart'; +import '../../../mocks/mock_video_player.dart'; +import '../../../mocks/mock_wallet_store.dart'; +import '../../extension/size_extension.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + late Repository repositry; + late WalletsStore walletStore; + late AudioPlayerHelper audioPlayerHelper; + late VideoPlayerHelper videoPlayerHelper; + late ShareHelper shareHelper; + + audioPlayerHelper = MockAudioPlayerImpl(); + videoPlayerHelper = MockVideoPlayerimpl(); + repositry = MockRepository(); + walletStore = MockWalletStore(); + shareHelper = MockShareHelperImpl(); + final PurchaseItemViewModel viewModel = PurchaseItemViewModel( + walletStore, + audioPlayerHelper: audioPlayerHelper, + videoPlayerHelper: videoPlayerHelper, + repository: repositry, + shareHelper: shareHelper, + ); + + testWidgets("check buy button is in expanded view or not", (tester) async { + await tester.testAppForWidgetTesting( + ChangeNotifierProvider.value( + value: viewModel, + child: PurchaseItemScreen( + purchaseItemViewModel: viewModel, + ), + ), + ); + viewModel.collapsed = true; + viewModel.nft.quantity = MOCK_NFT_QUANTITY; + viewModel.nft.amountMinted = MOCK_NFT_MINTED; + await tester.pump(); + final keyboardUpButtonFinder = find.byKey(const Key(kKeyboardUpButtonKeyValue)); + await tester.tap(keyboardUpButtonFinder); + await tester.pumpAndSettle(); + final expandedBuyButtonFinder = find.byKey(const Key(kExpandedBuyButtonKeyValue)); + expect(expandedBuyButtonFinder, findsOneWidget); + }); +}