查看指定分组

This commit is contained in:
Fin 2024-12-27 14:18:27 +08:00
parent a82f65833f
commit 80f2bda954
4 changed files with 67 additions and 7 deletions

View File

@ -137,6 +137,11 @@ class MessageListViewController: BaseViewController<MessageListViewModel> {
} }
} }
} }
cell.showGroupMessageAction = { [weak self] group in
let viewModel = MessageListViewModel(sourceType: .group(group))
let controller = MessageListViewController(viewModel: viewModel)
self?.navigationController?.pushViewController(controller, animated: true)
}
cell.cellData = (title, max(0, totalCount - messages.count), messages) cell.cellData = (title, max(0, totalCount - messages.count), messages)
cell.isExpanded = self.expandedGroup.contains(title) cell.isExpanded = self.expandedGroup.contains(title)
return cell return cell
@ -205,6 +210,9 @@ class MessageListViewController: BaseViewController<MessageListViewModel> {
// //
output.title output.title
.drive(self.navigationItem.rx.title).disposed(by: rx.disposeBag) .drive(self.navigationItem.rx.title).disposed(by: rx.disposeBag)
output.groupToggleButtonHidden
.drive((groupButton.customView as! UIButton).rx.isHidden).disposed(by: rx.disposeBag)
} }
private func getBatchDeleteDriver() -> Driver<MessageDeleteType> { private func getBatchDeleteDriver() -> Driver<MessageDeleteType> {
@ -289,7 +297,7 @@ extension MessageListViewController: UITableViewDelegate {
let action = UIContextualAction(style: .destructive, title: NSLocalizedString("removeMessage")) { [weak self] _, _, actionPerformed in let action = UIContextualAction(style: .destructive, title: NSLocalizedString("removeMessage")) { [weak self] _, _, actionPerformed in
guard let self else { return } guard let self else { return }
if let cell = self.tableView.cellForRow(at: indexPath) as? MessageTableViewCell { if self.tableView.cellForRow(at: indexPath) is MessageTableViewCell {
// //
self.tableView.dataSource?.tableView?(self.tableView, commit: .delete, forRowAt: indexPath) self.tableView.dataSource?.tableView?(self.tableView, commit: .delete, forRowAt: indexPath)
actionPerformed(true) actionPerformed(true)

View File

@ -19,6 +19,13 @@ enum MessageListType: Int, Codable {
case group case group
} }
enum MessageSourceType {
///
case all
///
case group(String?)
}
class MessageListViewModel: ViewModel, ViewModelType { class MessageListViewModel: ViewModel, ViewModelType {
struct Input { struct Input {
/// ///
@ -48,6 +55,8 @@ class MessageListViewModel: ViewModel, ViewModelType {
var type: Driver<MessageListType> var type: Driver<MessageListType>
/// ///
var title: Driver<String> var title: Driver<String>
///
var groupToggleButtonHidden: Driver<Bool>
} }
private static let typeKey = "me.fin.messageListType" private static let typeKey = "me.fin.messageListType"
@ -63,6 +72,9 @@ class MessageListViewModel: ViewModel, ViewModelType {
} }
} }
///
private var sourceType: MessageSourceType = .all
/// ///
private var page = 0 private var page = 0
/// ///
@ -73,6 +85,11 @@ class MessageListViewModel: ViewModel, ViewModelType {
/// ///
private var results: Results<Message>? private var results: Results<Message>?
convenience init(sourceType: MessageSourceType) {
self.init()
self.sourceType = sourceType
}
/// ///
private func getResults(filterGroups: [String?], searchText: String?) -> Results<Message>? { private func getResults(filterGroups: [String?], searchText: String?) -> Results<Message>? {
if let realm = try? Realm() { if let realm = try? Realm() {
@ -157,6 +174,10 @@ class MessageListViewModel: ViewModel, ViewModelType {
} }
private func getNextPage() -> [MessageListCellItem] { private func getNextPage() -> [MessageListCellItem] {
if case .group = self.sourceType {
//
return getListNextPage()
}
if type == .list { if type == .list {
return getListNextPage() return getListNextPage()
} }
@ -191,9 +212,12 @@ class MessageListViewModel: ViewModel, ViewModelType {
// //
let refreshAction = BehaviorRelay<MJRefreshAction>(value: .none) let refreshAction = BehaviorRelay<MJRefreshAction>(value: .none)
// //
let filterGroups: BehaviorRelay<[String?]> = { let filterGroups: BehaviorRelay<[String?]> = { [weak self] in
if let groups: [String?] = Settings["me.fin.filterGroups"] { guard let self = self else {
return BehaviorRelay<[String?]>(value: groups) return BehaviorRelay<[String?]>(value: [])
}
if case .group(let name) = self.sourceType {
return BehaviorRelay<[String?]>(value: [name])
} }
return BehaviorRelay<[String?]>(value: []) return BehaviorRelay<[String?]>(value: [])
}() }()
@ -344,12 +368,21 @@ class MessageListViewModel: ViewModel, ViewModelType {
}).disposed(by: rx.disposeBag) }).disposed(by: rx.disposeBag)
//
let groupToggleButtonHidden = {
if case .group = self.sourceType {
return true
}
return false
}()
return Output( return Output(
messages: messagesRelay.asDriver(onErrorJustReturn: []), messages: messagesRelay.asDriver(onErrorJustReturn: []),
refreshAction: refreshAction.asDriver(), refreshAction: refreshAction.asDriver(),
alertMessage: alertMessage, alertMessage: alertMessage,
type: Driver.merge(messageTypeChanged.asDriver(), Driver.just(self.type)), type: Driver.merge(messageTypeChanged.asDriver(), Driver.just(self.type)),
title: titleRelay.asDriver() title: titleRelay.asDriver(),
groupToggleButtonHidden: Driver.just(groupToggleButtonHidden)
) )
} }
} }

View File

@ -22,7 +22,18 @@ enum MessageListCellItem: Equatable {
case (.message(let l), .message(let r)): case (.message(let l), .message(let r)):
return l.id == r.id && l.dateText == r.dateText return l.id == r.id && l.dateText == r.dateText
case (.messageGroup(let l, _, let lMessages), .messageGroup(let r, _, let rMessages)): case (.messageGroup(let l, _, let lMessages), .messageGroup(let r, _, let rMessages)):
return l == r && lMessages.first?.dateText == rMessages.first?.dateText if l != r {
return false
}
if lMessages.first?.dateText != rMessages.first?.dateText {
return false
}
for (lMessage, rMessage) in zip(lMessages, rMessages) {
if lMessage.id != rMessage.id {
return false
}
}
return true
default: default:
return false return false
} }

View File

@ -136,6 +136,9 @@ class MessageGroupTableViewCell: UITableViewCell {
groupHeader.clearAction = newValue groupHeader.clearAction = newValue
} }
} }
///
var showGroupMessageAction: ((_ group: String?) -> Void)? = nil
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier) super.init(style: style, reuseIdentifier: reuseIdentifier)
@ -162,7 +165,12 @@ class MessageGroupTableViewCell: UITableViewCell {
make.bottom.equalToSuperview().offset(-18) make.bottom.equalToSuperview().offset(-18)
make.centerX.equalToSuperview() make.centerX.equalToSuperview()
} }
moreView.addGestureRecognizer(UITapGestureRecognizer())
moreView.gestureRecognizers?.first?.rx.event.subscribe(onNext: { [weak self] _ in
self?.showGroupMessageAction?(self?.messages.first?.group)
}).disposed(by: self.rx.disposeBag)
refreshViewState() refreshViewState()
} }