Snackbar added in amount screens
This commit is contained in:
@@ -2,6 +2,8 @@ import 'dart:async';
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'package:dio/dio.dart';
|
import 'package:dio/dio.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:kmobile/api/services/limit_service.dart';
|
||||||
import 'package:kmobile/api/services/neft_service.dart';
|
import 'package:kmobile/api/services/neft_service.dart';
|
||||||
import 'package:kmobile/api/services/rtgs_service.dart';
|
import 'package:kmobile/api/services/rtgs_service.dart';
|
||||||
import 'package:kmobile/api/services/imps_service.dart';
|
import 'package:kmobile/api/services/imps_service.dart';
|
||||||
@@ -40,13 +42,59 @@ class FundTransferAmountScreen extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _FundTransferAmountScreenState extends State<FundTransferAmountScreen> {
|
class _FundTransferAmountScreenState extends State<FundTransferAmountScreen> {
|
||||||
|
final _limitService = getIt<LimitService>();
|
||||||
|
Limit? _limit;
|
||||||
|
bool _isLoadingLimit = true;
|
||||||
|
final _formatCurrency = NumberFormat.currency(locale: 'en_IN', symbol: '₹');
|
||||||
final _amountController = TextEditingController();
|
final _amountController = TextEditingController();
|
||||||
final _remarksController = TextEditingController();
|
final _remarksController = TextEditingController();
|
||||||
final _formKey = GlobalKey<FormState>();
|
final _formKey = GlobalKey<FormState>();
|
||||||
TransactionMode _selectedMode = TransactionMode.neft;
|
TransactionMode _selectedMode = TransactionMode.neft;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_loadLimit(); // Call the new method
|
||||||
|
_amountController.addListener(_checkAmountLimit);
|
||||||
|
}
|
||||||
|
Future<void> _loadLimit() async {
|
||||||
|
setState(() {
|
||||||
|
_isLoadingLimit = true;
|
||||||
|
});
|
||||||
|
try {
|
||||||
|
final limitData = await _limitService.getLimit();
|
||||||
|
setState(() {
|
||||||
|
_limit = limitData;
|
||||||
|
_isLoadingLimit = false;
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
// Handle error if needed
|
||||||
|
setState(() {
|
||||||
|
_isLoadingLimit = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add this method to check the amount against the limit
|
||||||
|
void _checkAmountLimit() {
|
||||||
|
if (_limit == null) return;
|
||||||
|
|
||||||
|
final amount = double.tryParse(_amountController.text) ?? 0;
|
||||||
|
final remainingLimit = _limit!.dailyLimit - _limit!.usedLimit;
|
||||||
|
|
||||||
|
if (amount > remainingLimit) {
|
||||||
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
|
SnackBar(
|
||||||
|
content: Text('Amount exceeds remaining daily limit of ${_formatCurrency.format(remainingLimit)}'),
|
||||||
|
backgroundColor: Colors.red,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
|
_amountController.removeListener(_checkAmountLimit);
|
||||||
_amountController.dispose();
|
_amountController.dispose();
|
||||||
_remarksController.dispose();
|
_remarksController.dispose();
|
||||||
super.dispose();
|
super.dispose();
|
||||||
@@ -429,6 +477,14 @@ class _FundTransferAmountScreenState extends State<FundTransferAmountScreen> {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8),
|
||||||
|
if (_isLoadingLimit)
|
||||||
|
const Text('Fetching daily limit...'),
|
||||||
|
if (!_isLoadingLimit && _limit != null)
|
||||||
|
Text(
|
||||||
|
'Remaining Daily Limit: ${_formatCurrency.format(_limit!.dailyLimit - _limit!.usedLimit)}',
|
||||||
|
style: Theme.of(context).textTheme.bodySmall,
|
||||||
),
|
),
|
||||||
const Spacer(),
|
const Spacer(),
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,9 @@ import 'dart:async';
|
|||||||
import 'dart:developer';
|
import 'dart:developer';
|
||||||
import 'package:dio/dio.dart';
|
import 'package:dio/dio.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
import 'package:kmobile/api/services/imps_service.dart';
|
import 'package:kmobile/api/services/imps_service.dart';
|
||||||
|
import 'package:kmobile/api/services/limit_service.dart';
|
||||||
import 'package:kmobile/api/services/neft_service.dart';
|
import 'package:kmobile/api/services/neft_service.dart';
|
||||||
import 'package:kmobile/api/services/rtgs_service.dart';
|
import 'package:kmobile/api/services/rtgs_service.dart';
|
||||||
import 'package:kmobile/data/models/imps_transaction.dart';
|
import 'package:kmobile/data/models/imps_transaction.dart';
|
||||||
@@ -28,7 +30,10 @@ class QuickPayOutsideBankScreen extends StatefulWidget {
|
|||||||
|
|
||||||
class _QuickPayOutsideBankScreen extends State<QuickPayOutsideBankScreen> {
|
class _QuickPayOutsideBankScreen extends State<QuickPayOutsideBankScreen> {
|
||||||
final _formKey = GlobalKey<FormState>();
|
final _formKey = GlobalKey<FormState>();
|
||||||
|
final _limitService = getIt<LimitService>();
|
||||||
|
Limit? _limit;
|
||||||
|
bool _isLoadingLimit = true;
|
||||||
|
final _formatCurrency = NumberFormat.currency(locale: 'en_IN', symbol: '₹');
|
||||||
// Controllers
|
// Controllers
|
||||||
final accountNumberController = TextEditingController();
|
final accountNumberController = TextEditingController();
|
||||||
final confirmAccountNumberController = TextEditingController();
|
final confirmAccountNumberController = TextEditingController();
|
||||||
@@ -50,6 +55,7 @@ class _QuickPayOutsideBankScreen extends State<QuickPayOutsideBankScreen> {
|
|||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
|
_loadLimit();
|
||||||
_ifscFocusNode.addListener(() {
|
_ifscFocusNode.addListener(() {
|
||||||
if (!_ifscFocusNode.hasFocus && ifscController.text.trim().length == 11) {
|
if (!_ifscFocusNode.hasFocus && ifscController.text.trim().length == 11) {
|
||||||
_validateIFSC();
|
_validateIFSC();
|
||||||
@@ -60,8 +66,44 @@ class _QuickPayOutsideBankScreen extends State<QuickPayOutsideBankScreen> {
|
|||||||
accountType = 'Savings';
|
accountType = 'Savings';
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
amountController.addListener(_checkAmountLimit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> _loadLimit() async {
|
||||||
|
setState(() {
|
||||||
|
_isLoadingLimit = true;
|
||||||
|
});
|
||||||
|
try {
|
||||||
|
final limitData = await _limitService.getLimit();
|
||||||
|
setState(() {
|
||||||
|
_limit = limitData;
|
||||||
|
_isLoadingLimit = false;
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
// Handle error if needed
|
||||||
|
setState(() {
|
||||||
|
_isLoadingLimit = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add this method to check the amount against the limit
|
||||||
|
void _checkAmountLimit() {
|
||||||
|
if (_limit == null) return;
|
||||||
|
|
||||||
|
final amount = double.tryParse(amountController.text) ?? 0;
|
||||||
|
final remainingLimit = _limit!.dailyLimit - _limit!.usedLimit;
|
||||||
|
|
||||||
|
if (amount > remainingLimit) {
|
||||||
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
|
SnackBar(
|
||||||
|
content: Text('Amount exceeds remaining daily limit of ${_formatCurrency.format(remainingLimit)}'),
|
||||||
|
backgroundColor: Colors.red,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void _validateIFSC() async {
|
void _validateIFSC() async {
|
||||||
final ifsc = ifscController.text.trim().toUpperCase();
|
final ifsc = ifscController.text.trim().toUpperCase();
|
||||||
if (ifsc.isEmpty) return;
|
if (ifsc.isEmpty) return;
|
||||||
@@ -718,6 +760,9 @@ class _QuickPayOutsideBankScreen extends State<QuickPayOutsideBankScreen> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 25),
|
const SizedBox(height: 25),
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
Expanded(
|
Expanded(
|
||||||
@@ -782,6 +827,22 @@ class _QuickPayOutsideBankScreen extends State<QuickPayOutsideBankScreen> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8),
|
||||||
|
if (_isLoadingLimit)
|
||||||
|
const Padding(
|
||||||
|
padding: EdgeInsets.only(left: 8.0),
|
||||||
|
child: Text('Fetching daily limit...'),
|
||||||
|
),
|
||||||
|
if (!_isLoadingLimit && _limit != null)
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 8.0),
|
||||||
|
child: Text(
|
||||||
|
'Remaining Daily Limit: ${_formatCurrency.format(_limit!.dailyLimit - _limit!.usedLimit)}',
|
||||||
|
style: Theme.of(context).textTheme.bodySmall,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 30),
|
const SizedBox(height: 30),
|
||||||
Row(
|
Row(
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_swipe_button/flutter_swipe_button.dart';
|
import 'package:flutter_swipe_button/flutter_swipe_button.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
import 'package:kmobile/api/services/beneficiary_service.dart';
|
import 'package:kmobile/api/services/beneficiary_service.dart';
|
||||||
|
import 'package:kmobile/api/services/limit_service.dart';
|
||||||
import 'package:kmobile/api/services/payment_service.dart';
|
import 'package:kmobile/api/services/payment_service.dart';
|
||||||
import 'package:kmobile/data/models/transfer.dart';
|
import 'package:kmobile/data/models/transfer.dart';
|
||||||
import 'package:kmobile/di/injection.dart';
|
import 'package:kmobile/di/injection.dart';
|
||||||
@@ -19,7 +21,10 @@ class QuickPayWithinBankScreen extends StatefulWidget {
|
|||||||
|
|
||||||
class _QuickPayWithinBankScreen extends State<QuickPayWithinBankScreen> {
|
class _QuickPayWithinBankScreen extends State<QuickPayWithinBankScreen> {
|
||||||
final _formKey = GlobalKey<FormState>();
|
final _formKey = GlobalKey<FormState>();
|
||||||
|
final _limitService = getIt<LimitService>();
|
||||||
|
Limit? _limit;
|
||||||
|
bool _isLoadingLimit = true;
|
||||||
|
final _formatCurrency = NumberFormat.currency(locale: 'en_IN', symbol: '₹');
|
||||||
final TextEditingController accountNumberController = TextEditingController();
|
final TextEditingController accountNumberController = TextEditingController();
|
||||||
final TextEditingController confirmAccountNumberController =
|
final TextEditingController confirmAccountNumberController =
|
||||||
TextEditingController();
|
TextEditingController();
|
||||||
@@ -35,10 +40,45 @@ class _QuickPayWithinBankScreen extends State<QuickPayWithinBankScreen> {
|
|||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
|
_loadLimit();
|
||||||
accountNumberController.addListener(_resetBeneficiaryValidation);
|
accountNumberController.addListener(_resetBeneficiaryValidation);
|
||||||
confirmAccountNumberController.addListener(_resetBeneficiaryValidation);
|
confirmAccountNumberController.addListener(_resetBeneficiaryValidation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> _loadLimit() async {
|
||||||
|
setState(() {
|
||||||
|
_isLoadingLimit = true;
|
||||||
|
});
|
||||||
|
try {
|
||||||
|
final limitData = await _limitService.getLimit();
|
||||||
|
setState(() {
|
||||||
|
_limit = limitData;
|
||||||
|
_isLoadingLimit = false;
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
// Handle error if needed
|
||||||
|
setState(() {
|
||||||
|
_isLoadingLimit = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _checkAmountLimit() {
|
||||||
|
if (_limit == null) return;
|
||||||
|
|
||||||
|
final amount = double.tryParse(amountController.text) ?? 0;
|
||||||
|
final remainingLimit = _limit!.dailyLimit - _limit!.usedLimit;
|
||||||
|
|
||||||
|
if (amount > remainingLimit) {
|
||||||
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
|
SnackBar(
|
||||||
|
content: Text('Amount exceeds remaining daily limit of ${_formatCurrency.format(remainingLimit)}'),
|
||||||
|
backgroundColor: Colors.red,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void _resetBeneficiaryValidation() {
|
void _resetBeneficiaryValidation() {
|
||||||
if (_isBeneficiaryValidated ||
|
if (_isBeneficiaryValidated ||
|
||||||
_beneficiaryName != null ||
|
_beneficiaryName != null ||
|
||||||
@@ -53,6 +93,7 @@ class _QuickPayWithinBankScreen extends State<QuickPayWithinBankScreen> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
|
amountController.removeListener(_checkAmountLimit);
|
||||||
accountNumberController.removeListener(_resetBeneficiaryValidation);
|
accountNumberController.removeListener(_resetBeneficiaryValidation);
|
||||||
confirmAccountNumberController.removeListener(_resetBeneficiaryValidation);
|
confirmAccountNumberController.removeListener(_resetBeneficiaryValidation);
|
||||||
accountNumberController.dispose();
|
accountNumberController.dispose();
|
||||||
@@ -102,6 +143,7 @@ class _QuickPayWithinBankScreen extends State<QuickPayWithinBankScreen> {
|
|||||||
padding: const EdgeInsets.all(16.0),
|
padding: const EdgeInsets.all(16.0),
|
||||||
child: Form(
|
child: Form(
|
||||||
key: _formKey,
|
key: _formKey,
|
||||||
|
child: SingleChildScrollView(
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
const SizedBox(height: 10),
|
const SizedBox(height: 10),
|
||||||
@@ -297,6 +339,7 @@ class _QuickPayWithinBankScreen extends State<QuickPayWithinBankScreen> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 25),
|
const SizedBox(height: 25),
|
||||||
|
|
||||||
TextFormField(
|
TextFormField(
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
labelText: AppLocalizations.of(context).amount,
|
labelText: AppLocalizations.of(context).amount,
|
||||||
@@ -326,6 +369,14 @@ class _QuickPayWithinBankScreen extends State<QuickPayWithinBankScreen> {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8),
|
||||||
|
if (_isLoadingLimit)
|
||||||
|
const Text('Fetching daily limit...'),
|
||||||
|
if (!_isLoadingLimit && _limit != null)
|
||||||
|
Text(
|
||||||
|
'Remaining Daily Limit: ${_formatCurrency.format(_limit!.dailyLimit - _limit!.usedLimit)}',
|
||||||
|
style: Theme.of(context).textTheme.bodySmall,
|
||||||
),
|
),
|
||||||
const SizedBox(height: 45),
|
const SizedBox(height: 45),
|
||||||
Align(
|
Align(
|
||||||
@@ -389,6 +440,7 @@ class _QuickPayWithinBankScreen extends State<QuickPayWithinBankScreen> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user