From 39e7a02ca53090109f8ce412013402856ba05991 Mon Sep 17 00:00:00 2001 From: Nilanjan Chakrabarti Date: Mon, 13 Oct 2025 14:59:00 +0530 Subject: [PATCH] Daily Transaction Limit #2 --- .../screens/daily_transaction_limit.dart | 152 +++++++++++++++++- lib/l10n/app_en.arb | 9 +- lib/l10n/app_hi.arb | 11 +- 3 files changed, 161 insertions(+), 11 deletions(-) diff --git a/lib/features/service/screens/daily_transaction_limit.dart b/lib/features/service/screens/daily_transaction_limit.dart index 0f1d950..5f150a8 100644 --- a/lib/features/service/screens/daily_transaction_limit.dart +++ b/lib/features/service/screens/daily_transaction_limit.dart @@ -1,25 +1,161 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:kmobile/l10n/app_localizations.dart'; +import 'package:intl/intl.dart'; class DailyLimitScreen extends StatefulWidget { const DailyLimitScreen({super.key}); - @override State createState() => _DailyLimitScreenState(); } class _DailyLimitScreenState extends State { + double? _currentLimit; + final _limitController = TextEditingController(); + @override void initState() { super.initState(); + // Now just taking null, but for real time limit will be fetched using API call + _currentLimit = null; } - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(AppLocalizations.of(context).dailylimit), - ), - ); + @override + void dispose() { + _limitController.dispose(); + super.dispose(); + } + + Future _showAddOrEditLimitDialog() async { + _limitController.text = _currentLimit?.toStringAsFixed(0) ?? ''; + final newLimit = await showDialog( + context: context, + builder: (context) { + final localizations = AppLocalizations.of(context); + return AlertDialog( + title: Text( + _currentLimit == null + ? localizations.addLimit + : localizations.editLimit, + ), + content: TextField( + controller: _limitController, + autofocus: true, + keyboardType: TextInputType.number, + inputFormatters: [ + FilteringTextInputFormatter.allow(RegExp(r'^\d+')), + ], + decoration: InputDecoration( + labelText: localizations.limitAmount, + prefixText: '₹', + border: const OutlineInputBorder(), + ), + ), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: Text(localizations.cancel), + ), + ElevatedButton( + onPressed: () { + final value = double.tryParse(_limitController.text); + if (value != null && value > 0) { + Navigator.of(context).pop(value); + } + }, + child: Text(localizations.save), + ), + ], + ); + }, + ); + if (newLimit != null) { + setState(() { + _currentLimit = newLimit; + }); } +} + + void _removeLimit() { + setState(() { + _currentLimit = null; + }); + } + + @override + Widget build(BuildContext context) { + final localizations = AppLocalizations.of(context); + final theme = Theme.of(context); + final formatCurrency = NumberFormat.currency(locale: 'en_IN', symbol: '₹'); + return Scaffold( + appBar: AppBar( + title: Text(localizations.dailylimit), + ), + body: Center( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + localizations.currentDailyLimit, + style: theme.textTheme.headlineSmall?.copyWith( + color: theme.colorScheme.onSurface.withOpacity(0.7), + ), + ), + const SizedBox(height: 16), + Text( + _currentLimit == null + ? localizations.noLimitSet + : formatCurrency.format(_currentLimit), + style: theme.textTheme.headlineMedium?.copyWith( + fontWeight: FontWeight.bold, + color: _currentLimit == null + ? theme.colorScheme.secondary + : theme.colorScheme.primary, + ), + ), + const SizedBox(height: 48), + if (_currentLimit == null) + ElevatedButton.icon( + onPressed: _showAddOrEditLimitDialog, + icon: const Icon(Icons.add_circle_outline), + label: Text(localizations.addLimit), + style: ElevatedButton.styleFrom( + padding: const EdgeInsets.symmetric( + horizontal: 24, vertical: 12), + textStyle: theme.textTheme.titleMedium, + ), + ) + else + Column( + children: [ + ElevatedButton.icon( + onPressed: _showAddOrEditLimitDialog, + icon: const Icon(Icons.edit_outlined), + label: Text(localizations.editLimit), + style: ElevatedButton.styleFrom( + padding: const EdgeInsets.symmetric( + horizontal: 24, vertical: 12), + textStyle: theme.textTheme.titleMedium, + ), + ), + const SizedBox(height: 16), + TextButton.icon( + onPressed: _removeLimit, + icon: const Icon(Icons.remove_circle_outline), + label: Text(localizations.removeLimit), + style: TextButton.styleFrom( + foregroundColor: theme.colorScheme.error, + ), + ), + ], + ), + ], + ), + ), + ), + ); + } } \ No newline at end of file diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index b283652..59bb816 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -319,5 +319,12 @@ "faq": "Frequently Asked Questions(FAQs)", "branches": "Branches", "atms": "ATMs", - "dailylimit": "Daily Transaction Limit" + "dailylimit": "Daily Transaction Limit", + "currentDailyLimit": "Current Daily Limit", + "noLimitSet": "No Limit Set", + "addLimit": "Add Limit", + "editLimit": "Edit Limit", + "removeLimit": "Remove Limit", + "limitAmount": "Limit Amount", + "save": "Save" } diff --git a/lib/l10n/app_hi.arb b/lib/l10n/app_hi.arb index 9466b38..559f0d1 100644 --- a/lib/l10n/app_hi.arb +++ b/lib/l10n/app_hi.arb @@ -318,7 +318,14 @@ "remarks": "विचार (अनिवार्य नहीं)", "kccbMobile": "केसीसीबी मोबाइल", "faq": "अक्सर पूछे जाने वाले प्रश्न", -"branches": "शाखाओं", + "branches": "शाखाओं", "atms": "एटीएम", - "dailylimit": "दैनिक लेनदेन सीमा" + "dailylimit": "दैनिक लेनदेन सीमा", + "currentDailyLimit": "वर्तमान दैनिक सीमा", + "noLimitSet": "कोई सीमा निर्धारित नहीं", + "addLimit": "सीमा जोड़ें", + "editLimit": "सीमा संपादित करें", + "removeLimit": "सीमा हटाएँ", + "limitAmount": "सीमा राशि", + "save": "जमा करें" }