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

@@ -90,24 +90,26 @@ class _FundTransferBeneficiaryScreen
import 'package:flutter/material.dart';
import 'package:kmobile/data/models/beneficiary.dart';
//import 'package:kmobile/features/beneficiaries/screens/add_beneficiary_screen.dart';
import 'package:kmobile/features/fund_transfer/screens/fund_transfer_amount_screen.dart';
import '../../../l10n/app_localizations.dart';
import '../../../di/injection.dart';
import 'package:kmobile/api/services/beneficiary_service.dart';
import 'package:shimmer/shimmer.dart';
class FundTransferBeneficiaryScreen extends StatefulWidget {
const FundTransferBeneficiaryScreen({super.key});
final String creditAccountNo;
final String remitterName;
const FundTransferBeneficiaryScreen(
{super.key, required this.creditAccountNo, required this.remitterName});
@override
State<FundTransferBeneficiaryScreen> createState() =>
_ManageBeneficiariesScreen();
_FundTransferBeneficiaryScreenState();
}
class _ManageBeneficiariesScreen extends State<FundTransferBeneficiaryScreen> {
class _FundTransferBeneficiaryScreenState
extends State<FundTransferBeneficiaryScreen> {
var service = getIt<BeneficiaryService>();
//final BeneficiaryService _service = BeneficiaryService();
bool _isLoading = true;
List<Beneficiary> _beneficiaries = [];
@@ -120,7 +122,7 @@ class _ManageBeneficiariesScreen extends State<FundTransferBeneficiaryScreen> {
Future<void> _loadBeneficiaries() async {
final data = await service.fetchBeneficiaryList();
setState(() {
_beneficiaries = data ;
_beneficiaries = data;
_isLoading = false;
});
}
@@ -132,7 +134,7 @@ class _ManageBeneficiariesScreen extends State<FundTransferBeneficiaryScreen> {
baseColor: Colors.grey.shade300,
highlightColor: Colors.grey.shade100,
child: ListTile(
leading: CircleAvatar(
leading: const CircleAvatar(
radius: 24,
backgroundColor: Colors.white,
),
@@ -151,27 +153,61 @@ class _ManageBeneficiariesScreen extends State<FundTransferBeneficiaryScreen> {
);
}
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,
itemBuilder: (context, index) {
final item = _beneficiaries[index];
final beneficiary = _beneficiaries[index];
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(beneficiary.bankName),
),
title: Text(item.name ?? 'Unknown'),
subtitle: Text(item.accountNo ?? 'No account number'),
title: Text(beneficiary.name),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(beneficiary.accountNo),
if (beneficiary.bankName != null && beneficiary.bankName!.isNotEmpty)
Text(
beneficiary.bankName!,
style: TextStyle(fontSize: 12, color: Colors.grey[600]),
),
],
),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => FundTransferAmountScreen(
debitAccountNo: widget.creditAccountNo,
creditBeneficiary: beneficiary,
remitterName: widget.remitterName,
),
),
);
},
);
},
);