TKK_E32210585_aplikasi/lib/ui/midtrans_pay_screen.dart

110 lines
3.3 KiB
Dart

import 'dart:convert';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:e_commerce/widgets/fetch_cart.dart';
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:webview_flutter/webview_flutter.dart';
class MidtransPay extends StatefulWidget {
const MidtransPay({super.key, required this.token, required this.snapshot});
final String token;
final QuerySnapshot snapshot;
@override
State<MidtransPay> createState() => _MidtransPayState();
}
class _MidtransPayState extends State<MidtransPay> {
late WebViewController controller;
final midtransConfig = {
'clientKey': 'SB-Mid-client-7jg9rzEOfqKDKPKw',
'url': 'https://app.sandbox.midtrans.com/snap/snap.js',
};
String _getHtmlString() {
String htmlString = '''
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<script
type="text/javascript"
src="${midtransConfig['url']}"
data-client-key="${midtransConfig['clientKey']}"
></script>
</head>
<body onload="setTimeout(function(){pay()}, 1000)">
<script type="text/javascript">
function pay() {
snap.pay('${widget.token}', {
onSuccess: function(result) {
Android.postMessage('ok');
},
onPending: function(result) {
Android.postMessage('pending');
},
onError: function(result) {
Android.postMessage('error');
},
onClose: function() {
Android.postMessage('close');
}
});
}
</script>
</body>
</html>
''';
return htmlString;
}
void _initController() {
setState(() {
controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..addJavaScriptChannel('Android', onMessageReceived: androidMessage)
..setNavigationDelegate(NavigationDelegate(onNavigationRequest: (request) async {
if (request.url.substring(0, 6) == 'intent') {
if (request.url.contains('gopay')) {
String url = request.url.replaceAll('intent://', 'gojek://');
await launchUrl(Uri.parse(url));
}
return NavigationDecision.prevent;
} else {
return NavigationDecision.navigate;
}
}))
..loadRequest(Uri.dataFromString(_getHtmlString(), mimeType: 'text/html', encoding: Encoding.getByName('utf-8')));
});
}
void androidMessage(JavaScriptMessage receiver) {
if (receiver.message != 'undefined') {
if (receiver.message == 'close' || receiver.message == 'error') {
Navigator.pop(context);
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('Pembayaran Gagal')));
} else {
updateStock(widget.snapshot);
deleteAllItems("users-cart-items");
Navigator.pop(context);
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('Pembayaran Berhasil')));
}
}
}
@override
void initState() {
_initController();
super.initState();
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
body: WebViewWidget(controller: controller),
),
);
}
}