import 'package:cherry_toast/cherry_toast.dart'; import 'package:cherry_toast/resources/arrays.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:initial_folder/base_service.dart'; import 'package:initial_folder/models/history_transaction_model.dart'; import 'package:initial_folder/screens/profile/account_sign_in/invoice.dart'; import 'package:initial_folder/size_config.dart'; import 'package:initial_folder/theme.dart'; import 'package:initial_folder/widgets/custom_navigator.dart'; import 'package:initial_folder/widgets/login_regist/default_button_payment.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import 'package:initial_folder/providers/detail_invoice_provider.dart' as detailProvs; class DetailPembelianSukses extends StatefulWidget { DetailPembelianSukses({ Key? key, this.orderId, this.dataHistoryTransactionModel, }) : super(key: key); final String? orderId; final HistoryTransactionModel? dataHistoryTransactionModel; final Map status = { 'null': "Dibatalkan", '1': 'Berhasil', '0': 'Transaksi Kursus Gratis', '2': 'Menunggu Pembayaran', '-1': 'Pembayaran Ditolak', '-2': 'Melebihi Batas Waktu', }; final Map paymentType = { 'null': "Dibatalkan", 'bank transfer': 'Bank Transfer', 'echannel': 'Bank Transfer', 'credit card': 'Kartu Kredit', 'permata': 'Bank Transfer', 'gopay': 'GoPay', 'cstore': 'Gerai', 'free': 'Kursus Gratis', 'Coupon Free Course': 'Kursus Gratis' }; @override State createState() => _DetailPembelianSuksesState(); } class _DetailPembelianSuksesState extends State { bool isButtonPressed = false; final TextStyle baris = primaryTextStyle.copyWith( fontWeight: reguler, fontSize: getProportionateScreenWidth(14), letterSpacing: 0.5, ); @override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) { if (widget.orderId!.isNotEmpty) { try { Provider.of(context, listen: false) .fetchDetailInvoice(widget.orderId); } catch (e) { print('Gagal detail invoice $e'); } } }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( centerTitle: true, scrolledUnderElevation: 0.0, backgroundColor: Theme.of(context).colorScheme.background, title: Text( "Cara Pembayaran", style: thirdTextStyle.copyWith( fontWeight: semiBold, fontSize: getProportionateScreenWidth(15), ), ), ), body: SingleChildScrollView( child: Consumer( builder: (context, provider, child) { if (provider.state == detailProvs.ResultState.loading) { return Center( child: Column( children: [ Padding( padding: EdgeInsets.only( top: getProportionateScreenHeight(100)), child: CircularProgressIndicator( strokeWidth: 2, color: primaryColor, ), ), ], ), ); } else if (provider.state == detailProvs.ResultState.hasData) { Widget buildTextWidget() { String text = ""; if (provider.detailInvoice?[0].permataVaNumber != null) { text = "Permata Virtual Account"; } else if (provider.detailInvoice?[0].billerCode != null) { text = "Mandiri Virtual Account"; } else if (provider.detailInvoice?[0].vaNumbers != null && provider.detailInvoice![0].vaNumbers! .any((va) => va.bank == 'bni')) { text = "BNI Virtual Account"; } else if (provider.detailInvoice?[0].vaNumbers != null && provider.detailInvoice![0].vaNumbers! .any((va) => va.bank == 'bca')) { text = "BCA Virtual Account"; } else if (provider.detailInvoice?[0].billerCode != null) { text = "Mandiri Virtual Account"; } else if (provider.detailInvoice?[0].store == "alfamart") { text = "Alfamart"; } else if (provider.detailInvoice?[0].store == "indomaret") { text = "Indomart"; } else if (provider.detailInvoice?[0].paymentType == "credit_card") { text = "Credit Card"; } else if (provider.detailInvoice?[0].paymentType == "gopay") { text = "QRIS"; } else { "Transaksi Gratis"; } return Text( text ?? "Transaksi Gratis", style: thirdTextStyle.copyWith( fontSize: getProportionateScreenWidth(11)), ); } return Padding( padding: EdgeInsets.symmetric( horizontal: getProportionateScreenWidth(10), vertical: getProportionateScreenHeight(10), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( width: double.infinity, decoration: BoxDecoration( borderRadius: BorderRadius.only( topLeft: Radius.circular(4), topRight: Radius.circular(4), ), color: Theme.of(context).colorScheme.primaryContainer, ), padding: EdgeInsets.only( left: getProportionateScreenWidth(10), right: getProportionateScreenWidth(10), top: getProportionateScreenHeight(15), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( 'Transaksi Selesai', style: thirdTextStyle.copyWith( fontSize: getProportionateScreenWidth(13), ), ), if (widget .dataHistoryTransactionModel?.statusPayment == '1' || widget.dataHistoryTransactionModel ?.statusPayment == '0') _statusLabel( widget.status[widget.dataHistoryTransactionModel?.statusPayment] ?? '', eightColor) else if (widget.dataHistoryTransactionModel!.statusPayment == '2' || widget.dataHistoryTransactionModel!.statusPayment == '0') _statusLabel( widget.status[widget.dataHistoryTransactionModel?.statusPayment] ?? '', fiveColor) else if (widget.dataHistoryTransactionModel! .statusPayment != null && widget.status.containsKey( widget.dataHistoryTransactionModel!.statusPayment)) _statusLabel(widget.status[widget.dataHistoryTransactionModel?.statusPayment] ?? '', sevenColor) else _statusLabel(widget.status['null']! ?? "null", sevenColor) ], ), SizedBox(height: getProportionateScreenHeight(8)), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( 'Order ID', style: thirdTextStyle.copyWith( fontSize: getProportionateScreenWidth(11), ), ), Text( widget.orderId!, style: thirdTextStyle.copyWith( fontSize: getProportionateScreenWidth(11), ), ), ], ), SizedBox(height: getProportionateScreenHeight(5)), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( 'Tanggal Pembelian', style: thirdTextStyle.copyWith( fontSize: getProportionateScreenWidth(11), ), ), Text( DateFormat('E, d MMM y').format(DateTime.parse( widget.dataHistoryTransactionModel!.date .toString())), style: thirdTextStyle.copyWith( fontSize: getProportionateScreenWidth(11), ), ), ], ), ], ), ), Container( width: double.infinity, decoration: BoxDecoration( borderRadius: BorderRadius.only( bottomLeft: Radius.circular(4), bottomRight: Radius.circular(4), ), color: Theme.of(context).colorScheme.primaryContainer, boxShadow: [ BoxShadow( color: Theme.of(context).brightness == Brightness.dark ? Colors.transparent : secondaryColor.withOpacity(0.2), spreadRadius: 1, blurRadius: 2, offset: Offset(0, getProportionateScreenHeight(4)), ), ], ), padding: EdgeInsets.symmetric( horizontal: getProportionateScreenWidth(10)), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox(height: getProportionateScreenHeight(10)), Text( "Kursus", style: thirdTextStyle.copyWith( fontSize: getProportionateScreenWidth(11)), ), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ listCourse( imageUrl: provider.thumbnail, title: widget.dataHistoryTransactionModel! .courses?[0].title, instructor: widget.dataHistoryTransactionModel! .courses?[0].instructor, price: widget.dataHistoryTransactionModel! .courses?[0].price, discountPrice: widget .dataHistoryTransactionModel! .courses?[0] .price, totalPrices: 0, ), ], ), Text( 'Rincian Pembayaran', style: thirdTextStyle.copyWith( fontSize: getProportionateScreenWidth(13), ), ), SizedBox(height: getProportionateScreenHeight(11)), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( 'Metode Pembayaran', style: thirdTextStyle.copyWith( fontWeight: reguler, fontSize: getProportionateScreenWidth(10), ), ), buildTextWidget(), ], ), SizedBox(height: getProportionateScreenHeight(10)), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( 'Total Harga', style: thirdTextStyle.copyWith( fontWeight: reguler, fontSize: getProportionateScreenWidth(10), ), ), Text( 'Rp. ${NumberFormat.currency(locale: 'id', symbol: '', decimalDigits: 0).format(double.parse(provider.detailInvoice![0].grossAmount! ?? "0"))}', style: thirdTextStyle.copyWith( fontSize: getProportionateScreenWidth(11)), ), ], ), SizedBox(height: getProportionateScreenHeight(2)), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( 'Potongan Kupon', style: thirdTextStyle.copyWith( fontWeight: reguler, fontSize: getProportionateScreenWidth(10), ), ), Text( 'Rp. ${NumberFormat.currency(locale: 'id', symbol: '', decimalDigits: 0).format(double.parse("0"))}', style: thirdTextStyle.copyWith( fontSize: getProportionateScreenWidth(11)), ), ], ), SizedBox(height: getProportionateScreenHeight(10)), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( 'Total Bayar', style: thirdTextStyle.copyWith( fontWeight: reguler, fontSize: getProportionateScreenWidth(10), ), ), Text( 'Rp. ${NumberFormat.currency(locale: 'id', symbol: '', decimalDigits: 0).format(double.parse(provider.detailInvoice![0].grossAmount! ?? "0"))}', style: thirdTextStyle.copyWith( fontSize: getProportionateScreenWidth(13), fontWeight: semiBold, ), ), ], ), SizedBox(height: getProportionateScreenHeight(10)), DefaultButtonPayment( width: double.infinity, height: 37, text: "Lihat Invoice", weight: semiBold, press: () { if (!isButtonPressed) { isButtonPressed = true; if (provider.detailInvoice?[0] .transactionStatus == 'settlement' || provider.detailInvoice![0] .transactionStatus == 'capture') { Navigator.push( context, CustomNavigator( child: Invoice( dataHistoryTransactionModel: widget.dataHistoryTransactionModel, ), ), ); } else { CherryToast.error( animationDuration: Durations.long1, toastDuration: Duration(seconds: 2), title: Text( "Pembayaran ini belum berhasil", style: TextStyle( color: Colors.black, fontSize: 15, ), ), animationType: AnimationType.fromTop, ).show(context); } Future.delayed(Duration(seconds: 2), () { isButtonPressed = false; }); } }, ), SizedBox(height: getProportionateScreenHeight(10)), ], ), ), ], ), ); } else if (provider.state == detailProvs.ResultState.noData) { return Center(child: Text(provider.message ?? '')); } else if (provider.state == detailProvs.ResultState.error) { return Center(child: Text(provider.message ?? '')); } else { return Container(); } }, ), ), ); } Widget listCourse({ String? imageUrl, String? title, String? instructor, String? price, String? discountPrice, int? totalPrices, }) { return Container( padding: EdgeInsets.only( top: getProportionateScreenHeight(6), bottom: getProportionateScreenHeight(12), ), child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Container( width: getProportionateScreenWidth(60), height: getProportionateScreenHeight(30), decoration: BoxDecoration( borderRadius: BorderRadius.circular(2), image: DecorationImage( image: NetworkImage(imageUrl == null || imageUrl.isEmpty ? '$baseUrl/images/default-thumbnail.png' : imageUrl.startsWith("http") ? imageUrl : '$baseUrl/uploads/thumbnail/course_thumbnails/$imageUrl'), fit: BoxFit.cover, ), ), ), SizedBox(width: getProportionateScreenWidth(10)), Flexible( flex: 7, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( title!, maxLines: 2, overflow: TextOverflow.ellipsis, style: thirdTextStyle.copyWith( letterSpacing: 0.5, fontWeight: reguler, fontSize: getProportionateScreenWidth(11), ), ), ], ), ), ], ), ); } Widget _statusLabel(String text, Color color) { return Container( alignment: Alignment.center, padding: EdgeInsets.symmetric( vertical: getProportionateScreenHeight(2), horizontal: getProportionateScreenWidth(5)), child: Text( text, style: thirdTextStyle.copyWith( color: baruTextutih, fontSize: getProportionateScreenWidth(9), fontWeight: semiBold, ), ), decoration: BoxDecoration( color: color, borderRadius: BorderRadius.circular(5), ), ); } }