mirror of
https://github.com/FoggedLens/deflock-app.git
synced 2026-08-30 22:50:50 +02:00
add changeset comment tracking and message notification bubble on startup
This commit is contained in:
@@ -1,22 +1,28 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import '../services/osm_messages_service.dart';
|
||||
import '../services/changeset_comments_service.dart';
|
||||
import 'settings_state.dart';
|
||||
|
||||
/// State management for OSM message notifications
|
||||
/// State management for OSM message and changeset comment notifications
|
||||
class MessagesState extends ChangeNotifier {
|
||||
final OSMMessagesService _messagesService = OSMMessagesService();
|
||||
final ChangesetCommentsService _changesetCommentsService = ChangesetCommentsService();
|
||||
|
||||
int? _unreadCount;
|
||||
int? _unreadChangesetId; // ID of a changeset with unread comments, if any
|
||||
bool _isChecking = false;
|
||||
|
||||
// Getters
|
||||
int? get unreadCount => _unreadCount;
|
||||
bool get hasUnreadMessages => (_unreadCount ?? 0) > 0;
|
||||
bool get hasUnreadChangesetComments => _unreadChangesetId != null;
|
||||
bool get hasUnreadNotifications => hasUnreadMessages || hasUnreadChangesetComments;
|
||||
bool get isChecking => _isChecking;
|
||||
|
||||
/// Check for unread messages
|
||||
/// Check for unread messages and changeset comments
|
||||
Future<void> checkMessages({
|
||||
required String? accessToken,
|
||||
required String? username,
|
||||
required UploadMode uploadMode,
|
||||
bool forceRefresh = false,
|
||||
}) async {
|
||||
@@ -26,18 +32,29 @@ class MessagesState extends ChangeNotifier {
|
||||
notifyListeners();
|
||||
|
||||
try {
|
||||
final count = await _messagesService.getUnreadMessageCount(
|
||||
accessToken: accessToken,
|
||||
uploadMode: uploadMode,
|
||||
forceRefresh: forceRefresh,
|
||||
);
|
||||
final results = await Future.wait([
|
||||
_messagesService.getUnreadMessageCount(
|
||||
accessToken: accessToken,
|
||||
uploadMode: uploadMode,
|
||||
forceRefresh: forceRefresh,
|
||||
),
|
||||
_changesetCommentsService.getUnreadChangesetId(
|
||||
username: username,
|
||||
uploadMode: uploadMode,
|
||||
forceRefresh: forceRefresh,
|
||||
),
|
||||
]);
|
||||
|
||||
if (_unreadCount != count) {
|
||||
final count = results[0] as int?;
|
||||
final unreadChangesetId = results[1] as int?;
|
||||
|
||||
if (_unreadCount != count || _unreadChangesetId != unreadChangesetId) {
|
||||
_unreadCount = count;
|
||||
_unreadChangesetId = unreadChangesetId;
|
||||
notifyListeners();
|
||||
}
|
||||
} catch (e) {
|
||||
// Silently handle errors - messages are not critical
|
||||
// Silently handle errors - notifications are not critical
|
||||
debugPrint('MessagesState: Error checking messages: $e');
|
||||
} finally {
|
||||
_isChecking = false;
|
||||
@@ -45,6 +62,26 @@ class MessagesState extends ChangeNotifier {
|
||||
}
|
||||
}
|
||||
|
||||
/// URL of the changeset with unread comments, on OSM's website, or null
|
||||
/// if there are no unread changeset comments.
|
||||
String? getUnreadChangesetUrl(UploadMode uploadMode) {
|
||||
final id = _unreadChangesetId;
|
||||
if (id == null) return null;
|
||||
return _changesetCommentsService.getChangesetUrl(id, uploadMode);
|
||||
}
|
||||
|
||||
/// Mark changeset comments as read (called when user views the changeset on OSM)
|
||||
Future<void> markChangesetCommentsRead({
|
||||
required String? username,
|
||||
required UploadMode uploadMode,
|
||||
}) async {
|
||||
await _changesetCommentsService.markRead(username: username, uploadMode: uploadMode);
|
||||
if (_unreadChangesetId != null) {
|
||||
_unreadChangesetId = null;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
/// Get the URL to view messages
|
||||
String getMessagesUrl(UploadMode uploadMode) {
|
||||
return _messagesService.getMessagesUrl(uploadMode);
|
||||
@@ -53,7 +90,9 @@ class MessagesState extends ChangeNotifier {
|
||||
/// Clear message state (when user logs out or changes mode)
|
||||
void clearMessages() {
|
||||
_unreadCount = null;
|
||||
_unreadChangesetId = null;
|
||||
_messagesService.clearCache();
|
||||
_changesetCommentsService.clearCache();
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user