feat: Implement major features and fix theming bug

This commit introduces several new features and a critical bug fix.

- Implemented a full "Quick Pay" flow for both within and outside the bank, including IFSC validation, beneficiary verification, and a TPIN-based payment process.
- Added a date range filter to the Account Statement screen and streamlined the UI by removing the amount filters.
- Fixed a major bug that prevented dynamic theme changes from being applied. The app now correctly switches between color themes.
- Refactored and improved beneficiary management, transaction models, and the fund transfer flow to support NEFT/RTGS.
This commit is contained in:
asif
2025-08-11 04:06:05 +05:30
parent 3024ddef15
commit f91d0f739b
34 changed files with 1638 additions and 911 deletions

View File

@@ -1,18 +1,14 @@
import 'package:flutter/material.dart';
import 'package:kmobile/data/models/beneficiary.dart';
import 'package:kmobile/features/beneficiaries/screens/add_beneficiary_screen.dart';
import '../../../data/models/user.dart';
import '../../../l10n/app_localizations.dart';
import '../../../di/injection.dart';
import 'package:kmobile/api/services/beneficiary_service.dart';
import 'package:shimmer/shimmer.dart';
//import 'package:kmobile/data/models/user.dart';
class ManageBeneficiariesScreen extends StatefulWidget {
// final List<User> users;
// final int selectedIndex;
const ManageBeneficiariesScreen({super.key});
final String customerName;
const ManageBeneficiariesScreen({super.key, required this.customerName});
@override
State<ManageBeneficiariesScreen> createState() =>
@@ -21,12 +17,8 @@ class ManageBeneficiariesScreen extends StatefulWidget {
class _ManageBeneficiariesScreen extends State<ManageBeneficiariesScreen> {
var service = getIt<BeneficiaryService>();
// late User selectedUser = widget.users[widget.selectedIndex];
//final BeneficiaryService _service = BeneficiaryService();
bool _isLoading = true;
int selectedAccountIndex = 0;
List<Beneficiary> _beneficiaries = [];
@override
void initState() {
@@ -37,7 +29,7 @@ class _ManageBeneficiariesScreen extends State<ManageBeneficiariesScreen> {
Future<void> _loadBeneficiaries() async {
final data = await service.fetchBeneficiaryList();
setState(() {
_beneficiaries = data ;
_beneficiaries = data;
_isLoading = false;
});
}
@@ -68,9 +60,26 @@ class _ManageBeneficiariesScreen extends State<ManageBeneficiariesScreen> {
);
}
Widget _getBankLogo(String? bankName) {
if (bankName != null && bankName.toLowerCase().contains('state bank of india')) {
return Image.asset(
'assets/images/sbi_logo.png',
width: 40,
height: 40,
);
} else {
return const Icon(
Icons.account_balance,
size: 40,
color: Colors.grey,
);
}
}
Widget _buildBeneficiaryList() {
if (_beneficiaries.isEmpty) {
return Center(child: Text(AppLocalizations.of(context).noBeneficiaryFound));
return Center(
child: Text(AppLocalizations.of(context).noBeneficiaryFound));
}
return ListView.builder(
itemCount: _beneficiaries.length,
@@ -79,16 +88,21 @@ class _ManageBeneficiariesScreen extends State<ManageBeneficiariesScreen> {
return ListTile(
leading: CircleAvatar(
radius: 24,
backgroundColor: Theme.of(context).primaryColor.withOpacity(0.2),
child: Text(
item.name.isNotEmpty
? item.name[0].toUpperCase()
: '?',
style: const TextStyle(fontWeight: FontWeight.bold),
),
backgroundColor: Colors.transparent,
child: _getBankLogo(item.bankName),
),
title: Text(item.name ?? 'Unknown'),
subtitle: Text(item.accountNo ?? 'No account number'),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(item.accountNo ?? 'No account number'),
if (item.bankName != null && item.bankName!.isNotEmpty)
Text(
item.bankName!,
style: TextStyle(fontSize: 12, color: Colors.grey[600]),
),
],
),
);
},
);
@@ -96,6 +110,7 @@ class _ManageBeneficiariesScreen extends State<ManageBeneficiariesScreen> {
@override
Widget build(BuildContext context) {
String customerName = widget.customerName;
return Scaffold(
appBar: AppBar(
title: Text(AppLocalizations.of(context).beneficiaries),
@@ -108,7 +123,8 @@ class _ManageBeneficiariesScreen extends State<ManageBeneficiariesScreen> {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => AddBeneficiaryScreen(),
builder: (context) =>
AddBeneficiaryScreen(customerName: customerName),
),
);
},
@@ -120,4 +136,4 @@ class _ManageBeneficiariesScreen extends State<ManageBeneficiariesScreen> {
),
);
}
}
}