Skip to content

Commit 8cf743b

Browse files
committed
refactor(settings): improve language selection
- Moved language selection to a list - Improved UI for language selection
1 parent 6115e1e commit 8cf743b

File tree

1 file changed

+60
-39
lines changed

1 file changed

+60
-39
lines changed

lib/settings/view/settings_page.dart

Lines changed: 60 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -332,36 +332,9 @@ class _SettingsView extends StatelessWidget {
332332
),
333333
),
334334
// Language Tab Content
335-
ListView(
336-
padding: const EdgeInsets.all(AppSpacing.lg),
337-
children: [
338-
_buildSettingSection(
339-
context,
340-
title: l10n.languageLabel,
341-
description: l10n.languageDescription,
342-
child: DropdownButton<AppLanguage>(
343-
value: userAppSettings.language,
344-
onChanged: (value) {
345-
if (value != null) {
346-
context.read<SettingsBloc>().add(
347-
SettingsLanguageChanged(value),
348-
);
349-
}
350-
},
351-
items: _supportedLanguages
352-
.map(
353-
(lang) => DropdownMenuItem(
354-
value: lang,
355-
child: Text(
356-
_getLanguageName(lang, l10n),
357-
),
358-
),
359-
)
360-
.toList(),
361-
// Removed isExpanded: true
362-
),
363-
),
364-
],
335+
_LanguageSelectionList(
336+
currentLanguage: userAppSettings.language,
337+
l10n: l10n,
365338
),
366339
],
367340
),
@@ -481,6 +454,63 @@ class _SettingsView extends StatelessWidget {
481454
}
482455
}
483456

457+
static const List<String> _supportedFontFamilies = [
458+
'SystemDefault',
459+
'Roboto',
460+
'OpenSans',
461+
'Lato',
462+
'Montserrat',
463+
'Merriweather',
464+
];
465+
}
466+
467+
/// {@template _language_selection_list}
468+
/// A widget that displays a list of supported languages for selection.
469+
/// {@endtemplate}
470+
class _LanguageSelectionList extends StatelessWidget {
471+
/// {@macro _language_selection_list}
472+
const _LanguageSelectionList({
473+
required this.currentLanguage,
474+
required this.l10n,
475+
});
476+
477+
/// The currently selected language.
478+
final AppLanguage currentLanguage;
479+
480+
/// The localized strings for the application.
481+
final AppLocalizations l10n;
482+
483+
@override
484+
Widget build(BuildContext context) {
485+
return ListView.builder(
486+
padding: const EdgeInsets.symmetric(vertical: AppSpacing.lg),
487+
itemCount: _supportedLanguages.length,
488+
itemBuilder: (context, index) {
489+
final language = _supportedLanguages[index];
490+
final isSelected = language == currentLanguage;
491+
return ListTile(
492+
title: Text(
493+
_getLanguageName(language, l10n),
494+
style: Theme.of(context).textTheme.titleMedium,
495+
),
496+
trailing: isSelected
497+
? Icon(
498+
Icons.check,
499+
color: Theme.of(context).colorScheme.primary,
500+
)
501+
: null,
502+
onTap: () {
503+
if (!isSelected) {
504+
context.read<SettingsBloc>().add(
505+
SettingsLanguageChanged(language),
506+
);
507+
}
508+
},
509+
);
510+
},
511+
);
512+
}
513+
484514
String _getLanguageName(AppLanguage language, AppLocalizations l10n) {
485515
switch (language) {
486516
case 'en':
@@ -492,15 +522,6 @@ class _SettingsView extends StatelessWidget {
492522
}
493523
}
494524

495-
static const List<String> _supportedFontFamilies = [
496-
'SystemDefault',
497-
'Roboto',
498-
'OpenSans',
499-
'Lato',
500-
'Montserrat',
501-
'Merriweather',
502-
];
503-
504525
static const List<AppLanguage> _supportedLanguages = [
505526
'en',
506527
'ar',

0 commit comments

Comments
 (0)