110 lines
3.3 KiB
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),
|
|
),
|
|
);
|
|
}
|
|
}
|