Files

514 lines
22 KiB
Dart

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<String, String> status = {
'null': "Dibatalkan",
'1': 'Berhasil',
'0': 'Transaksi Kursus Gratis',
'2': 'Menunggu Pembayaran',
'-1': 'Pembayaran Ditolak',
'-2': 'Melebihi Batas Waktu',
};
final Map<String, String> 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<DetailPembelianSukses> createState() => _DetailPembelianSuksesState();
}
class _DetailPembelianSuksesState extends State<DetailPembelianSukses> {
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<detailProvs.DetailInvoiceProvider>(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<detailProvs.DetailInvoiceProvider>(
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),
),
);
}
}