378 lines
15 KiB
Dart
378 lines
15 KiB
Dart
import 'dart:convert';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:initial_folder/helper/user_info.dart';
|
|
import 'package:initial_folder/providers/cart_provider.dart';
|
|
import 'package:initial_folder/providers/carts_provider.dart';
|
|
import 'package:initial_folder/providers/payments_provider.dart';
|
|
import 'package:initial_folder/screens/checkout/components/bottom_sheet_detail.dart';
|
|
import 'package:initial_folder/screens/checkout/gopay/payment_instruction_gopay.dart';
|
|
import 'package:initial_folder/screens/checkout/gopay/qr_code_gopay.dart';
|
|
import 'package:initial_folder/screens/checkout/success_paid_course.dart';
|
|
import 'package:initial_folder/size_config.dart';
|
|
import 'package:initial_folder/theme.dart';
|
|
import 'package:initial_folder/widgets/login_regist/default_button.dart';
|
|
import 'package:intl/intl.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:pusher_client/pusher_client.dart';
|
|
|
|
class BatasBayarGopay extends StatefulWidget {
|
|
final List<String>? idCart;
|
|
BatasBayarGopay({this.idCart});
|
|
@override
|
|
State<BatasBayarGopay> createState() => _BatasBayarGopayState();
|
|
}
|
|
|
|
class _BatasBayarGopayState extends State<BatasBayarGopay> {
|
|
Channel? _channel;
|
|
String? statusTransaction;
|
|
|
|
Future<void> deleteCourse() async {
|
|
List<String> idCarts = widget.idCart ?? [];
|
|
|
|
idCarts.forEach((element) async {
|
|
await Provider.of<CartProvider>(context, listen: false)
|
|
.deleteCart(element);
|
|
await Provider.of<CartsProvider>(context, listen: false).getCarts();
|
|
});
|
|
}
|
|
|
|
Future<void> initPusher() async {
|
|
int? idUser = await UsersInfo().getIdUser();
|
|
|
|
PusherClient pusher = PusherClient(
|
|
'92060797e94ac7033edb', PusherOptions(cluster: 'ap1'),
|
|
autoConnect: false);
|
|
|
|
pusher.connect();
|
|
|
|
// pusher.onConnectionStateChange((state) {
|
|
// print(state!.currentState);
|
|
// });
|
|
// pusher.onConnectionError((error) {
|
|
// print(error);
|
|
// });
|
|
|
|
_channel = pusher.subscribe('payment-channel');
|
|
|
|
_channel!.bind('paid-event-$idUser', (event) {
|
|
if (mounted) {
|
|
final status = jsonDecode(event!.data!);
|
|
setState(() {
|
|
statusTransaction = status['status_code'];
|
|
if (statusTransaction == "201") {
|
|
print(status['message']);
|
|
print(widget.idCart);
|
|
deleteCourse();
|
|
// Navigator.of(context).pushAndRemoveUntil(
|
|
// MaterialPageRoute(
|
|
// builder: (context) => SuccessPaidCourse(),
|
|
// ),
|
|
// (route) => false,
|
|
// );
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
@override
|
|
void initState() {
|
|
initPusher();
|
|
super.initState();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
var detailOrder = Provider.of<PaymentsProvider>(context).detailOrder;
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
title: Text(
|
|
'Selesaikan Pembayaran',
|
|
style: secondaryTextStyle.copyWith(
|
|
letterSpacing: 1,
|
|
fontWeight: semiBold,
|
|
fontSize: getProportionateScreenWidth(14)),
|
|
),
|
|
),
|
|
body: SingleChildScrollView(
|
|
child: Container(
|
|
margin:
|
|
EdgeInsets.symmetric(horizontal: getProportionateScreenWidth(16)),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: <Widget>[
|
|
SizedBox(height: getProportionateScreenHeight(10)),
|
|
Center(
|
|
child: Column(
|
|
children: [
|
|
Text(
|
|
'Batas akhir pembayaran sampai',
|
|
style: primaryTextStyle.copyWith(
|
|
color: secondaryColor,
|
|
letterSpacing: 0.5,
|
|
fontWeight: reguler,
|
|
fontSize: getProportionateScreenWidth(10),
|
|
),
|
|
),
|
|
SizedBox(height: getProportionateScreenHeight(5)),
|
|
Text(
|
|
// 'Rabu, 13 Oktober 2021 (Pukul 19:32)',
|
|
DateFormat('E, d MMM y (H:m)')
|
|
.format(detailOrder[0].transactionTimeLimit),
|
|
style: secondaryTextStyle.copyWith(
|
|
letterSpacing: 1,
|
|
fontWeight: semiBold,
|
|
color: tenthColor,
|
|
fontSize: SizeConfig.blockHorizontal! * 3,
|
|
),
|
|
),
|
|
SizedBox(height: getProportionateScreenHeight(5)),
|
|
Text(
|
|
'Segera selesaikan pembayaran atau pesananmu',
|
|
style: primaryTextStyle.copyWith(
|
|
color: secondaryColor,
|
|
letterSpacing: 0.5,
|
|
fontWeight: reguler,
|
|
fontSize: getProportionateScreenWidth(10),
|
|
),
|
|
),
|
|
Text(
|
|
'akan dibatalkan secara otomatis',
|
|
style: primaryTextStyle.copyWith(
|
|
color: secondaryColor,
|
|
letterSpacing: 0.5,
|
|
fontWeight: reguler,
|
|
fontSize: getProportionateScreenWidth(10),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
SizedBox(
|
|
height: getProportionateScreenHeight(30),
|
|
),
|
|
Container(
|
|
decoration: BoxDecoration(
|
|
color: Color(0xFF212121),
|
|
borderRadius: BorderRadius.circular(8),
|
|
),
|
|
margin: EdgeInsets.only(
|
|
left: getProportionateScreenWidth(2),
|
|
right: getProportionateScreenWidth(2)),
|
|
child: Container(
|
|
padding: EdgeInsets.symmetric(
|
|
vertical: 16,
|
|
horizontal: getProportionateScreenWidth(10)),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(
|
|
'Metode Pembayaran',
|
|
style: primaryTextStyle.copyWith(
|
|
color: Colors.white,
|
|
letterSpacing: 0.5,
|
|
fontWeight: reguler,
|
|
fontSize: getProportionateScreenWidth(10),
|
|
),
|
|
),
|
|
SizedBox(
|
|
height: getProportionateScreenHeight(8),
|
|
),
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Text(
|
|
'GoPay',
|
|
style: primaryTextStyle.copyWith(
|
|
color: Colors.white,
|
|
letterSpacing: 1,
|
|
fontWeight: semiBold,
|
|
fontSize: getProportionateScreenWidth(13),
|
|
),
|
|
),
|
|
Container(
|
|
width: getProportionateScreenWidth(50),
|
|
height: getProportionateScreenWidth(17),
|
|
decoration: BoxDecoration(
|
|
borderRadius: BorderRadius.circular(2),
|
|
image: DecorationImage(
|
|
fit: BoxFit.scaleDown,
|
|
image: AssetImage('assets/images/gopay2.png'),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
SizedBox(
|
|
height: getProportionateScreenHeight(16),
|
|
),
|
|
Text(
|
|
'Kode QR',
|
|
style: primaryTextStyle.copyWith(
|
|
color: Colors.white,
|
|
letterSpacing: 0.5,
|
|
fontWeight: reguler,
|
|
fontSize: getProportionateScreenWidth(10),
|
|
),
|
|
),
|
|
SizedBox(
|
|
height: getProportionateScreenHeight(8),
|
|
),
|
|
Row(
|
|
children: [
|
|
Icon(Icons.qr_code),
|
|
Spacer(),
|
|
GestureDetector(
|
|
onTap: () {
|
|
// Navigator.push(
|
|
// context,
|
|
// MaterialPageRoute(
|
|
// builder: (context) => QRCodeGopay()));
|
|
Navigator.pop(context);
|
|
},
|
|
child: Text(
|
|
"Scan Kode QR",
|
|
style: primaryTextStyle.copyWith(
|
|
letterSpacing: 0.5,
|
|
color: primaryColor,
|
|
fontSize: getProportionateScreenWidth(10),
|
|
fontWeight: reguler),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
SizedBox(
|
|
height: getProportionateScreenHeight(16),
|
|
),
|
|
Text(
|
|
'Total Pembayaran',
|
|
style: primaryTextStyle.copyWith(
|
|
color: Colors.white,
|
|
letterSpacing: 0.5,
|
|
fontWeight: reguler,
|
|
fontSize: getProportionateScreenWidth(10),
|
|
),
|
|
),
|
|
SizedBox(
|
|
height: getProportionateScreenHeight(8),
|
|
),
|
|
Row(
|
|
children: [
|
|
Text(
|
|
'Rp. ${NumberFormat.currency(locale: 'id', symbol: '', decimalDigits: 0).format(double.parse(detailOrder[0].totalPayment))}',
|
|
style: primaryTextStyle.copyWith(
|
|
color: Colors.white,
|
|
letterSpacing: 1,
|
|
fontWeight: semiBold,
|
|
fontSize: getProportionateScreenWidth(14),
|
|
),
|
|
),
|
|
Spacer(),
|
|
GestureDetector(
|
|
onTap: () {
|
|
showModalBottomSheet(
|
|
context: context,
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.vertical(
|
|
top: Radius.circular(20))),
|
|
builder: (context) {
|
|
return BottomSheetDetail();
|
|
});
|
|
},
|
|
child: Text(
|
|
"Detail Pembayaran",
|
|
style: primaryTextStyle.copyWith(
|
|
letterSpacing: 0.5,
|
|
color: primaryColor,
|
|
fontSize: getProportionateScreenWidth(10),
|
|
fontWeight: reguler),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
SizedBox(
|
|
height: getProportionateScreenHeight(16),
|
|
),
|
|
Text(
|
|
'Status Pembayaran',
|
|
style: primaryTextStyle.copyWith(
|
|
color: Colors.white,
|
|
letterSpacing: 0.5,
|
|
fontWeight: reguler,
|
|
fontSize: getProportionateScreenWidth(10),
|
|
),
|
|
),
|
|
SizedBox(
|
|
height: getProportionateScreenHeight(8),
|
|
),
|
|
Text(
|
|
statusTransaction == '201' || statusTransaction == null
|
|
? 'Pending'
|
|
: 'Success',
|
|
style: primaryTextStyle.copyWith(
|
|
color: Color(0xffEDA923),
|
|
letterSpacing: 1,
|
|
fontWeight: medium,
|
|
fontSize: getProportionateScreenWidth(12),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
SizedBox(
|
|
height: getProportionateScreenHeight(24),
|
|
),
|
|
DefaultButton(
|
|
text: 'Belanja kursus lainnya',
|
|
weight: reguler,
|
|
press: () {
|
|
Navigator.pushNamedAndRemoveUntil(
|
|
context, "/home", (r) => false);
|
|
},
|
|
),
|
|
SizedBox(
|
|
height: getProportionateScreenHeight(32),
|
|
),
|
|
Container(
|
|
decoration: BoxDecoration(
|
|
color: Color(0xFF212121),
|
|
borderRadius: BorderRadius.circular(8),
|
|
),
|
|
margin: EdgeInsets.only(
|
|
left: getProportionateScreenWidth(2),
|
|
right: getProportionateScreenWidth(2)),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Container(
|
|
padding: EdgeInsets.symmetric(
|
|
vertical: 16,
|
|
horizontal: getProportionateScreenWidth(16)),
|
|
child: Text(
|
|
'Cara Pembayaran',
|
|
style: secondaryTextStyle.copyWith(
|
|
color: tenthColor,
|
|
letterSpacing: 1,
|
|
fontWeight: semiBold,
|
|
fontSize: getProportionateScreenWidth(14),
|
|
),
|
|
),
|
|
),
|
|
Divider(
|
|
color: Color(0xff2D2D2D), thickness: 0.5, height: 0.5),
|
|
PaymentInstructionGopay()
|
|
],
|
|
),
|
|
),
|
|
SizedBox(
|
|
height: getProportionateScreenHeight(30),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|