feat(mobile): amélioration UX NotImplementedFailure + SnackbarHelper

- NotImplementedFailure: ajout userFriendlyMessage et icon construction (blue)
- ErrorDisplayWidget: support spécial pour NotImplementedFailure (bientôt disponible)
- SnackbarHelper: classe centralisée pour messages cohérents (success, error, warning, info, notImplemented)
- budgets_list_page: remplace generic snackbar par SnackbarHelper.showNotImplemented
- conversations_page: remplace 2 TODOs par SnackbarHelper.showNotImplemented
- export_members: met à jour TODO obsolète (endpoint PDF maintenant disponible)
- cache_service: fix AppLogger.error calls (error: named param)
- cached_datasource_decorator: fix AppLogger.error call

Task #64 - Fix Snackbar Placeholders + NotImplementedFailure UX
This commit is contained in:
dahoud
2026-03-17 10:06:21 +00:00
parent f4bdd81141
commit b63fc46182
8 changed files with 249 additions and 26 deletions

View File

@@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../../core/di/injection_container.dart';
import '../../../../shared/design_system/unionflow_design_system.dart';
import '../../../../shared/utils/snackbar_helper.dart';
import '../bloc/messaging_bloc.dart';
import '../bloc/messaging_event.dart';
import '../bloc/messaging_state.dart';
@@ -117,12 +118,9 @@ class ConversationsPage extends StatelessWidget {
return ConversationTile(
conversation: conversation,
onTap: () {
// Navigation vers la page de chat
// TODO: Implémenter navigation
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Ouvrir conversation: ${conversation.name}'),
),
SnackbarHelper.showNotImplemented(
context,
'Affichage des messages',
);
},
);
@@ -137,10 +135,7 @@ class ConversationsPage extends StatelessWidget {
floatingActionButton: FloatingActionButton(
backgroundColor: AppColors.primaryGreen,
onPressed: () {
// TODO: Ouvrir dialogue nouvelle conversation
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Nouvelle conversation (à implémenter)')),
);
SnackbarHelper.showNotImplemented(context, 'Nouvelle conversation');
},
child: const Icon(Icons.add, color: Colors.white),
),

View File

@@ -6,6 +6,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:intl/intl.dart';
import '../../../../core/di/injection_container.dart';
import '../../../../shared/design_system/unionflow_design_system.dart';
import '../../../../shared/utils/snackbar_helper.dart';
import '../../domain/entities/budget.dart';
import '../bloc/budget_bloc.dart';
import '../bloc/budget_event.dart';
@@ -99,12 +100,7 @@ class _BudgetsListView extends StatelessWidget {
),
floatingActionButton: FloatingActionButton.extended(
onPressed: () {
// TODO: Navigate to create budget page
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Fonctionnalité en cours de développement'),
),
);
SnackbarHelper.showNotImplemented(context, 'Création de budget');
},
icon: const Icon(Icons.add),
label: const Text('Nouveau budget'),

View File

@@ -19,7 +19,7 @@ class ExportMembers {
/// [format] - Format d'export ('csv' ou 'pdf')
///
/// Retourne les données exportées (liste complète des membres selon critères)
/// TODO: Ajouter endpoint backend GET /api/membres/export?format=csv|pdf
/// Note: Backend endpoint GET /api/membres/export?format=csv|excel|pdf disponible
/// Le use case actuel récupère toutes les données, l'export final se fait côté UI
Future<List<Map<String, dynamic>>> call({
MembreSearchCriteria? criteria,