70 lines
2.2 KiB
Swift
70 lines
2.2 KiB
Swift
//
|
|
// MessageCenterViewController.swift
|
|
// suixinkan
|
|
//
|
|
// Created by Codex on 2026/6/26.
|
|
//
|
|
|
|
import UIKit
|
|
|
|
/// 消息中心列表页。
|
|
final class MessageCenterViewController: ModuleTableViewController {
|
|
private let viewModel = MessageCenterViewModel()
|
|
|
|
override func viewDidLoad() {
|
|
title = "消息中心"
|
|
navigationItem.rightBarButtonItem = UIBarButtonItem(
|
|
title: "全部已读",
|
|
style: .plain,
|
|
target: self,
|
|
action: #selector(markAllRead)
|
|
)
|
|
super.viewDidLoad()
|
|
wireViewModel(viewModel) { [weak self] in self?.updateBarButtons() }
|
|
}
|
|
|
|
override func tableRowCount() -> Int {
|
|
viewModel.messages.count
|
|
}
|
|
|
|
override func configureCell(_ cell: TitleSubtitleTableViewCell, at indexPath: IndexPath) {
|
|
let item = viewModel.messages[indexPath.row]
|
|
cell.configure(
|
|
title: item.title,
|
|
subtitle: item.detail,
|
|
detail: item.isRead ? item.time : "未读 · \(item.time)"
|
|
)
|
|
cell.accessoryType = item.isRead ? .none : .disclosureIndicator
|
|
}
|
|
|
|
override func didSelectTableRow(at indexPath: IndexPath) {
|
|
let item = viewModel.messages[indexPath.row]
|
|
Task {
|
|
try? await viewModel.markAsRead(api: services.messageCenterAPI, item: item)
|
|
showAlert(title: item.title, message: item.detail)
|
|
}
|
|
}
|
|
|
|
override func reloadContent() async {
|
|
isLoading = viewModel.messages.isEmpty
|
|
await viewModel.reloadFirstPage(api: services.messageCenterAPI)
|
|
isLoading = false
|
|
}
|
|
|
|
@objc private func markAllRead() {
|
|
Task { try? await viewModel.markAllAsRead(api: services.messageCenterAPI) }
|
|
}
|
|
|
|
private func updateBarButtons() {
|
|
navigationItem.rightBarButtonItem?.isEnabled = viewModel.unreadCount > 0 && !viewModel.messages.isEmpty
|
|
}
|
|
|
|
private func showAlert(title: String, message: String) {
|
|
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
|
|
alert.addAction(UIAlertAction(title: "知道了", style: .default))
|
|
present(alert, animated: true)
|
|
}
|
|
}
|
|
|
|
extension MessageCenterViewModel: ViewModelBindable {}
|