From 4ccc838371ed2dac6c3f6fba8eaf988ecd54e3a5 Mon Sep 17 00:00:00 2001 From: Achintha Isuru Date: Fri, 30 Jan 2026 14:47:35 -0500 Subject: [PATCH] refactor: integrate email field with controller for dynamic updates in PersonalInfoForm --- .../presentation/pages/personal_info_page.dart | 5 ++--- .../widgets/personal_info_content.dart | 14 ++++++++++++++ .../widgets/personal_info_form.dart | 18 +++++++++++++++++- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/pages/personal_info_page.dart b/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/pages/personal_info_page.dart index dfc45d90..50fae0a9 100644 --- a/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/pages/personal_info_page.dart +++ b/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/pages/personal_info_page.dart @@ -1,12 +1,11 @@ +import 'package:core_localization/core_localization.dart'; +import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_modular/flutter_modular.dart'; -import 'package:core_localization/core_localization.dart'; -import 'package:design_system/design_system.dart'; import '../blocs/personal_info_bloc.dart'; -import '../blocs/personal_info_event.dart'; import '../blocs/personal_info_state.dart'; import '../widgets/personal_info_content.dart'; diff --git a/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/widgets/personal_info_content.dart b/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/widgets/personal_info_content.dart index ef6262c4..ba71594e 100644 --- a/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/widgets/personal_info_content.dart +++ b/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/widgets/personal_info_content.dart @@ -32,28 +32,41 @@ class PersonalInfoContent extends StatefulWidget { } class _PersonalInfoContentState extends State { + late final TextEditingController _emailController; late final TextEditingController _phoneController; late final TextEditingController _locationsController; @override void initState() { super.initState(); + _emailController = TextEditingController(text: widget.staff.email); _phoneController = TextEditingController(text: widget.staff.phone ?? ''); _locationsController = TextEditingController(text: widget.staff.preferredLocations?.join(', ')?? ''); // Listen to changes and update BLoC + _emailController.addListener(_onEmailChanged); _phoneController.addListener(_onPhoneChanged); _locationsController.addListener(_onAddressChanged); } @override void dispose() { + _emailController.dispose(); _phoneController.dispose(); _locationsController.dispose(); super.dispose(); } + void _onEmailChanged() { + context.read().add( + PersonalInfoFieldChanged( + field: 'email', + value: _emailController.text, + ), + ); + } + void _onPhoneChanged() { context.read().add( PersonalInfoFieldChanged( @@ -114,6 +127,7 @@ class _PersonalInfoContentState extends State { PersonalInfoForm( fullName: widget.staff.name, email: widget.staff.email, + emailController: _emailController, phoneController: _phoneController, locationsController: _locationsController, enabled: !isSaving, diff --git a/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/widgets/personal_info_form.dart b/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/widgets/personal_info_form.dart index 2897c37b..3f7a0af7 100644 --- a/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/widgets/personal_info_form.dart +++ b/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/widgets/personal_info_form.dart @@ -15,6 +15,9 @@ class PersonalInfoForm extends StatelessWidget { /// The staff member's email (read-only). final String email; + /// Controller for the email field. + final TextEditingController emailController; + /// Controller for the phone number field. final TextEditingController phoneController; @@ -29,6 +32,7 @@ class PersonalInfoForm extends StatelessWidget { super.key, required this.fullName, required this.email, + required this.emailController, required this.phoneController, required this.locationsController, this.enabled = true, @@ -48,7 +52,13 @@ class PersonalInfoForm extends StatelessWidget { _FieldLabel(text: i18n.email_label), const SizedBox(height: UiConstants.space2), - _ReadOnlyField(value: email), + _EditableField( + controller: emailController, + hint: i18n.email_label, + enabled: enabled, + keyboardType: TextInputType.emailAddress, + autofillHints: const [AutofillHints.email], + ), const SizedBox(height: UiConstants.space4), _FieldLabel(text: i18n.phone_label), @@ -122,11 +132,15 @@ class _EditableField extends StatelessWidget { final TextEditingController controller; final String hint; final bool enabled; + final TextInputType? keyboardType; + final Iterable? autofillHints; const _EditableField({ required this.controller, required this.hint, this.enabled = true, + this.keyboardType, + this.autofillHints, }); @override @@ -134,6 +148,8 @@ class _EditableField extends StatelessWidget { return TextField( controller: controller, enabled: enabled, + keyboardType: keyboardType, + autofillHints: autofillHints, style: UiTypography.body2r.copyWith(color: UiColors.textPrimary), decoration: InputDecoration( hintText: hint,