Payment Error Message and Beneficiary Page

This commit is contained in:
2025-08-11 17:03:02 +05:30
parent e7bbab13ba
commit 8ae26e2f18
16 changed files with 111 additions and 47 deletions

View File

@@ -21,8 +21,8 @@ class NeftService {
throw Exception(
'NEFT transaction failed with status code: ${response.statusCode}');
}
} on DioException catch (e) {
throw Exception('Failed to process NEFT transaction: ${e.message}');
} on DioException {
rethrow;
} catch (e) {
throw Exception('An unexpected error occurred: ${e.toString()}');
}

View File

@@ -22,8 +22,8 @@ class RtgsService {
throw Exception(
'RTGS transaction failed with status code: ${response.statusCode}');
}
} on DioException catch (e) {
throw Exception('Failed to process RTGS transaction: ${e.message}');
} on DioException {
rethrow ;
} catch (e) {
throw Exception('An unexpected error occurred: ${e.toString()}');
}

View File

@@ -15,7 +15,6 @@ import 'features/auth/screens/welcome_screen.dart';
import 'features/auth/screens/login_screen.dart';
import 'features/service/screens/service_screen.dart';
import 'features/dashboard/screens/dashboard_screen.dart';
import 'config/themes.dart';
import 'features/auth/screens/mpin_screen.dart';
import 'package:local_auth/local_auth.dart';
import 'package:shared_preferences/shared_preferences.dart';

View File

@@ -1,10 +1,9 @@
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_svg/svg.dart';
import 'package:kmobile/api/services/beneficiary_service.dart';
import 'package:kmobile/data/models/ifsc.dart';
import 'package:kmobile/data/models/beneficiary.dart';
import 'package:kmobile/data/models/user.dart';
import 'beneficiary_result_page.dart';
import 'package:material_symbols_icons/material_symbols_icons.dart';
import '../../../di/injection.dart';
@@ -36,12 +35,11 @@ class _AddBeneficiaryScreen extends State<AddBeneficiaryScreen> {
final TextEditingController phoneController = TextEditingController();
final service = getIt<BeneficiaryService>();
String? _beneficiaryName;
bool _isValidating = false;
bool _isBeneficiaryValidated = false;
// ignore: unused_field
String? _validationError;
late String accountType;
final String _selectedAccountType = 'Savings'; // default value
@override
void initState() {
@@ -335,6 +333,10 @@ class _AddBeneficiaryScreen extends State<AddBeneficiaryScreen> {
// 🔹 IFSC Code Field
TextFormField(
controller: ifscController,
maxLength: 11,
inputFormatters: [
LengthLimitingTextInputFormatter(11),
],
decoration: InputDecoration(
labelText: AppLocalizations.of(context).ifscCode,
border: const OutlineInputBorder(),

View File

@@ -61,13 +61,20 @@ class _ManageBeneficiariesScreen extends State<ManageBeneficiariesScreen> {
}
Widget _getBankLogo(String? bankName) {
if (bankName != null && bankName.toLowerCase().contains('state bank of india')) {
if (bankName != null && bankName.toLowerCase().contains('state bank')) {
return Image.asset(
'assets/images/sbi_logo.png',
width: 40,
height: 40,
);
}
if (bankName != null && bankName.toLowerCase().contains('kangra central')) {
return Image.asset(
'assets/images/icon.png',
width: 40,
height: 40,
);
}
if (bankName != null && bankName.toLowerCase().contains('hdfc bank ltd')) {
return Image.asset(
'assets/images/hdfc_logo.png',
@@ -113,11 +120,11 @@ class _ManageBeneficiariesScreen extends State<ManageBeneficiariesScreen> {
backgroundColor: Colors.transparent,
child: _getBankLogo(item.bankName),
),
title: Text(item.name ?? 'Unknown'),
title: Text(item.name),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(item.accountNo ?? 'No account number'),
Text(item.accountNo),
if (item.bankName != null && item.bankName!.isNotEmpty)
Text(
item.bankName!,

View File

@@ -1,7 +1,8 @@
import 'dart:async';
import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:kmobile/api/services/neft_service.dart';
import 'package:kmobile/api/services/rtgs_service.dart';
import 'package:kmobile/data/models/beneficiary.dart';
@@ -119,10 +120,28 @@ class _FundTransferAmountScreenState extends State<FundTransferAmountScreen> {
utr: neftResponse.utr,
);
completer.complete(paymentResponse);
} on DioException catch(e) {
print('dio exception');
print(e.toString());
final error = jsonDecode(e.response.toString())['error'];
var errorMessage =
{
"INCORRECT_TPIN" : "Please Enter the correct TPIN",
"INSUFFICIENT_FUNDS": "Your account does not have sufficient balance"
}[error] ?? "Something Went Wrong";
final paymentResponse = PaymentResponse(
isSuccess: false,
errorMessage: errorMessage,
);
completer.complete(paymentResponse);
} catch (e) {
print('generic exception');
print(e.toString());
final paymentResponse = PaymentResponse(
isSuccess: false,
errorMessage: e.toString(),
errorMessage: "Something went Wrong",
);
completer.complete(paymentResponse);
}
@@ -158,10 +177,28 @@ class _FundTransferAmountScreenState extends State<FundTransferAmountScreen> {
utr: rtgsResponse.utr,
);
completer.complete(paymentResponse);
} on DioException catch(e) {
print('dio exception');
print(e.toString());
final error = jsonDecode(e.response.toString())['error'];
var errorMessage =
{
"INCORRECT_TPIN" : "Please Enter the correct TPIN",
"INSUFFICIENT_FUNDS": "Your account does not have sufficient balance"
}[error] ?? "Something Went Wrong";
final paymentResponse = PaymentResponse(
isSuccess: false,
errorMessage: errorMessage,
);
completer.complete(paymentResponse);
} catch (e) {
print('generic exception');
print(e.toString());
final paymentResponse = PaymentResponse(
isSuccess: false,
errorMessage: e.toString(),
errorMessage: "Something went Wrong",
);
completer.complete(paymentResponse);
}

View File

@@ -154,12 +154,19 @@ class _FundTransferBeneficiaryScreenState
}
Widget _getBankLogo(String? bankName) {
if (bankName != null && bankName.toLowerCase().contains('state bank of india')) {
if (bankName != null && bankName.toLowerCase().contains('state bank ')) {
return Image.asset(
'assets/images/sbi_logo.png',
width: 40,
height: 40,
);
}
if (bankName != null && bankName.toLowerCase().contains('kangra central')) {
return Image.asset(
'assets/images/icon.png',
width: 40,
height: 40,
);
}
if (bankName != null && bankName.toLowerCase().contains('hdfc bank ltd')) {
return Image.asset(

View File

@@ -397,9 +397,8 @@ class _PaymentAnimationScreenState extends State<PaymentAnimationScreen> {
),
const SizedBox(height: 16),
if (response.errorMessage != null)
Text(
response.errorMessage!,
style: const TextStyle(fontSize: 16),
Text(response.errorMessage ?? '',
style: TextStyle(fontSize: 16),
),
],
),

View File

@@ -21,28 +21,6 @@ class PreferenceScreen extends StatelessWidget {
builder: (context, state) {
return ListView(
children: [
// Theme Mode Switch (Light/Dark)
// ListTile(
// leading: const Icon(Icons.brightness_6),
// title: const Text("Theme Mode"),
// trailing: Switch(
// value: state.isDarkMode,
// onChanged: (val) {
// context.read<ThemeCubit>().toggleDarkMode(val);
// },
// ),
// ),
//Color_Theme_Selection
ListTile(
leading: const Icon(Icons.color_lens),
title: Text(AppLocalizations.of(context).themeColor),
onTap: () {
showDialog(
context: context,
builder: (_) => const ColorThemeDialog(),
);
}
),
// Language Selection
ListTile(
leading: const Icon(Icons.language),
@@ -54,7 +32,31 @@ class PreferenceScreen extends StatelessWidget {
);
},
),
],
//Theme Mode Switch (Light/Dark)
ListTile(
leading: const Icon(Icons.brightness_6),
title: Text(AppLocalizations.of(context).themeMode),
enabled: false,
//trailing: Switch(
// value: state.isDarkMode,
// onChanged: (val) {
// context.read<ThemeCubit>().toggleDarkMode(val);
// },
//),
),
//Color_Theme_Selection
ListTile(
leading: const Icon(Icons.color_lens),
title: Text(AppLocalizations.of(context).themeColor),
enabled: false,
onTap: () {
showDialog(
context: context,
builder: (_) => const ColorThemeDialog(),
);
}
),
],
);
},
),

View File

@@ -1,5 +1,4 @@
import 'dart:async';
import 'package:dio/dio.dart';
import 'package:kmobile/api/services/neft_service.dart';
import 'package:kmobile/api/services/rtgs_service.dart';
import 'package:kmobile/data/models/neft_transaction.dart';

View File

@@ -4,14 +4,12 @@ import 'package:flutter_svg/svg.dart';
import 'package:flutter_swipe_button/flutter_swipe_button.dart';
import 'package:kmobile/api/services/beneficiary_service.dart';
import 'package:kmobile/api/services/payment_service.dart';
import 'package:kmobile/data/models/payment_response.dart';
import 'package:kmobile/data/models/transfer.dart';
import 'package:kmobile/di/injection.dart';
import 'package:kmobile/features/fund_transfer/screens/payment_animation.dart';
import 'package:material_symbols_icons/material_symbols_icons.dart';
import '../../../l10n/app_localizations.dart';
import '../../fund_transfer/screens/transaction_pin_screen.dart';
//import 'package:flutter_neumorphic/flutter_neumorphic.dart';
class QuickPayWithinBankScreen extends StatefulWidget {
final String debitAccount;

View File

@@ -230,6 +230,7 @@
"beneficiaryAdditionFailed": "Beneficiary Addition Failed",
"noBeneficiaryFound": "No beneficiaries found",
"beneficiaryName": "Beneficiary Name",
"validateBeneficiary": "Validate Beneficiary"
"validateBeneficiary": "Validate Beneficiary",
"themeMode": "Theme Mode"
}

View File

@@ -230,5 +230,6 @@
"beneficiaryAdditionFailed": "लाभार्थी जोड़ने में विफल",
"noBeneficiaryFound": "कोई लाभार्थी नहीं मिला",
"beneficiaryName": "लाभार्थी नाम",
"validateBeneficiary": "लाभार्थी को सत्यापित करें"
"validateBeneficiary": "लाभार्थी को सत्यापित करें",
"themeMode": "थीम मोड"
}

View File

@@ -1408,6 +1408,12 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'Validate Beneficiary'**
String get validateBeneficiary;
/// No description provided for @themeMode.
///
/// In en, this message translates to:
/// **'Theme Mode'**
String get themeMode;
}
class _AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> {

View File

@@ -664,4 +664,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get validateBeneficiary => 'Validate Beneficiary';
@override
String get themeMode => 'Theme Mode';
}

View File

@@ -664,4 +664,7 @@ class AppLocalizationsHi extends AppLocalizations {
@override
String get validateBeneficiary => 'लाभार्थी को सत्यापित करें';
@override
String get themeMode => 'थीम मोड';
}