55 lines
2.0 KiB
Dart
55 lines
2.0 KiB
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) {
|
|
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) {
|
|
AppLogger.error('NotificationBloc: marquer comme lu échoué', error: e, stackTrace: st);
|
|
emit(NotificationError('Impossible de marquer comme lu'));
|
|
}
|
|
}
|
|
}
|
|
}
|