Skip to content

Commit 493afaf

Browse files
committed
refactor(app_configuration): simplify save flow and remove discard functionality
- Remove AppConfigurationDiscarded event and related logic - Update AppConfigurationFieldChanged handling to properly set isDirty flag - Replace BottomAppBar with FloatingActionButton for save action - Remove discard changes button and related logic - Update confirmation dialog to use proper context for localization
1 parent ed1f70a commit 493afaf

File tree

3 files changed

+36
-74
lines changed

3 files changed

+36
-74
lines changed

lib/app_configuration/bloc/app_configuration_bloc.dart

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ class AppConfigurationBloc
1515
on<AppConfigurationLoaded>(_onAppConfigurationLoaded);
1616
on<AppConfigurationUpdated>(_onAppConfigurationUpdated);
1717
on<AppConfigurationFieldChanged>(_onAppConfigurationFieldChanged);
18-
on<AppConfigurationDiscarded>(_onAppConfigurationDiscarded);
1918
}
2019

2120
final DataRepository<RemoteConfig> _remoteConfigRepository;
@@ -104,24 +103,13 @@ class AppConfigurationBloc
104103
AppConfigurationFieldChanged event,
105104
Emitter<AppConfigurationState> emit,
106105
) {
107-
emit(
108-
state.copyWith(
109-
remoteConfig: event.remoteConfig,
110-
isDirty: true,
111-
clearException: true,
112-
clearShowSaveSuccess: true,
113-
),
114-
);
115-
}
106+
final isDirty = event.remoteConfig != state.originalRemoteConfig;
116107

117-
void _onAppConfigurationDiscarded(
118-
AppConfigurationDiscarded event,
119-
Emitter<AppConfigurationState> emit,
120-
) {
121108
emit(
122109
state.copyWith(
123-
remoteConfig: state.originalRemoteConfig,
124-
isDirty: false,
110+
remoteConfig: event.remoteConfig,
111+
// isDirty should be true only if the new config is different from the original.
112+
isDirty: isDirty,
125113
clearException: true,
126114
clearShowSaveSuccess: true,
127115
),

lib/app_configuration/bloc/app_configuration_event.dart

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,6 @@ class AppConfigurationUpdated extends AppConfigurationEvent {
3333
List<Object?> get props => [remoteConfig];
3434
}
3535

36-
/// {@template app_configuration_discarded}
37-
/// Event to discard any unsaved changes to the application configuration.
38-
/// {@endtemplate}
39-
class AppConfigurationDiscarded extends AppConfigurationEvent {
40-
/// {@macro app_configuration_discarded}
41-
const AppConfigurationDiscarded();
42-
}
43-
4436
/// {@template app_configuration_field_changed}
4537
/// Event to notify that a field in the application configuration has changed.
4638
///

lib/app_configuration/view/app_configuration_page.dart

Lines changed: 32 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -166,54 +166,32 @@ class _AppConfigurationPageState extends State<AppConfigurationPage>
166166
);
167167
},
168168
),
169-
bottomNavigationBar: _buildBottomAppBar(context),
170-
);
171-
}
172-
173-
Widget _buildBottomAppBar(BuildContext context) {
174-
final isDirty = context.select(
175-
(AppConfigurationBloc bloc) => bloc.state.isDirty,
176-
);
177-
final remoteConfig = context.select(
178-
(AppConfigurationBloc bloc) => bloc.state.remoteConfig,
179-
);
180-
181-
return BottomAppBar(
182-
child: Padding(
183-
padding: const EdgeInsets.all(AppSpacing.md),
184-
child: Row(
185-
mainAxisAlignment: MainAxisAlignment.end,
186-
children: [
187-
OutlinedButton(
188-
onPressed: isDirty
189-
? () {
190-
// Discard changes: revert to original config
191-
context.read<AppConfigurationBloc>().add(
192-
const AppConfigurationDiscarded(),
193-
);
194-
}
195-
: null,
196-
child: Text(AppLocalizationsX(context).l10n.discardChangesButton),
197-
),
198-
const SizedBox(width: AppSpacing.md),
199-
ElevatedButton(
200-
onPressed: isDirty
201-
? () async {
202-
final confirmed = await _showConfirmationDialog(context);
203-
if (context.mounted &&
204-
confirmed &&
205-
remoteConfig != null) {
206-
context.read<AppConfigurationBloc>().add(
207-
AppConfigurationUpdated(remoteConfig),
169+
floatingActionButton:
170+
BlocBuilder<AppConfigurationBloc, AppConfigurationState>(
171+
builder: (context, state) {
172+
return FloatingActionButton(
173+
onPressed: state.isDirty
174+
? () async {
175+
final remoteConfig = context
176+
.read<AppConfigurationBloc>()
177+
.state
178+
.remoteConfig;
179+
final confirmed = await _showConfirmationDialog(
180+
context,
208181
);
182+
if (context.mounted &&
183+
confirmed &&
184+
remoteConfig != null) {
185+
context.read<AppConfigurationBloc>().add(
186+
AppConfigurationUpdated(remoteConfig),
187+
);
188+
}
209189
}
210-
}
211-
: null,
212-
child: Text(AppLocalizationsX(context).l10n.saveChangesButton),
213-
),
214-
],
215-
),
216-
),
190+
: null,
191+
child: const Icon(Icons.save),
192+
);
193+
},
194+
),
217195
);
218196
}
219197

@@ -223,19 +201,23 @@ class _AppConfigurationPageState extends State<AppConfigurationPage>
223201
builder: (BuildContext dialogContext) {
224202
return AlertDialog(
225203
title: Text(
226-
AppLocalizationsX(context).l10n.confirmConfigUpdateDialogTitle,
204+
AppLocalizationsX(
205+
dialogContext,
206+
).l10n.confirmConfigUpdateDialogTitle,
227207
style: Theme.of(dialogContext).textTheme.titleLarge,
228208
),
229209
content: Text(
230210
AppLocalizationsX(
231-
context,
211+
dialogContext,
232212
).l10n.confirmConfigUpdateDialogContent,
233213
style: Theme.of(dialogContext).textTheme.bodyMedium,
234214
),
235215
actions: <Widget>[
236216
TextButton(
237217
onPressed: () => Navigator.of(dialogContext).pop(false),
238-
child: Text(AppLocalizationsX(context).l10n.cancelButton),
218+
child: Text(
219+
AppLocalizationsX(dialogContext).l10n.cancelButton,
220+
),
239221
),
240222
ElevatedButton(
241223
onPressed: () => Navigator.of(dialogContext).pop(true),
@@ -246,7 +228,7 @@ class _AppConfigurationPageState extends State<AppConfigurationPage>
246228
).colorScheme.onError,
247229
),
248230
child: Text(
249-
AppLocalizationsX(context).l10n.confirmSaveButton,
231+
AppLocalizationsX(dialogContext).l10n.confirmSaveButton,
250232
),
251233
),
252234
],

0 commit comments

Comments
 (0)