imrpoving tran flow
This commit is contained in:
@@ -9,6 +9,7 @@ class GatewayModel {
|
||||
String status = '';
|
||||
String? errorMessage;
|
||||
bool isCancelled = false;
|
||||
int count = 0;
|
||||
}
|
||||
|
||||
class GatewayController extends ChangeNotifier {
|
||||
@@ -40,6 +41,7 @@ class GatewayController extends ChangeNotifier {
|
||||
|
||||
void startLoading() {
|
||||
model.isLoading = true;
|
||||
model.status = '';
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
@@ -48,6 +50,36 @@ class GatewayController extends ChangeNotifier {
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> poll(String uid) async {
|
||||
startLoading();
|
||||
try {
|
||||
dynamic workflowResponse = await http.get('/public/transaction/poll/$uid');
|
||||
|
||||
logger.i(workflowResponse.toString());
|
||||
|
||||
dynamic response = workflowResponse['body'];
|
||||
|
||||
model.status = response['status'];
|
||||
transactionController.model.paymentStatus = response['status'];
|
||||
transactionController.updateReceiptData(response);
|
||||
|
||||
if(model.status == 'PENDING') {
|
||||
_showErrorSnackBar('Transaction status still pending');
|
||||
}
|
||||
|
||||
if(model.status != 'FAILED') {
|
||||
_showErrorSnackBar(response['errorMessage'].isEmpty ? 'Transaction failed' : response['errorMessage']);
|
||||
}
|
||||
notifyListeners();
|
||||
} catch (e) {
|
||||
logger.e(e);
|
||||
_showErrorSnackBar(
|
||||
"Network error. Please try again or contact support",
|
||||
);
|
||||
}
|
||||
finishLoading();
|
||||
}
|
||||
|
||||
Future<void> pollTransaction(String uid) async {
|
||||
while (!model.isCancelled) {
|
||||
// Check cancellation flag instead of true
|
||||
@@ -57,25 +89,7 @@ class GatewayController extends ChangeNotifier {
|
||||
// Check again after delay in case it was cancelled during the delay
|
||||
if (model.isCancelled) break;
|
||||
|
||||
try {
|
||||
dynamic workflowResponse = await http.get('/public/transaction/poll/$uid');
|
||||
|
||||
logger.i(workflowResponse.toString());
|
||||
|
||||
dynamic response = workflowResponse['body'];
|
||||
|
||||
if (response['status'] == 'SUCCESS') {
|
||||
model.status = response['status'];
|
||||
transactionController.updateReceiptData(response);
|
||||
notifyListeners();
|
||||
break;
|
||||
}
|
||||
} catch (e) {
|
||||
logger.e(e);
|
||||
_showErrorSnackBar(
|
||||
"Network error. Please try again or contact support",
|
||||
);
|
||||
}
|
||||
await poll(uid);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:qpay/screens/gateway/gateway_controller.dart';
|
||||
import 'package:webview_flutter/webview_flutter.dart';
|
||||
@@ -15,14 +18,20 @@ class _GatewayScreenState extends State<GatewayScreen> {
|
||||
late WebViewController _webViewController;
|
||||
late GatewayController controller;
|
||||
|
||||
bool integrationStarted = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_initWebView(widget.url);
|
||||
controller = GatewayController(context);
|
||||
controller.pollTransaction(
|
||||
controller.transactionController.model.receiptData?['id'],
|
||||
);
|
||||
|
||||
bool simulate = bool.parse(dotenv.env['SIMULATE_PAYMENT_SUCCESS']!);
|
||||
if(simulate) {
|
||||
sleep(Duration(seconds: 10));
|
||||
String url = widget.url.replaceAll("/pay/", "/receipt/");
|
||||
_webViewController.loadRequest(Uri.parse(url));
|
||||
}
|
||||
}
|
||||
|
||||
void _initWebView(String url) {
|
||||
@@ -42,6 +51,33 @@ class _GatewayScreenState extends State<GatewayScreen> {
|
||||
},
|
||||
onHttpError: (HttpResponseError error) {},
|
||||
onWebResourceError: (WebResourceError error) {},
|
||||
onUrlChange: (UrlChange url) async {
|
||||
print("URL Changed to ${url.url!}");
|
||||
|
||||
if(url.url!.contains("/checkout/receipt/")){
|
||||
if(integrationStarted) {
|
||||
return;
|
||||
}
|
||||
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text("Payment was successful, please wait while we process your order."),
|
||||
behavior: SnackBarBehavior.floating,
|
||||
backgroundColor: Colors.black87,
|
||||
duration: const Duration(seconds: 5),
|
||||
),
|
||||
);
|
||||
|
||||
setState(() {
|
||||
integrationStarted = true;
|
||||
});
|
||||
await controller.poll(controller.transactionController.model.receiptData?['id']);
|
||||
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
context.go('/integration');
|
||||
});
|
||||
}
|
||||
}
|
||||
),
|
||||
)
|
||||
..loadRequest(Uri.parse(url));
|
||||
|
||||
Reference in New Issue
Block a user