Initial commit: Penyerahan final Source code Tugas Akhir
This commit is contained in:
513
lib/screens/profile/account_sign_in/detail_pembelian_sukses.dart
Normal file
513
lib/screens/profile/account_sign_in/detail_pembelian_sukses.dart
Normal file
@ -0,0 +1,513 @@
|
||||
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),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user