diff --git a/.gradle/6.1/executionHistory/executionHistory.lock b/.gradle/6.1/executionHistory/executionHistory.lock deleted file mode 100644 index d10cb2ef929a9a07707ae5ef8ef3b31e4b396a64..0000000000000000000000000000000000000000 Binary files a/.gradle/6.1/executionHistory/executionHistory.lock and /dev/null differ diff --git a/.gradle/6.1/fileChanges/last-build.bin b/.gradle/6.1/fileChanges/last-build.bin deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 Binary files a/.gradle/6.1/fileChanges/last-build.bin and /dev/null differ diff --git a/.gradle/6.1/fileHashes/fileHashes.lock b/.gradle/6.1/fileHashes/fileHashes.lock deleted file mode 100644 index 9304040eeced1877738d0cda2b088394a30f2113..0000000000000000000000000000000000000000 Binary files a/.gradle/6.1/fileHashes/fileHashes.lock and /dev/null differ diff --git a/.gradle/6.1/gc.properties b/.gradle/6.1/gc.properties deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock deleted file mode 100644 index 14d7953d3fa0c5cdf272933d53fe6f18ca5846be..0000000000000000000000000000000000000000 Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and /dev/null differ diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties deleted file mode 100644 index 9512427f497547838a51014c0b039ea400d454a4..0000000000000000000000000000000000000000 --- a/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Thu May 07 12:19:30 ICT 2020 -gradle.version=6.1 diff --git a/.gradle/checksums/checksums.lock b/.gradle/checksums/checksums.lock deleted file mode 100644 index e1f12e4944159203f62b3ab768b3c8d9740f118b..0000000000000000000000000000000000000000 Binary files a/.gradle/checksums/checksums.lock and /dev/null differ diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/android/fastlane/metadata/android/id/changelogs/changelogs.txt b/android/fastlane/metadata/android/id/changelogs/changelogs.txt index f2c4a99caeb079d2d27b8a04a8dcbd421633cd3e..119c240548579f3c2c5a078ff8d473549933303d 100644 --- a/android/fastlane/metadata/android/id/changelogs/changelogs.txt +++ b/android/fastlane/metadata/android/id/changelogs/changelogs.txt @@ -1 +1 @@ -Add donation \ No newline at end of file +Update layout \ No newline at end of file diff --git a/lib/Component/router.dart b/lib/Component/router.dart index 2cf4160f0593c37550693d535393a71bcc397d4e..30b2e357d572a0281d0a28247706df39194f92ef 100644 --- a/lib/Component/router.dart +++ b/lib/Component/router.dart @@ -15,6 +15,7 @@ import 'package:home_industry/Pages/Product/subcategory_page.dart'; import 'package:home_industry/Pages/ProductPayment/bloc/bloc.dart'; import 'package:home_industry/Pages/ProductPayment/product_payment.dart'; import 'package:home_industry/Pages/ProductPayment/repositories/payment_repository.dart'; +import 'package:home_industry/Pages/Profile/bloc/profile_bloc.dart'; import 'package:home_industry/Pages/Profile/edit_profile.dart'; import 'package:home_industry/Pages/Program/detail_program.dart'; import 'package:home_industry/Pages/Program/program_page.dart'; @@ -93,7 +94,8 @@ class Router { SummaryRepository( RepositoryProvider.of<DependenciesRepositories>(context) .dio), - BlocProvider.of<CartBloc>(context)) + BlocProvider.of<CartBloc>(context), + BlocProvider.of<ProfileBloc>(context)) ..add(const FetchSummary()), child: const SummaryView())); diff --git a/lib/Pages/Cart/bloc/cart_bloc.dart b/lib/Pages/Cart/bloc/cart_bloc.dart index 7641f7e058da0f8922809c053de0d997b912075e..74416da82daedf180b531eb280165bb6057ac934 100644 --- a/lib/Pages/Cart/bloc/cart_bloc.dart +++ b/lib/Pages/Cart/bloc/cart_bloc.dart @@ -81,7 +81,7 @@ class CartBloc extends Bloc<CartEvent, CartState> { @override Future<void> close() { - authSubscription.cancel(); + authSubscription?.cancel(); return super.close(); } } diff --git a/lib/Pages/Cart/cart.dart b/lib/Pages/Cart/cart.dart index d7a4c038c6220955e5f66b72ee1650dfb7873f89..92c2256428c1e0fc43a7a77bd447f45415867aba 100644 --- a/lib/Pages/Cart/cart.dart +++ b/lib/Pages/Cart/cart.dart @@ -340,7 +340,8 @@ class _ModalCartItem extends StatelessWidget { Text( cartItem.product.preOrder ? 'Preorder' - : 'Stok: ${cartItem.product.stock}', + : 'Stok: ' + '${cartItem.product.stock}', style: const TextStyle(fontSize: 17), ) ], diff --git a/lib/Pages/Login/login.dart b/lib/Pages/Login/login.dart index 7ceaf19f389df94f71032e3bd49fc3a3b9190455..1a36aa46e1ee8f25b661401cfd4cfe1488ef6869 100644 --- a/lib/Pages/Login/login.dart +++ b/lib/Pages/Login/login.dart @@ -60,9 +60,7 @@ class Login extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: const <Widget>[ HomeIndustryLogo(), - Spacer( - flex: 1, - ), + Spacer(), Text( 'Selamat Datang', style: TextStyle( @@ -72,9 +70,7 @@ class Login extends StatelessWidget { flex: 2, ), TabBarLogin(), - Spacer( - flex: 1, - ), + Spacer(), RegistrasiButton() ], ), diff --git a/lib/Pages/Product/component/product_item_list.dart b/lib/Pages/Product/component/product_item_list.dart index f82b31f1f0483c7d1f0dd23b1ca677c50cfb2056..bf2d3a97ed24e0db3b0a49ec795297d04fdb08de 100644 --- a/lib/Pages/Product/component/product_item_list.dart +++ b/lib/Pages/Product/component/product_item_list.dart @@ -80,7 +80,6 @@ class _ProductDescription extends StatelessWidget { ), ), Expanded( - flex: 1, child: Padding( padding: const EdgeInsets.only(right: 10), child: Stack( diff --git a/lib/Pages/ProductPayment/product_payment.dart b/lib/Pages/ProductPayment/product_payment.dart index 3923e1aa7f3dca523a63dbe52cb7889aac4eb72d..da5831e89cc6716f16162831516775c4a1634163 100644 --- a/lib/Pages/ProductPayment/product_payment.dart +++ b/lib/Pages/ProductPayment/product_payment.dart @@ -211,14 +211,12 @@ class __PaymentBodyState extends State<_PaymentBody> { mainAxisAlignment: MainAxisAlignment.spaceAround, children: <Widget>[ Flexible( - flex: 1, child: Text( 'Nominal', style: Theme.of(context).textTheme.headline6, ), ), Flexible( - flex: 1, child: _SummaryBody( transaction: widget.transaction, ), diff --git a/lib/Pages/Profile/bloc/profile_bloc.dart b/lib/Pages/Profile/bloc/profile_bloc.dart index f27917bbbccb136eb46d1d0bd053c6b9f0c4847e..45cc3029239dca88f815cebe72650dfec5707d90 100644 --- a/lib/Pages/Profile/bloc/profile_bloc.dart +++ b/lib/Pages/Profile/bloc/profile_bloc.dart @@ -29,7 +29,7 @@ class ProfileBloc extends Bloc<ProfileEvent, ProfileState> { @override Future<void> close() { - authSubscription.cancel(); + authSubscription?.cancel(); return super.close(); } diff --git a/lib/Pages/Program/detail_program.dart b/lib/Pages/Program/detail_program.dart index c28e22eb865b7146151c75b6bd77cbdb28214fbb..11b15d6d706d2881429ed9072c231ac83439e823 100644 --- a/lib/Pages/Program/detail_program.dart +++ b/lib/Pages/Program/detail_program.dart @@ -44,9 +44,7 @@ class DetailProgram extends StatelessWidget { fontSize: 22, fontWeight: FontWeight.w800), ), ), - const Spacer( - flex: 1, - ), + const Spacer(), Expanded( flex: 15, child: Column( @@ -73,9 +71,7 @@ class DetailProgram extends StatelessWidget { ], ), ), - const Spacer( - flex: 1, - ), + const Spacer(), Expanded( flex: 35, child: Column( @@ -95,9 +91,7 @@ class DetailProgram extends StatelessWidget { maxLines: 8, style: const TextStyle(fontSize: 17), ), - const Spacer( - flex: 1, - ), + const Spacer(), SizedBox( width: double.infinity, height: 45, diff --git a/lib/Pages/Summary/bloc/summary_bloc.dart b/lib/Pages/Summary/bloc/summary_bloc.dart index bcb7a38306261bb8e94b424759976751acc039ee..ffb67eafbe0b4fb0a250e72fa57cb22f007ba653 100644 --- a/lib/Pages/Summary/bloc/summary_bloc.dart +++ b/lib/Pages/Summary/bloc/summary_bloc.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:home_industry/Exceptions/request_api_error.dart'; import 'package:home_industry/Pages/Cart/bloc/bloc.dart'; +import 'package:home_industry/Pages/Profile/bloc/bloc.dart'; import 'package:home_industry/Pages/Summary/repositories/summary_repository.dart'; import 'package:home_industry/Pages/Transactions/model/payment_method.dart'; @@ -11,7 +12,15 @@ import './bloc.dart'; class SummaryBloc extends Bloc<SummaryEvent, SummaryState> { final SummaryRepository _transactionRepository; final CartBloc _cartBloc; - SummaryBloc(this._transactionRepository, this._cartBloc); + final ProfileBloc _profileBloc; + StreamSubscription profileSubscription; + SummaryBloc(this._transactionRepository, this._cartBloc, this._profileBloc) { + profileSubscription = _profileBloc.listen((state) { + if (state is ProfileLoaded) { + add(const FetchSummary()); + } + }); + } @override SummaryState get initialState => const InitialSummaryState(); @@ -23,11 +32,19 @@ class SummaryBloc extends Bloc<SummaryEvent, SummaryState> { try { if (event is FetchSummary) { final response = await _transactionRepository.fetchSummary(); - yield SummaryLoaded( - donation: 0, - feeTransport: double.parse(response.shippingCost), - subTotal: double.parse(response.itemSubtotal), - method: null); + if (currentState is SummaryLoaded) { + yield SummaryLoaded( + donation: currentState.donation, + feeTransport: double.parse(response.shippingCost), + subTotal: double.parse(response.itemSubtotal), + method: currentState.method); + } else { + yield SummaryLoaded( + donation: 0, + feeTransport: double.parse(response.shippingCost), + subTotal: double.parse(response.itemSubtotal), + method: null); + } } else if (currentState is SummaryLoaded) { if (event is AddDonation) { yield SummaryLoaded( @@ -60,4 +77,10 @@ class SummaryBloc extends Bloc<SummaryEvent, SummaryState> { yield const SummaryError(); } } + + @override + Future<void> close() { + profileSubscription?.cancel(); + return super.close(); + } } diff --git a/lib/Pages/Summary/summary_page.dart b/lib/Pages/Summary/summary_page.dart index d8dcdf6a0a59cdbc5f9e7ccb1a0ad94384171c8a..8867370759a1a24fb7e1edd2fc809d61e0157547 100644 --- a/lib/Pages/Summary/summary_page.dart +++ b/lib/Pages/Summary/summary_page.dart @@ -45,8 +45,11 @@ class SummaryView extends StatelessWidget { return _Body(state: state); } else if (state is SummaryError) { return const Center( - child: Text('Mohon maaf sementara daerah anda belum' - ' tersedia untuk pengiriman'), + child: Text( + 'Mohon maaf sementara daerah anda belum' + ' tersedia untuk pengiriman', + textAlign: TextAlign.center, + ), ); } return const Center(child: CustomCircularIndicator()); @@ -82,7 +85,7 @@ class _Body extends StatelessWidget { @override Widget build(BuildContext context) { return ListView( - padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 2), + padding: const EdgeInsets.only(left: 10, right: 10, bottom: 60), children: <Widget>[ const _Alamat(), const Divider( @@ -119,7 +122,7 @@ class _BottomSheet extends StatelessWidget { borderRadius: const BorderRadius.only( topLeft: Radius.circular(10), topRight: Radius.circular(10))), width: double.infinity, - height: MediaQuery.of(context).size.height / 14, + height: 55, padding: const EdgeInsets.symmetric(horizontal: 10), child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, diff --git a/lib/Pages/Transactions/my_detail_order.dart b/lib/Pages/Transactions/my_detail_order.dart index f1af6be6ed657e66a858dd9eda4d566e8d828717..cfe2e8b36043dd7b6c48a3fc37f5541d879dc6a9 100644 --- a/lib/Pages/Transactions/my_detail_order.dart +++ b/lib/Pages/Transactions/my_detail_order.dart @@ -48,48 +48,9 @@ class MyDetailOrder extends StatelessWidget { children: <Widget>[ if (state.transaction.transactionStatus == StatusTransaction.beingShipped) - ButtonTheme( - minWidth: MediaQuery.of(context).size.width / 1.7, - child: BlueButton( - onPressed: () { - final detailOrderBloc = - BlocProvider.of<DetailOrderBloc>(context); - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - title: - const Text('Barang sudah diterima?'), - content: Text( - 'Apakah anda yakin sudah menerima' - ' barang dari pesanan ' - '${state.transaction.transactionNumber}?', - ), - actions: <Widget>[ - FlatButton( - onPressed: () { - Navigator.pop(context); - }, - child: const Text( - 'Tidak', - style: - TextStyle(color: Colors.red), - )), - FlatButton( - onPressed: () { - detailOrderBloc.add(CompleteOrder( - state.transaction.id)); - Navigator.pop(context); - }, - child: const Text('Ya'), - textColor: Colors.white, - color: Theme.of(context).primaryColor, - ) - ], - ); - }); - }, - label: 'Barang diterima'), + _ButtonComplete( + transactionId: state.transaction.id, + transactionNumber: state.transaction.transactionNumber, ), if (state.transaction.transactionStatus == StatusTransaction.waitProof || @@ -172,6 +133,61 @@ class MyDetailOrder extends StatelessWidget { } } +class _ButtonComplete extends StatelessWidget { + final String transactionNumber; + final String transactionId; + const _ButtonComplete({ + Key key, + @required this.transactionNumber, + @required this.transactionId, + }) : assert(transactionNumber != null), + assert(transactionId != null), + super(key: key); + + @override + Widget build(BuildContext context) { + return ButtonTheme( + minWidth: MediaQuery.of(context).size.width / 1.7, + child: BlueButton( + onPressed: () { + final detailOrderBloc = BlocProvider.of<DetailOrderBloc>(context); + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: const Text('Barang sudah diterima?'), + content: Text( + 'Apakah anda yakin sudah menerima' + ' barang dari pesanan ' + '${transactionNumber}?', + ), + actions: <Widget>[ + FlatButton( + onPressed: () { + Navigator.pop(context); + }, + child: const Text( + 'Tidak', + style: TextStyle(color: Colors.red), + )), + FlatButton( + onPressed: () { + detailOrderBloc.add(CompleteOrder(transactionId)); + Navigator.pop(context); + }, + child: const Text('Ya'), + textColor: Colors.white, + color: Theme.of(context).primaryColor, + ) + ], + ); + }); + }, + label: 'Barang diterima'), + ); + } +} + class _Body extends StatefulWidget { const _Body({Key key}) : super(key: key); @override diff --git a/pubspec.yaml b/pubspec.yaml index 558c76b388d883fdf2e932511cf4ca16ac0d2594..4734093440a1ed4a0fb5983f6cc04bba49942570 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -11,7 +11,7 @@ description: Home Industry is a platform that sell various goods # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.0.0+1 +version: 1.0.2+1 environment: sdk: ">=2.6.0 <3.0.0" diff --git a/test/cart_page_test.dart b/test/cart_page_test.dart index 48c067a30e06801573db4270da0aa1bdf1649e95..9f2d18df3a0086acccf745198054e8b7a474a5f4 100644 --- a/test/cart_page_test.dart +++ b/test/cart_page_test.dart @@ -11,6 +11,7 @@ import 'package:home_industry/Pages/Cart/cart.dart'; import 'package:home_industry/Pages/Cart/model/cart_item.dart'; import 'package:home_industry/Pages/Cart/repositories/cart_repository.dart'; import 'package:home_industry/Pages/Product/model/product/product.dart'; +import 'package:home_industry/Pages/Profile/bloc/bloc.dart'; import 'package:home_industry/State/Auth/bloc/authentication_bloc.dart'; import 'package:home_industry/State/Auth/repositories/auth_repository.dart'; import 'package:home_industry/State/Auth/repositories/depedencies_repositories.dart'; @@ -18,6 +19,7 @@ import 'package:mockito/mockito.dart'; import 'category_page_test.dart'; import 'otp_page_test.dart'; +import 'profile_test.dart'; import 'register_test.dart'; void main() { @@ -650,9 +652,11 @@ void main() { subcategoryName: 'subCatName')) ], 200000, 1)); final depRep = DependenciesRepositories(dio: DioMock()); - await tester.pumpWidget( - RepositoryProvider<DependenciesRepositories>.value( - value: depRep, child: testedWidget)); + await tester.pumpWidget(BlocProvider<ProfileBloc>( + create: (_) => MockProfileBloc(), + child: RepositoryProvider<DependenciesRepositories>.value( + value: depRep, child: testedWidget), + )); expect(find.text('Keranjang'), findsOneWidget); expect(find.text('kue'), findsOneWidget); expect(find.byType(PriceTextFormatter), findsNWidgets(3)); diff --git a/test/summary_test.dart b/test/summary_test.dart index 92b732466f4a70de6a4722e131ffd46f25c9a8bd..f555387185c6b8b0251eb5af51e68d44511a7baa 100644 --- a/test/summary_test.dart +++ b/test/summary_test.dart @@ -39,10 +39,12 @@ void main() { Dio dio; CartBloc cartBloc; SummaryBloc summaryBloc; + ProfileBloc profileBloc; setUp(() { cartBloc = CartBlocMock(); + profileBloc = MockProfileBloc(); dio = DioMock(); - summaryBloc = SummaryBloc(SummaryRepository(dio), cartBloc); + summaryBloc = SummaryBloc(SummaryRepository(dio), cartBloc, profileBloc); }); blocTest('Summary Loaded', @@ -61,6 +63,35 @@ void main() { verify(dio.get(summary)).called(1); }); + blocTest('ProfileLoaded', + build: () async { + when(dio.get(summary)).thenAnswer((_) async => + Response<Map<String, dynamic>>( + statusCode: 200, data: Summary('20000', '5000').toJson())); + whenListen( + profileBloc, + Stream<ProfileState>.value(ProfileLoaded( + profile: Profile( + 'id', + 'username', + 'fullName', + 'phoneNumber', + 'address', + 'neighborhood', + 'hamlet', + 'urbanVillage', + 'subDistrict', + null)))); + return SummaryBloc(SummaryRepository(dio), cartBloc, profileBloc); + }, + expect: [ + SummaryLoaded( + donation: 0, feeTransport: 5000, subTotal: 20000, method: null) + ], + verify: (_) async { + verify(dio.get(summary)).called(1); + }); + blocTest('Summary error', build: () async { when(dio.get(summary)).thenAnswer((_) async =>