mirror of
https://github.com/Finb/Bark.git
synced 2025-12-08 21:36:01 +00:00
81 lines
2.1 KiB
Swift
81 lines
2.1 KiB
Swift
//
|
||
// MessageTableViewCellViewModel.swift
|
||
// Bark
|
||
//
|
||
// Created by huangfeng on 2020/11/21.
|
||
// Copyright © 2020 Fin. All rights reserved.
|
||
//
|
||
|
||
import Differentiator
|
||
import Foundation
|
||
import RxCocoa
|
||
import RxDataSources
|
||
|
||
enum MessageListCellItem: Equatable {
|
||
/// 单条消息
|
||
case message(model: MessageItemModel)
|
||
/// 一组消息,可以收缩折叠
|
||
case messageGroup(name: String, totalCount: Int, messages: [MessageItemModel])
|
||
|
||
static func == (lhs: Self, rhs: Self) -> Bool {
|
||
switch (lhs, rhs) {
|
||
case (.message(let l), .message(let r)):
|
||
return l.id == r.id && l.dateText == r.dateText
|
||
case (.messageGroup(let l, _, let lMessages), .messageGroup(let r, _, let rMessages)):
|
||
if l != r {
|
||
return false
|
||
}
|
||
if lMessages.first?.dateText != rMessages.first?.dateText {
|
||
return false
|
||
}
|
||
if lMessages.count != rMessages.count {
|
||
return false
|
||
}
|
||
for (lMessage, rMessage) in zip(lMessages, rMessages) {
|
||
if lMessage.id != rMessage.id {
|
||
return false
|
||
}
|
||
}
|
||
return true
|
||
default:
|
||
return false
|
||
}
|
||
}
|
||
}
|
||
|
||
extension MessageListCellItem: IdentifiableType {
|
||
typealias Identity = String
|
||
|
||
var identity: String {
|
||
switch self {
|
||
case .message(let model):
|
||
return "list_\(model.id)"
|
||
case .messageGroup(_, _, let messages):
|
||
return "group_\(messages.first?.id ?? "")"
|
||
}
|
||
}
|
||
}
|
||
|
||
struct MessageSection {
|
||
var header: String
|
||
var messages: [MessageListCellItem]
|
||
}
|
||
|
||
extension MessageSection: AnimatableSectionModelType {
|
||
typealias Item = MessageListCellItem
|
||
typealias Identity = String
|
||
|
||
var items: [MessageListCellItem] {
|
||
return self.messages
|
||
}
|
||
|
||
init(original: MessageSection, items: [MessageListCellItem]) {
|
||
self = original
|
||
self.messages = items
|
||
}
|
||
|
||
var identity: String {
|
||
return header
|
||
}
|
||
}
|