feat: integrate bank account addition with user input for bank name and success notification

This commit is contained in:
Achintha Isuru
2026-01-30 14:59:53 -05:00
parent 4ccc838371
commit 772d59a7dd
9 changed files with 65 additions and 13 deletions

View File

@@ -37,6 +37,7 @@ class BankAccountCubit extends Cubit<BankAccountState> {
}
Future<void> addAccount({
required String bankName,
required String routingNumber,
required String accountNumber,
required String type,
@@ -47,7 +48,7 @@ class BankAccountCubit extends Cubit<BankAccountState> {
final BankAccount newAccount = BankAccount(
id: '', // Generated by server usually
userId: '', // Handled by Repo/Auth
bankName: 'New Bank', // Mock
bankName: bankName,
accountNumber: accountNumber,
accountName: '',
sortCode: routingNumber,
@@ -63,6 +64,7 @@ class BankAccountCubit extends Cubit<BankAccountState> {
await loadAccounts();
emit(state.copyWith(
status: BankAccountStatus.accountAdded,
showForm: false, // Close form on success
));
} catch (e) {

View File

@@ -1,7 +1,7 @@
import 'package:equatable/equatable.dart';
import 'package:krow_domain/krow_domain.dart';
enum BankAccountStatus { initial, loading, loaded, error }
enum BankAccountStatus { initial, loading, loaded, error, accountAdded }
class BankAccountState extends Equatable {
final BankAccountStatus status;

View File

@@ -44,8 +44,23 @@ class BankAccountPage extends StatelessWidget {
child: Container(color: UiColors.border, height: 1.0),
),
),
body: BlocBuilder<BankAccountCubit, BankAccountState>(
body: BlocConsumer<BankAccountCubit, BankAccountState>(
bloc: cubit,
listener: (BuildContext context, BankAccountState state) {
if (state.status == BankAccountStatus.accountAdded) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
strings.account_added_success,
style: UiTypography.body2r.textPrimary,
),
backgroundColor: UiColors.tagSuccess,
behavior: SnackBarBehavior.floating,
duration: const Duration(seconds: 3),
),
);
}
},
builder: (BuildContext context, BankAccountState state) {
if (state.status == BankAccountStatus.loading && state.accounts.isEmpty) {
return const Center(child: CircularProgressIndicator());
@@ -96,8 +111,9 @@ class BankAccountPage extends StatelessWidget {
backgroundColor: Colors.transparent,
child: AddAccountForm(
strings: strings,
onSubmit: (String routing, String account, String type) {
onSubmit: (String bankName, String routing, String account, String type) {
cubit.addAccount(
bankName: bankName,
routingNumber: routing,
accountNumber: account,
type: type,

View File

@@ -5,7 +5,7 @@ import '../blocs/bank_account_cubit.dart';
class AddAccountForm extends StatefulWidget {
final dynamic strings;
final Function(String routing, String account, String type) onSubmit;
final Function(String bankName, String routing, String account, String type) onSubmit;
final VoidCallback onCancel;
const AddAccountForm({super.key, required this.strings, required this.onSubmit, required this.onCancel});
@@ -15,12 +15,14 @@ class AddAccountForm extends StatefulWidget {
}
class _AddAccountFormState extends State<AddAccountForm> {
final TextEditingController _bankNameController = TextEditingController();
final TextEditingController _routingController = TextEditingController();
final TextEditingController _accountController = TextEditingController();
String _selectedType = 'CHECKING';
@override
void dispose() {
_bankNameController.dispose();
_routingController.dispose();
_accountController.dispose();
super.dispose();
@@ -44,6 +46,13 @@ class _AddAccountFormState extends State<AddAccountForm> {
style: UiTypography.headline4m.copyWith(color: UiColors.textPrimary), // Was header4
),
const SizedBox(height: UiConstants.space4),
UiTextField(
label: widget.strings.bank_name,
hintText: widget.strings.bank_hint,
controller: _bankNameController,
keyboardType: TextInputType.text,
),
const SizedBox(height: UiConstants.space4),
UiTextField(
label: widget.strings.routing_number,
hintText: widget.strings.routing_hint,
@@ -90,6 +99,7 @@ class _AddAccountFormState extends State<AddAccountForm> {
text: widget.strings.save,
onPressed: () {
widget.onSubmit(
_bankNameController.text,
_routingController.text,
_accountController.text,
_selectedType,