From 89b4f433b64a4af3fb060b83b967ae7ccfaf030f Mon Sep 17 00:00:00 2001 From: qguillaume Date: Fri, 19 Jun 2026 15:03:15 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20bouton=20Signaler=20un=20bug=20dans=20l?= =?UTF-8?q?es=20param=C3=A8tres=20(rapport=20copiable=20avec=20infos=20tec?= =?UTF-8?q?hniques)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/features/settings/settings_screen.dart | 80 ++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/lib/features/settings/settings_screen.dart b/lib/features/settings/settings_screen.dart index b0d52df9..bf67779e 100644 --- a/lib/features/settings/settings_screen.dart +++ b/lib/features/settings/settings_screen.dart @@ -245,6 +245,79 @@ class _SettingsScreenState extends State { ); } + // Rapport de bug autonome : on collecte une description + les infos + // techniques, et on copie un rapport prêt à coller dans un email de support. + void _showReportBugDialog() { + final descController = TextEditingController(); + const supportEmail = 'quesnel.guillaume.j@gmail.com'; + const appVersion = '1.0.0'; + final platform = Theme.of(context).platform.name; + + showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Signaler un bug'), + content: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Décrivez le problème : ce que vous faisiez, ce qui était attendu et ce qui s\'est passé.', + style: TextStyle(fontSize: 13, color: Colors.grey), + ), + const SizedBox(height: 12), + TextField( + controller: descController, + maxLines: 5, + decoration: const InputDecoration( + hintText: 'Ex: l\'application se ferme quand j\'ouvre une session...', + border: OutlineInputBorder(), + ), + ), + const SizedBox(height: 12), + Text( + 'Infos techniques jointes : version $appVersion • $platform', + style: const TextStyle(fontSize: 11, color: Colors.grey), + ), + ], + ), + ), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: const Text('Annuler'), + ), + ElevatedButton.icon( + icon: const Icon(Icons.copy, size: 18), + label: const Text('Copier le rapport'), + onPressed: () { + final desc = descController.text.trim(); + final report = StringBuffer() + ..writeln('--- Rapport de bug ---') + ..writeln('Version : $appVersion') + ..writeln('Plateforme : $platform') + ..writeln('Date : ${DateTime.now().toIso8601String()}') + ..writeln('') + ..writeln('Description :') + ..writeln(desc.isEmpty ? '(non renseignée)' : desc); + + Clipboard.setData(ClipboardData(text: report.toString())); + Navigator.pop(context); + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Rapport copié — collez-le dans un email à $supportEmail'), + backgroundColor: AppTheme.successColor, + duration: Duration(seconds: 5), + ), + ); + }, + ), + ], + ), + ); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -345,6 +418,13 @@ class _SettingsScreenState extends State { subtitle: '1.0.0', onTap: () {}, ), + _buildSettingsTile( + context: context, + icon: Icons.bug_report_outlined, + title: 'Signaler un bug', + subtitle: 'Aidez-nous à corriger les problèmes', + onTap: _showReportBugDialog, + ), _buildSettingsTile( context: context, icon: Icons.privacy_tip_outlined,