completed velocity integration

This commit is contained in:
2026-05-27 19:01:24 +02:00
parent fec46fb6e9
commit 6fdd3183fb
29 changed files with 2760 additions and 2293 deletions

View File

@@ -1,8 +1,8 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart';
import 'package:qpay/http/http.dart';
import 'package:qpay/models/api_response.dart';
import 'package:qpay/screens/gateway/gateway_controller.dart';
import 'package:qpay/screens/transaction_controller.dart';
import 'package:shared_preferences/shared_preferences.dart';
@@ -34,19 +34,7 @@ class IntegrationController extends ChangeNotifier {
gatewayController = GatewayController(context);
}
void _showErrorSnackBar(String? message) {
WidgetsBinding.instance.addPostFrameCallback((_) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(message.toString()),
behavior: SnackBarBehavior.floating,
backgroundColor: Colors.deepOrange,
),
);
});
}
Future<void> doIntegration() async {
Future<ApiResponse<Map<String, dynamic>>> doIntegration() async {
try {
model.isLoading = true;
notifyListeners();
@@ -75,10 +63,13 @@ class IntegrationController extends ChangeNotifier {
WidgetsBinding.instance.addPostFrameCallback((_) {
if (!_disposed && context.mounted) context.go('/receipt');
});
return ApiResponse.success(Map<String, dynamic>.from(response));
} catch (e) {
model.isLoading = false;
model.errorMessage = e.toString();
if (!_disposed) notifyListeners();
return ApiResponse.failure(e.toString());
}
}

View File

@@ -1,9 +1,8 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart';
import 'package:qpay/models/responsive_policy.dart';
import 'package:qpay/screens/transaction_controller.dart';
import 'package:skeletonizer/skeletonizer.dart';
import 'package:qpay/widgets/step_loading_widget.dart';
import 'integration_controller.dart';
@@ -18,8 +17,6 @@ class _IntegrationScreenState extends State<IntegrationScreen> {
late IntegrationController controller;
late TransactionController transactionController;
bool integrating = false;
@override
void initState() {
super.initState();
@@ -32,19 +29,6 @@ class _IntegrationScreenState extends State<IntegrationScreen> {
controller.doIntegration();
}
void _showErrorSnackBar(String? message) {
WidgetsBinding.instance.addPostFrameCallback((_) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(message.toString()),
behavior: SnackBarBehavior.floating,
backgroundColor: Colors.deepOrange,
),
);
});
}
@override
void dispose() {
controller.dispose();
@@ -56,6 +40,10 @@ class _IntegrationScreenState extends State<IntegrationScreen> {
return Scaffold(
appBar: AppBar(
title: const Text('Completing your transaction'),
leading: IconButton(
icon: const Icon(Icons.arrow_back),
onPressed: () => context.go('/'),
),
),
body: ListenableBuilder(
listenable: controller,
@@ -66,60 +54,18 @@ class _IntegrationScreenState extends State<IntegrationScreen> {
});
}
return Container(
padding: EdgeInsets.all(50),
child: Center(
child: LayoutBuilder(
builder: (context, constraints) {
return SizedBox(
width: double.parse(constraints.maxWidth > ResponsivePolicy.md ?
ResponsivePolicy.md.toString() :
constraints.maxWidth.toString()),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SizedBox(height: 75),
Column(
children: [
Text(
'We\'ve successfully collected your funds. We are now '
'updating your billing account. This won\'t take long',
style: TextStyle(fontSize: 20),
textAlign: TextAlign.center,
),
SizedBox(height: 50,),
Image.asset('assets/velocity-animation.gif', width: 150),
SizedBox(height: 50),
if(controller.model.status == 'FAILED')
Column(
children: [
Text(
'We failed to update your billing account',
style: TextStyle(fontSize: 20),
textAlign: TextAlign.center,
),
SizedBox(height: 20,),
Skeletonizer(
enabled: controller.model.isLoading,
child: OutlinedButton(
child: Text('Retry'),
onPressed: () {
controller.doIntegration();
},
),
),
],
),
],
),
],
),
);
}
),
),
return StepLoadingWidget(
currentStep: 2,
title: 'Updating Account',
subtitle:
'We\'ve successfully collected your funds. We are now '
'updating your billing account. This won\'t take long.',
status: controller.model.status,
isLoading: controller.model.isLoading,
errorMessage: 'We failed to update your billing account',
onRetry: () {
controller.doIntegration();
},
);
},
),