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

View File

@@ -160,17 +160,6 @@ class ProfilePage extends ConsumerWidget {
TextStyle(color: theme.textSecondary); TextStyle(color: theme.textSecondary);
final supportTiles = [ 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( _buildSupportOption(
context, context,
icon: UiUtils.platformIcon( icon: UiUtils.platformIcon(
@@ -182,6 +171,17 @@ class ProfilePage extends ConsumerWidget {
url: _buyMeACoffeeUrl, url: _buyMeACoffeeUrl,
color: theme.warning, 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( return Column(

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1361,7 +1361,7 @@ abstract class AppLocalizations {
/// Settings tile title to view app information. /// Settings tile title to view app information.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'About App'** /// **'About'**
String get aboutApp; String get aboutApp;
/// Subtitle/description for the About section. /// Subtitle/description for the About section.
@@ -1685,13 +1685,13 @@ abstract class AppLocalizations {
/// Title of the customization settings page. /// Title of the customization settings page.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'App Customization'** /// **'Customization'**
String get appCustomization; String get appCustomization;
/// Subtitle shown under App Customization tile and page header. /// Subtitle shown under App Customization tile and page header.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Personalize how names and UI display'** /// **'Theme, language, voice, and quickpills'**
String get appCustomizationSubtitle; String get appCustomizationSubtitle;
/// Helper text explaining quick action pill selection in customization. /// 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'; String get failedToDeleteFolder => 'Ordner konnte nicht gelöscht werden';
@override @override
String get aboutApp => 'Über die App'; String get aboutApp => 'Über';
@override @override
String get aboutAppSubtitle => 'Conduit Informationen und Links'; String get aboutAppSubtitle => 'Conduit Informationen und Links';
@@ -875,11 +875,11 @@ class AppLocalizationsDe extends AppLocalizations {
} }
@override @override
String get appCustomization => 'App-Anpassung'; String get appCustomization => 'Anpassung';
@override @override
String get appCustomizationSubtitle => String get appCustomizationSubtitle =>
'Personalisieren, wie Namen und UI angezeigt werden'; 'Design, Sprache, Stimme und Quick Pills';
@override @override
String get quickActionsDescription => String get quickActionsDescription =>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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