diff --git a/lib/Component/modal_bottom_admin_info.dart b/lib/Component/modal_bottom_admin_info.dart new file mode 100644 index 0000000000000000000000000000000000000000..281c53b1984f850ac5dc79c464cdeebc7dd56b85 --- /dev/null +++ b/lib/Component/modal_bottom_admin_info.dart @@ -0,0 +1,107 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:home_industry/Component/border_blue_button.dart'; +import 'package:home_industry/State/AdminInfo/repositories/admin_info_repository.dart'; +import 'package:home_industry/State/Auth/repositories/depedencies_repositories.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import 'custom_circular.dart'; + +class AdminInfo extends StatefulWidget { + const AdminInfo({Key key, this.subject}) : super(key: key); + final String subject; + @override + _AdminInfoState createState() => _AdminInfoState(); +} + +class _AdminInfoState extends State { + AdminInfoRepository _adminInfo; + Future email; + @override + void initState() { + _adminInfo = AdminInfoRepository( + RepositoryProvider.of(context).dio); + email = _adminInfo.fetchContact(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return FractionallySizedBox( + heightFactor: 0.4, + child: Column( + children: [ + Center( + child: Icon(Icons.arrow_drop_down), + ), + Expanded( + child: FutureBuilder( + future: email, + builder: + (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.hasError) { + return const Center( + child: Text('Maaf ada kesalahan!'), + ); + } else if (snapshot.hasData) { + final url = 'mailto:${snapshot.data}' + '${widget.subject != null ? "?subject=" + "${widget.subject}" : ""}'; + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Text( + snapshot.data, + style: Theme.of(context).textTheme.headline6, + ), + IconButton( + icon: Icon( + Icons.content_copy, + color: Colors.black54, + ), + onPressed: () { + Clipboard.setData( + ClipboardData(text: snapshot.data)); + }), + ], + ), + FutureBuilder( + future: canLaunch(url), + builder: (BuildContext context, + AsyncSnapshot snapshot) { + if (snapshot.hasData && snapshot.data) { + return BorderBlueButton( + onPressed: () async { + await launch(url); + Navigator.of(context).pop(); + }, + label: 'Kirim email'); + } else if (snapshot.hasError || + (snapshot.hasData && !snapshot.data)) { + return const SizedBox( + height: 0, + width: 0, + ); + } + return const Center( + child: CustomCircularIndicator(), + ); + }, + ) + ], + ); + } + return const Center( + child: CustomCircularIndicator(), + ); + })) + ], + ), + ); + } +} diff --git a/lib/Pages/Transactions/my_detail_order.dart b/lib/Pages/Transactions/my_detail_order.dart index cfe2e8b36043dd7b6c48a3fc37f5541d879dc6a9..fa056510dabcc28169861585630a31955c7ea700 100644 --- a/lib/Pages/Transactions/my_detail_order.dart +++ b/lib/Pages/Transactions/my_detail_order.dart @@ -4,7 +4,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:home_industry/Component/blue_button.dart'; +import 'package:home_industry/Component/border_blue_button.dart'; import 'package:home_industry/Component/custom_circular.dart'; +import 'package:home_industry/Component/modal_bottom_admin_info.dart'; import 'package:home_industry/Component/price_text_formatter.dart'; import 'package:home_industry/Component/router.dart'; import 'package:home_industry/Pages/Transactions/bloc/bloc.dart'; @@ -37,7 +39,10 @@ class MyDetailOrder extends StatelessWidget { state.transaction.transactionStatus == StatusTransaction.waitSellerConfirmation || state.transaction.transactionStatus == - StatusTransaction.beingShipped) + StatusTransaction.beingShipped || + (state.transaction.transactionStatus == + StatusTransaction.canceled && + state.transaction.proofOfPayment != null)) ? Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 10), @@ -120,6 +125,25 @@ class MyDetailOrder extends StatelessWidget { StatusTransaction.waitSellerConfirmation ? 'Ubah bukti pembayaran' : 'Unggah bukti pembayaran'), + if (state.transaction.transactionStatus == + StatusTransaction.canceled && + state.transaction.proofOfPayment != null) + BorderBlueButton( + onPressed: () { + showModalBottomSheet( + context: context, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.circular(25))), + builder: (BuildContext context) { + return AdminInfo( + subject: 'REFUND: ' + '${state.transaction.transactionNumber}' + ' - ${state.transaction.userUsername}', + ); + }); + }, + label: 'Pengembalian dana') ], ), ) diff --git a/lib/State/AdminInfo/repositories/admin_info_repository.dart b/lib/State/AdminInfo/repositories/admin_info_repository.dart new file mode 100644 index 0000000000000000000000000000000000000000..a93e925076c9b2bba4e285bf725efd9ed4954e21 --- /dev/null +++ b/lib/State/AdminInfo/repositories/admin_info_repository.dart @@ -0,0 +1,12 @@ +import 'package:dio/dio.dart'; + +class AdminInfoRepository { + static const _url = '/configs/help-contact/'; + final Dio _dio; + + const AdminInfoRepository(this._dio); + Future fetchContact() async { + final response = await _dio.get(_url); + return response.data['email']; + } +} diff --git a/pubspec.lock b/pubspec.lock index ea3871d1d1b0efbbeccbdbb4abd68ae413a893b2..d461e3ec60ab1b8f94068a74b81f18166875e514 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -70,7 +70,7 @@ packages: name: build url: "https://pub.dartlang.org" source: hosted - version: "1.2.2" + version: "1.3.0" build_config: dependency: transitive description: @@ -91,21 +91,21 @@ packages: name: build_resolvers url: "https://pub.dartlang.org" source: hosted - version: "1.3.7" + version: "1.3.8" build_runner: dependency: "direct dev" description: name: build_runner url: "https://pub.dartlang.org" source: hosted - version: "1.9.0" + version: "1.10.0" build_runner_core: dependency: transitive description: name: build_runner_core url: "https://pub.dartlang.org" source: hosted - version: "5.1.0" + version: "5.2.0" built_collection: dependency: transitive description: @@ -305,6 +305,11 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" glob: dependency: transitive description: @@ -325,7 +330,7 @@ packages: name: google_fonts url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.1.0" graphs: dependency: transitive description: @@ -472,7 +477,7 @@ packages: name: node_interop url: "https://pub.dartlang.org" source: hosted - version: "1.0.3" + version: "1.1.0" node_io: dependency: transitive description: @@ -507,7 +512,7 @@ packages: name: path_provider url: "https://pub.dartlang.org" source: hosted - version: "1.6.7" + version: "1.6.8" path_provider_macos: dependency: transitive description: @@ -570,7 +575,7 @@ packages: name: provider url: "https://pub.dartlang.org" source: hosted - version: "4.1.0" + version: "4.1.1" pub_semver: dependency: transitive description: @@ -758,6 +763,34 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.6" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + url: "https://pub.dartlang.org" + source: hosted + version: "5.4.7" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.1+5" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.7" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.1+5" uuid: dependency: transitive description: @@ -778,7 +811,7 @@ packages: name: vm_service url: "https://pub.dartlang.org" source: hosted - version: "4.0.2" + version: "4.0.3" watcher: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 3a4070250080c2ac29e1860a8b10a1a25db823b6..5fd618cf589e93bd71dedd69c6d976aa6524ea90 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -22,7 +22,7 @@ dependencies: bloc: ^4.0.0 flutter_bloc: ^4.0.0 equatable: ^1.1.0 - google_fonts: ^1.0.0 + google_fonts: ^1.1.0 cached_network_image: ^2.2.0+1 image_picker: ^0.6.6 global_configuration: ^1.5.0 @@ -34,8 +34,9 @@ dependencies: intl: ^0.16.1 stream_transform: ^1.2.0 badges: ^1.1.1 - provider: ^4.1.0 + provider: ^4.1.1 step_progress_indicator: ^0.2.2+5 + url_launcher: ^5.4.7 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^0.1.2 @@ -48,7 +49,7 @@ dev_dependencies: bloc_test: ^5.1.0 mockito: 4.1.1 json_serializable: ^3.3.0 - build_runner: ^1.9.0 + build_runner: ^1.10.0 flutter_native_splash: ^0.1.9 flutter_launcher_icons: ^0.7.3 diff --git a/test/detail_order_test.dart b/test/detail_order_test.dart index ef297b3e30a32d1bbcd12b03ddeae73cfd02c81c..c007976fb8469698ac85e82b5a9facbc944476b5 100644 --- a/test/detail_order_test.dart +++ b/test/detail_order_test.dart @@ -4,6 +4,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:home_industry/Component/modal_bottom_admin_info.dart'; import 'package:home_industry/Component/router.dart'; import 'package:home_industry/Pages/Transactions/bloc/bloc.dart'; import 'package:home_industry/Pages/Transactions/detail_bloc/bloc.dart'; @@ -125,6 +126,24 @@ void main() { expect(find.text('Batalkan pesanan ini?'), findsNothing); }); + testWidgets('loaded refund', (WidgetTester tester) async { + when(dio.get('/configs/help-contact/')).thenAnswer((_) async => + Response>( + statusCode: 200, data: {'email': 'pilarjakarta@gmail.com'})); + json['transaction_status'] = '006'; + json['proof_of_payment'] = 'ada'; + when(detailOrderBloc.state) + .thenAnswer((_) => FetchOrderSuccess(Transaction.fromJson(json))); + await tester.pumpWidget(widgetTested); + expect(find.text('GTXWP3PJ'), findsOneWidget); + expect(find.text('Rp155.040'), findsOneWidget); + await tester.tap(find.text('Pengembalian dana')); + await tester.pump(Duration(seconds: 1)); + expect(find.byType(AdminInfo), findsOneWidget); + await tester.pump(Duration(seconds: 1)); + expect(find.text('pilarjakarta@gmail.com'), findsOneWidget); + }); + testWidgets('loaded 001 cancel modal yes', (WidgetTester tester) async { json['transaction_status'] = '001'; when(detailOrderBloc.state) diff --git a/test/mock/transaction.json b/test/mock/transaction.json index 4875f02a200caa9b690d9b6921b0a43f30443c5e..bcb0f8b30bd75505121d5fd7a8c46c1e50a72640 100644 --- a/test/mock/transaction.json +++ b/test/mock/transaction.json @@ -38,8 +38,8 @@ "transaction_status": "002", "readable_transaction_status": "Waiting for seller confirmation", "proof_of_payment": null, - "user_bank_account_name": "adada", - "user_bank_account_number": "22131313", + "user_bank_account_name": null, + "user_bank_account_number": null, "created_at": "2020-04-16T15:04:22.073683+07:00", "updated_at": "2020-04-17T23:57:16.659287+07:00", "subtotal": "155040.00"