feat: 接入消息未读数、全部已读与首页红点角标同步。

固定消息中心为首页入口,并在推送到达、已读后刷新桌面角标。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-21 18:02:43 +08:00
co-authored by Cursor
parent e7f1d777dd
commit caeeb9a1cf
18 changed files with 748 additions and 37 deletions
@@ -25,6 +25,7 @@ final class HomeViewModel {
private(set) var reportTimeText = ""
private(set) var isLocationReporting = false
private(set) var needsPermissionReload = false
private(set) var unreadMessageCount = 0
var onStateChange: (() -> Void)?
var onShowMessage: ((String) -> Void)?
@@ -65,6 +66,7 @@ final class HomeViewModel {
var isOnline: Bool { locationStateStore.isOnline }
var countdownDisplayText: String { locationStateStore.countdownDisplayText }
var reminderMinutes: Int { locationStateStore.reminderMinutes }
var hasUnreadMessages: Bool { unreadMessageCount > 0 }
/// 首次进入首页时加载权限并恢复在线状态。
func initialize(api: HomeAPI) async {
@@ -76,6 +78,28 @@ final class HomeViewModel {
/// 账号切换后标记需要重新拉取权限。
func markNeedsPermissionReload() {
needsPermissionReload = true
unreadMessageCount = 0
}
/// 查询未读消息总数,成功时更新首页状态并返回 `true`。
func refreshUnreadMessageStatus(api: any MessageCenterServing) async -> Bool {
do {
let response = try await api.unreadCount()
unreadMessageCount = response.unreadCount
notifyStateChange()
return true
} catch is CancellationError {
return false
} catch {
// 查询失败时保留上一次状态,避免网络抖动导致红点错误消失。
return false
}
}
/// 使用已知的最新未读消息数量立即刷新首页状态。
func updateUnreadMessageCount(_ count: Int) {
unreadMessageCount = max(count, 0)
notifyStateChange()
}
/// 查询待审核记录并决定进入申请页或审核状态页。