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

@@ -35,7 +35,7 @@ class CacheService {
return success;
} catch (e) {
AppLogger.error('Erreur lors de la mise en cache de $key', e);
AppLogger.error('Erreur lors de la mise en cache de $key', error: e);
return false;
}
}
@@ -65,7 +65,7 @@ class CacheService {
AppLogger.debug('Cache hit: $key');
return value as T;
} catch (e) {
AppLogger.error('Erreur lors de la lecture du cache $key', e);
AppLogger.error('Erreur lors de la lecture du cache $key', error: e);
return null;
}
}
@@ -92,7 +92,7 @@ class CacheService {
try {
return await _prefs.remove(key);
} catch (e) {
AppLogger.error('Erreur lors de la suppression du cache $key', e);
AppLogger.error('Erreur lors de la suppression du cache $key', error: e);
return false;
}
}
@@ -109,7 +109,7 @@ class CacheService {
AppLogger.info('Cache nettoyé pour préfixe: $prefix');
} catch (e) {
AppLogger.error('Erreur lors du nettoyage du cache $prefix', e);
AppLogger.error('Erreur lors du nettoyage du cache $prefix', error: e);
}
}
@@ -118,7 +118,7 @@ class CacheService {
try {
return await _prefs.clear();
} catch (e) {
AppLogger.error('Erreur lors du nettoyage complet du cache', e);
AppLogger.error('Erreur lors du nettoyage complet du cache', error: e);
return false;
}
}
@@ -154,7 +154,7 @@ class CacheService {
AppLogger.info('$cleaned entrées de cache expirées nettoyées');
}
} catch (e) {
AppLogger.error('Erreur lors du nettoyage des caches expirés', e);
AppLogger.error('Erreur lors du nettoyage des caches expirés', error: e);
}
}

View File

@@ -37,7 +37,7 @@ class CachedDatasourceDecorator {
return result;
} catch (e) {
AppLogger.error('Erreur dans withCache pour $cacheKey', e);
AppLogger.error('Erreur dans withCache pour $cacheKey', error: e);
rethrow;
}
}

View File

@@ -136,8 +136,15 @@ class UnexpectedFailure extends Failure {
/// Fonctionnalité non implémentée
class NotImplementedFailure extends Failure {
const NotImplementedFailure(super.message, [super.code]);
const NotImplementedFailure(
super.message, [
super.code,
super.isRetryable = false, // Not implemented features are not retryable
super.userFriendlyMessage =
'Cette fonctionnalité sera bientôt disponible. Nous travaillons dessus !',
]);
@override
String toString() => 'NotImplementedFailure: $message${code != null ? ' (Code: $code)' : ''}';
String toString() =>
'NotImplementedFailure: $message${code != null ? ' (Code: $code)' : ''}';
}