Files
unionflow-mobile-apps/lib/features/notifications/presentation/bloc/notification_bloc.dart
2026-03-31 09:14:47 +00:00

58 lines
2.1 KiB
Dart

import 'package:dio/dio.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:injectable/injectable.dart';
import '../../../../core/utils/logger.dart';
import '../../data/repositories/notification_feed_repository.dart';
import 'notification_event.dart';
import 'notification_state.dart';
@injectable
class NotificationBloc extends Bloc<NotificationEvent, NotificationState> {
final NotificationFeedRepository _repository;
NotificationBloc(this._repository) : super(NotificationInitial()) {
on<LoadNotificationsRequested>(_onLoadNotificationsRequested);
on<NotificationMarkedAsRead>(_onNotificationMarkedAsRead);
}
Future<void> _onLoadNotificationsRequested(LoadNotificationsRequested event, Emitter<NotificationState> emit) async {
emit(NotificationLoading());
try {
final items = await _repository.getNotifications();
emit(NotificationLoaded(items: items));
} catch (e, st) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
AppLogger.error('NotificationBloc: chargement notifications échoué', error: e, stackTrace: st);
emit(NotificationError('Erreur de chargement: $e'));
}
}
Future<void> _onNotificationMarkedAsRead(NotificationMarkedAsRead event, Emitter<NotificationState> emit) async {
if (state is NotificationLoaded) {
final currentState = state as NotificationLoaded;
try {
await _repository.markAsRead(event.id);
final updatedItems = currentState.items.map((item) {
if (item.id == event.id) {
return NotificationItem(
id: item.id,
title: item.title,
body: item.body,
date: item.date,
isRead: true,
category: item.category,
);
}
return item;
}).toList();
emit(NotificationLoaded(items: updatedItems));
} catch (e, st) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
AppLogger.error('NotificationBloc: marquer comme lu échoué', error: e, stackTrace: st);
emit(NotificationError('Impossible de marquer comme lu'));
}
}
}
}