refactor: Simplify platform-specific icon handling in AppCustomizationPage and ProfilePage

- Replaced direct platform checks with a utility method `UiUtils.platformIcon` for better readability and maintainability.
- Updated localization strings for app customization to enhance clarity and consistency across multiple languages.
- Adjusted icon colors in the UI to ensure proper theming and visual consistency.
This commit is contained in:
cogwheel0
2025-10-17 15:09:37 +05:30
parent 6c81d68e59
commit 23071bb7b1
15 changed files with 85 additions and 69 deletions

View File

@@ -508,7 +508,10 @@ class AppCustomizationPage extends ConsumerWidget {
_CustomizationTile(
leading: _buildIconBadge(
context,
Platform.isIOS ? CupertinoIcons.speaker_3 : Icons.record_voice_over,
UiUtils.platformIcon(
ios: CupertinoIcons.speaker_3,
android: Icons.record_voice_over,
),
color: theme.buttonPrimary,
),
title: l10n.ttsVoice,
@@ -523,7 +526,10 @@ class AppCustomizationPage extends ConsumerWidget {
_buildSliderTile(
context,
ref,
icon: Platform.isIOS ? CupertinoIcons.speedometer : Icons.speed,
icon: UiUtils.platformIcon(
ios: CupertinoIcons.speedometer,
android: Icons.speed,
),
title: l10n.ttsSpeechRate,
value: settings.ttsSpeechRate,
min: 0.25,
@@ -538,7 +544,10 @@ class AppCustomizationPage extends ConsumerWidget {
_buildSliderTile(
context,
ref,
icon: Platform.isIOS ? CupertinoIcons.waveform : Icons.graphic_eq,
icon: UiUtils.platformIcon(
ios: CupertinoIcons.waveform,
android: Icons.graphic_eq,
),
title: l10n.ttsPitch,
value: settings.ttsPitch,
min: 0.5,
@@ -553,7 +562,10 @@ class AppCustomizationPage extends ConsumerWidget {
_buildSliderTile(
context,
ref,
icon: Platform.isIOS ? CupertinoIcons.volume_up : Icons.volume_up,
icon: UiUtils.platformIcon(
ios: CupertinoIcons.volume_up,
android: Icons.volume_up,
),
title: l10n.ttsVolume,
value: settings.ttsVolume,
min: 0.0,
@@ -568,8 +580,11 @@ class AppCustomizationPage extends ConsumerWidget {
_CustomizationTile(
leading: _buildIconBadge(
context,
Platform.isIOS ? CupertinoIcons.play_fill : Icons.play_arrow,
color: theme.buttonSecondary,
UiUtils.platformIcon(
ios: CupertinoIcons.play_fill,
android: Icons.play_arrow,
),
color: theme.buttonPrimary,
),
title: l10n.ttsPreview,
subtitle: l10n.ttsPreviewText,
@@ -599,7 +614,7 @@ class AppCustomizationPage extends ConsumerWidget {
children: [
Row(
children: [
_buildIconBadge(context, icon, color: theme.buttonSecondary),
_buildIconBadge(context, icon, color: theme.buttonPrimary),
const SizedBox(width: Spacing.sm),
Expanded(
child: Text(
@@ -746,10 +761,11 @@ class AppCustomizationPage extends ConsumerWidget {
// System Default Option
ListTile(
leading: Icon(
Platform.isIOS
? CupertinoIcons.speaker_3
: Icons.record_voice_over,
color: theme.iconPrimary,
UiUtils.platformIcon(
ios: CupertinoIcons.speaker_3,
android: Icons.record_voice_over,
),
color: theme.textPrimary,
),
title: Text(
l10n.ttsSystemDefault,
@@ -846,10 +862,11 @@ class AppCustomizationPage extends ConsumerWidget {
return ListTile(
leading: Icon(
Platform.isIOS
? CupertinoIcons.person_fill
: Icons.person,
color: theme.iconSecondary,
UiUtils.platformIcon(
ios: CupertinoIcons.person_fill,
android: Icons.person,
),
color: theme.textPrimary,
),
title: Text(
displayName,

View File

@@ -160,17 +160,6 @@ class ProfilePage extends ConsumerWidget {
TextStyle(color: theme.textSecondary);
final supportTiles = [
_buildSupportOption(
context,
icon: UiUtils.platformIcon(
ios: CupertinoIcons.heart,
android: Icons.favorite_border,
),
title: AppLocalizations.of(context)!.githubSponsorsTitle,
subtitle: AppLocalizations.of(context)!.githubSponsorsSubtitle,
url: _githubSponsorsUrl,
color: theme.success,
),
_buildSupportOption(
context,
icon: UiUtils.platformIcon(
@@ -182,6 +171,17 @@ class ProfilePage extends ConsumerWidget {
url: _buyMeACoffeeUrl,
color: theme.warning,
),
_buildSupportOption(
context,
icon: UiUtils.platformIcon(
ios: CupertinoIcons.heart,
android: Icons.favorite_border,
),
title: AppLocalizations.of(context)!.githubSponsorsTitle,
subtitle: AppLocalizations.of(context)!.githubSponsorsSubtitle,
url: _githubSponsorsUrl,
color: theme.success,
),
];
return Column(

View File

@@ -236,7 +236,7 @@
"deleteFolderTitle": "Ordner löschen",
"deleteFolderMessage": "Dieser Ordner und seine Zuordnungen werden entfernt.",
"failedToDeleteFolder": "Ordner konnte nicht gelöscht werden",
"aboutApp": "Über die App",
"aboutApp": "Über",
"aboutAppSubtitle": "Conduit Informationen und Links",
"web": "Web",
"imageGen": "Bild-Gen",
@@ -310,8 +310,8 @@
"placeholders": {"duration": {"type": "String", "example": "3 s"}}
}
,
"appCustomization": "App-Anpassung",
"appCustomizationSubtitle": "Personalisieren, wie Namen und UI angezeigt werden",
"appCustomization": "Anpassung",
"appCustomizationSubtitle": "Design, Sprache, Stimme und Quick Pills",
"quickActionsDescription": "Wähle bis zu zwei Schnellzugriffe, die neben dem Eingabefeld angepinnt werden",
"chatSettings": "Chat",
"sendOnEnter": "Mit Enter senden",

View File

@@ -501,7 +501,7 @@
"@deleteFolderMessage": {"description": "Warning that deleting a folder will remove it and its associations."},
"failedToDeleteFolder": "Failed to delete folder",
"@failedToDeleteFolder": {"description": "Error notice when deleting a folder fails."},
"aboutApp": "About App",
"aboutApp": "About",
"@aboutApp": {"description": "Settings tile title to view app information."},
"aboutAppSubtitle": "Conduit information and links",
"@aboutAppSubtitle": {"description": "Subtitle/description for the About section."},
@@ -636,9 +636,9 @@
"placeholders": {"duration": {"type": "String", "example": "3s"}}
}
,
"appCustomization": "App Customization",
"appCustomization": "Customization",
"@appCustomization": {"description": "Title of the customization settings page."},
"appCustomizationSubtitle": "Personalize how names and UI display",
"appCustomizationSubtitle": "Theme, language, voice, and quickpills",
"@appCustomizationSubtitle": {"description": "Subtitle shown under App Customization tile and page header."},
"quickActionsDescription": "Pick up to two shortcuts to pin near the composer",
"@quickActionsDescription": {"description": "Helper text explaining quick action pill selection in customization."},

View File

@@ -233,7 +233,7 @@
"deleteFolderTitle": "Eliminar carpeta",
"deleteFolderMessage": "Esta carpeta y sus referencias de asignación se eliminarán.",
"failedToDeleteFolder": "No se pudo eliminar la carpeta",
"aboutApp": "Acerca de la aplicación",
"aboutApp": "Acerca de",
"aboutAppSubtitle": "Información y enlaces de Conduit",
"web": "Web",
"imageGen": "Generación de imágenes",
@@ -303,8 +303,8 @@
"description": "Muestra cuánto tiempo el asistente estuvo pensando antes de responder.",
"placeholders": {"duration": {"type": "String", "example": "3s"}}
},
"appCustomization": "Personalización de la aplicación",
"appCustomizationSubtitle": "Personaliza cómo se muestran los nombres y la interfaz",
"appCustomization": "Personalización",
"appCustomizationSubtitle": "Tema, idioma, voz y quickpills",
"quickActionsDescription": "Elige hasta dos accesos directos para anclar cerca del compositor",
"chatSettings": "Conversación",
"sendOnEnter": "Enviar con Enter",

View File

@@ -236,7 +236,7 @@
"deleteFolderTitle": "Supprimer le dossier",
"deleteFolderMessage": "Ce dossier et ses associations seront supprimés.",
"failedToDeleteFolder": "Échec de la suppression du dossier",
"aboutApp": "À propos de lapplication",
"aboutApp": "À propos",
"aboutAppSubtitle": "Informations et liens Conduit",
"web": "Web",
"imageGen": "Gén. image",
@@ -310,8 +310,8 @@
"placeholders": {"duration": {"type": "String", "example": "3 s"}}
}
,
"appCustomization": "Personnalisation de l'app",
"appCustomizationSubtitle": "Personnalisez l'affichage des noms et de l'UI",
"appCustomization": "Personnalisation",
"appCustomizationSubtitle": "Thème, langue, voix et quickpills",
"quickActionsDescription": "Choisissez jusqu'à deux raccourcis à épingler près du champ de saisie",
"chatSettings": "Discussion",
"sendOnEnter": "Envoyer avec Entrée",

View File

@@ -236,7 +236,7 @@
"deleteFolderTitle": "Elimina cartella",
"deleteFolderMessage": "Questa cartella e le sue associazioni verranno rimosse.",
"failedToDeleteFolder": "Impossibile eliminare la cartella",
"aboutApp": "Informazioni sullapp",
"aboutApp": "Informazioni",
"aboutAppSubtitle": "Informazioni e link di Conduit",
"web": "Web",
"imageGen": "Gen. immagini",
@@ -310,8 +310,8 @@
"placeholders": {"duration": {"type": "String", "example": "3 s"}}
}
,
"appCustomization": "Personalizzazione app",
"appCustomizationSubtitle": "Personalizza la visualizzazione dei nomi e dell'UI",
"appCustomization": "Personalizzazione",
"appCustomizationSubtitle": "Tema, lingua, voce e quickpills",
"quickActionsDescription": "Scegli fino a due scorciatoie da fissare vicino al campo di input",
"chatSettings": "Chat",
"sendOnEnter": "Invia con Invio",

View File

@@ -1361,7 +1361,7 @@ abstract class AppLocalizations {
/// Settings tile title to view app information.
///
/// In en, this message translates to:
/// **'About App'**
/// **'About'**
String get aboutApp;
/// Subtitle/description for the About section.
@@ -1685,13 +1685,13 @@ abstract class AppLocalizations {
/// Title of the customization settings page.
///
/// In en, this message translates to:
/// **'App Customization'**
/// **'Customization'**
String get appCustomization;
/// Subtitle shown under App Customization tile and page header.
///
/// In en, this message translates to:
/// **'Personalize how names and UI display'**
/// **'Theme, language, voice, and quickpills'**
String get appCustomizationSubtitle;
/// Helper text explaining quick action pill selection in customization.

View File

@@ -692,7 +692,7 @@ class AppLocalizationsDe extends AppLocalizations {
String get failedToDeleteFolder => 'Ordner konnte nicht gelöscht werden';
@override
String get aboutApp => 'Über die App';
String get aboutApp => 'Über';
@override
String get aboutAppSubtitle => 'Conduit Informationen und Links';
@@ -875,11 +875,11 @@ class AppLocalizationsDe extends AppLocalizations {
}
@override
String get appCustomization => 'App-Anpassung';
String get appCustomization => 'Anpassung';
@override
String get appCustomizationSubtitle =>
'Personalisieren, wie Namen und UI angezeigt werden';
'Design, Sprache, Stimme und Quick Pills';
@override
String get quickActionsDescription =>

View File

@@ -687,7 +687,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get failedToDeleteFolder => 'Failed to delete folder';
@override
String get aboutApp => 'About App';
String get aboutApp => 'About';
@override
String get aboutAppSubtitle => 'Conduit information and links';
@@ -868,10 +868,11 @@ class AppLocalizationsEn extends AppLocalizations {
}
@override
String get appCustomization => 'App Customization';
String get appCustomization => 'Customization';
@override
String get appCustomizationSubtitle => 'Personalize how names and UI display';
String get appCustomizationSubtitle =>
'Theme, language, voice, and quickpills';
@override
String get quickActionsDescription =>

View File

@@ -697,7 +697,7 @@ class AppLocalizationsFr extends AppLocalizations {
String get failedToDeleteFolder => 'Échec de la suppression du dossier';
@override
String get aboutApp => 'À propos de lapplication';
String get aboutApp => 'À propos';
@override
String get aboutAppSubtitle => 'Informations et liens Conduit';
@@ -883,11 +883,10 @@ class AppLocalizationsFr extends AppLocalizations {
}
@override
String get appCustomization => 'Personnalisation de l\'app';
String get appCustomization => 'Personnalisation';
@override
String get appCustomizationSubtitle =>
'Personnalisez l\'affichage des noms et de l\'UI';
String get appCustomizationSubtitle => 'Thème, langue, voix et quickpills';
@override
String get quickActionsDescription =>

View File

@@ -690,7 +690,7 @@ class AppLocalizationsIt extends AppLocalizations {
String get failedToDeleteFolder => 'Impossibile eliminare la cartella';
@override
String get aboutApp => 'Informazioni sullapp';
String get aboutApp => 'Informazioni';
@override
String get aboutAppSubtitle => 'Informazioni e link di Conduit';
@@ -872,11 +872,10 @@ class AppLocalizationsIt extends AppLocalizations {
}
@override
String get appCustomization => 'Personalizzazione app';
String get appCustomization => 'Personalizzazione';
@override
String get appCustomizationSubtitle =>
'Personalizza la visualizzazione dei nomi e dell\'UI';
String get appCustomizationSubtitle => 'Tema, lingua, voce e quickpills';
@override
String get quickActionsDescription =>

View File

@@ -233,8 +233,8 @@
"deleteFolderTitle": "Map verwijderen",
"deleteFolderMessage": "Deze map en zijn toewijzingen worden verwijderd.",
"failedToDeleteFolder": "Kan map niet verwijderen",
"aboutApp": "Over de app",
"aboutAppSubtitle": "Conduit-informatie en links",
"aboutApp": "Over",
"aboutAppSubtitle": "Conduit informatie en links",
"web": "Web",
"imageGen": "Afbeeldingsgeneratie",
"pinned": "Vastgepind",
@@ -303,8 +303,8 @@
"description": "Toont hoe lang de assistent dacht voordat hij antwoordde.",
"placeholders": {"duration": {"type": "String", "example": "3s"}}
},
"appCustomization": "App-aanpassing",
"appCustomizationSubtitle": "Personaliseer hoe namen en UI worden weergegeven",
"appCustomization": "Aanpassing",
"appCustomizationSubtitle": "Thema, taal, stem en quickpills",
"quickActionsDescription": "Kies maximaal twee snelkoppelingen om vast te pinnen bij de composer",
"chatSettings": "Chat",
"sendOnEnter": "Verzenden met Enter",

View File

@@ -233,8 +233,8 @@
"deleteFolderTitle": "Удалить папку",
"deleteFolderMessage": "Эта папка и ее ссылки будут удалены.",
"failedToDeleteFolder": "Не удалось удалить папку",
"aboutApp": "О приложении",
"aboutAppSubtitle": "Информация о Conduit и ссылки",
"aboutApp": "О",
"aboutAppSubtitle": "Информация и ссылки Conduit",
"web": "Веб",
"imageGen": "Генерация изображений",
"pinned": "Закреплено",
@@ -303,8 +303,8 @@
"description": "Показывает, сколько времени ассистент думал перед ответом.",
"placeholders": {"duration": {"type": "String", "example": "3с"}}
},
"appCustomization": "Настройка приложения",
"appCustomizationSubtitle": "Персонализируйте отображение имен и интерфейса",
"appCustomization": "Настройка",
"appCustomizationSubtitle": "Тема, язык, голос и quickpills",
"quickActionsDescription": "Выберите до двух ярлыков для закрепления рядом с полем ввода",
"chatSettings": "Чат",
"sendOnEnter": "Отправка по Enter",

View File

@@ -233,7 +233,7 @@
"deleteFolderTitle": "删除文件夹",
"deleteFolderMessage": "此文件夹及其分配引用将被删除。",
"failedToDeleteFolder": "无法删除文件夹",
"aboutApp": "关于应用",
"aboutApp": "关于",
"aboutAppSubtitle": "Conduit 信息和链接",
"web": "网页",
"imageGen": "图像生成",
@@ -303,8 +303,8 @@
"description": "显示助手在回复前思考了多长时间。",
"placeholders": {"duration": {"type": "String", "example": "3s"}}
},
"appCustomization": "应用自定义",
"appCustomizationSubtitle": "个性化名称和 UI 显示",
"appCustomization": "自定义",
"appCustomizationSubtitle": "主题、语言、语音和 quickpills",
"quickActionsDescription": "选择最多两个快捷方式以固定在撰写器附近",
"chatSettings": "对话",
"sendOnEnter": "回车发送",