import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; import 'package:result_monad/result_monad.dart'; import '../globals.dart'; import '../models/exec_error.dart'; import '../models/user_notification.dart'; import 'auth_service.dart'; class NotificationsManager extends ChangeNotifier { static final _logger = Logger('NotificationManager'); final _notifications = {}; List get notifications { final result = List.from(_notifications.values); result.sort((n1, n2) { if (n1.seen == n2.seen) { return n2.timestamp.compareTo(n1.timestamp); } if (n1.seen && !n2.seen) { return 1; } return -1; }); return result; } FutureResult, ExecError> updateNotifications() async { final auth = getIt(); final clientResult = auth.currentClient; if (clientResult.isFailure) { _logger.severe('Error getting Friendica client: ${clientResult.error}'); return clientResult.errorCast(); } final client = clientResult.value; final result = await client.getNotifications(); if (result.isFailure) { return result.errorCast(); } for (final n in result.value) { _notifications[n.id] = n; } notifyListeners(); return Result.ok(notifications); } FutureResult markSeen(UserNotification notification) async { final auth = getIt(); final clientResult = auth.currentClient; if (clientResult.isFailure) { _logger.severe('Error getting Friendica client: ${clientResult.error}'); return clientResult.errorCast(); } final client = clientResult.value; final result = await client.clearNotification(notification); if (result.isSuccess) { notifyListeners(); } updateNotifications(); return result; } FutureResult, ExecError> markAllAsRead() async { final auth = getIt(); final clientResult = auth.currentClient; if (clientResult.isFailure) { _logger.severe('Error getting Friendica client: ${clientResult.error}'); return clientResult.errorCast(); } final client = clientResult.value; final unreadNotifications = _notifications.values.where((n) => !n.seen).toList(); final result = await client.clearNotifications(unreadNotifications); if (result.isFailure) { return result.errorCast(); } notifyListeners(); return updateNotifications(); } }