Skip to content

Commit bc0a2f0

Browse files
committed
refactor(content): add loading state to edit source dropdowns
Refactors the edit source page to conditionally disable the language and country dropdowns while their respective full lists are being fetched in the background. This aligns the UI behavior with the create/edit headline pages and the create source page, providing a better user experience by preventing interaction with incomplete data.
1 parent 158c281 commit bc0a2f0

File tree

1 file changed

+73
-49
lines changed

1 file changed

+73
-49
lines changed

lib/content_management/view/edit_source_page.dart

Lines changed: 73 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -198,24 +198,36 @@ class _EditSourceViewState extends State<_EditSourceView> {
198198
),
199199
),
200200
const SizedBox(height: AppSpacing.lg),
201-
DropdownButtonFormField<Language?>(
202-
value: state.language,
203-
decoration: InputDecoration(
204-
labelText: l10n.language,
205-
border: const OutlineInputBorder(),
206-
),
207-
items: [
208-
DropdownMenuItem(value: null, child: Text(l10n.none)),
209-
...state.languages.map(
210-
(language) => DropdownMenuItem(
211-
value: language,
212-
child: Text(language.name),
201+
BlocBuilder<ContentManagementBloc, ContentManagementState>(
202+
builder: (context, contentState) {
203+
final isLoading = contentState.allLanguagesStatus ==
204+
ContentManagementStatus.loading;
205+
return DropdownButtonFormField<Language?>(
206+
value: state.language,
207+
decoration: InputDecoration(
208+
labelText: l10n.language,
209+
border: const OutlineInputBorder(),
210+
helperText:
211+
isLoading ? l10n.loadingFullList : null,
213212
),
214-
),
215-
],
216-
onChanged: (value) => context.read<EditSourceBloc>().add(
217-
EditSourceLanguageChanged(value),
218-
),
213+
items: [
214+
DropdownMenuItem(
215+
value: null, child: Text(l10n.none)),
216+
...state.languages.map(
217+
(language) => DropdownMenuItem(
218+
value: language,
219+
child: Text(language.name),
220+
),
221+
),
222+
],
223+
onChanged: isLoading
224+
? null
225+
: (value) =>
226+
context.read<EditSourceBloc>().add(
227+
EditSourceLanguageChanged(value),
228+
),
229+
);
230+
},
219231
),
220232
const SizedBox(height: AppSpacing.lg),
221233
DropdownButtonFormField<SourceType?>(
@@ -238,40 +250,52 @@ class _EditSourceViewState extends State<_EditSourceView> {
238250
),
239251
),
240252
const SizedBox(height: AppSpacing.lg),
241-
DropdownButtonFormField<Country?>(
242-
value: state.headquarters,
243-
decoration: InputDecoration(
244-
labelText: l10n.headquarters,
245-
border: const OutlineInputBorder(),
246-
),
247-
items: [
248-
DropdownMenuItem(value: null, child: Text(l10n.none)),
249-
...state.countries.map(
250-
(country) => DropdownMenuItem(
251-
value: country,
252-
child: Row(
253-
children: [
254-
SizedBox(
255-
width: 32,
256-
height: 20,
257-
child: Image.network(
258-
country.flagUrl,
259-
fit: BoxFit.cover,
260-
errorBuilder:
261-
(context, error, stackTrace) =>
262-
const Icon(Icons.flag),
263-
),
253+
BlocBuilder<ContentManagementBloc, ContentManagementState>(
254+
builder: (context, contentState) {
255+
final isLoading = contentState.allCountriesStatus ==
256+
ContentManagementStatus.loading;
257+
return DropdownButtonFormField<Country?>(
258+
value: state.headquarters,
259+
decoration: InputDecoration(
260+
labelText: l10n.headquarters,
261+
border: const OutlineInputBorder(),
262+
helperText:
263+
isLoading ? l10n.loadingFullList : null,
264+
),
265+
items: [
266+
DropdownMenuItem(
267+
value: null, child: Text(l10n.none)),
268+
...state.countries.map(
269+
(country) => DropdownMenuItem(
270+
value: country,
271+
child: Row(
272+
children: [
273+
SizedBox(
274+
width: 32,
275+
height: 20,
276+
child: Image.network(
277+
country.flagUrl,
278+
fit: BoxFit.cover,
279+
errorBuilder:
280+
(context, error, stackTrace) =>
281+
const Icon(Icons.flag),
282+
),
283+
),
284+
const SizedBox(width: AppSpacing.md),
285+
Text(country.name),
286+
],
264287
),
265-
const SizedBox(width: AppSpacing.md),
266-
Text(country.name),
267-
],
288+
),
268289
),
269-
),
270-
),
271-
],
272-
onChanged: (value) => context.read<EditSourceBloc>().add(
273-
EditSourceHeadquartersChanged(value),
274-
),
290+
],
291+
onChanged: isLoading
292+
? null
293+
: (value) =>
294+
context.read<EditSourceBloc>().add(
295+
EditSourceHeadquartersChanged(value),
296+
),
297+
);
298+
},
275299
),
276300
const SizedBox(height: AppSpacing.lg),
277301
DropdownButtonFormField<ContentStatus>(

0 commit comments

Comments
 (0)