MessageTableViewCellViewModel.swift 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. //
  2. // MessageTableViewCellViewModel.swift
  3. // Bark
  4. //
  5. // Created by huangfeng on 2020/11/21.
  6. // Copyright © 2020 Fin. All rights reserved.
  7. //
  8. import Differentiator
  9. import Foundation
  10. import RxCocoa
  11. import RxDataSources
  12. enum MessageListCellDateStyle {
  13. /// 相对时间,例如 1分钟前、1小时前
  14. case relative
  15. /// 精确时间,例如 2024-01-01 12:00
  16. case exact
  17. }
  18. class MessageTableViewCellViewModel: ViewModel {
  19. let message: Message
  20. let title: BehaviorRelay<String>
  21. let body: BehaviorRelay<String>
  22. let url: BehaviorRelay<String>
  23. let date = BehaviorRelay<String>(value: "")
  24. var dateStyle = BehaviorRelay<MessageListCellDateStyle>(value: .relative)
  25. init(message: Message) {
  26. self.message = message
  27. self.title = BehaviorRelay<String>(value: message.title ?? "")
  28. self.body = BehaviorRelay<String>(value: message.body ?? "")
  29. self.url = BehaviorRelay<String>(value: message.url ?? "")
  30. super.init()
  31. dateStyle.map { style in
  32. switch style {
  33. case .relative:
  34. return self.message.createDate?.agoFormatString() ?? ""
  35. case .exact:
  36. return self.message.createDate?.formatString(format: "yyyy-MM-dd HH:mm") ?? ""
  37. }
  38. }
  39. .bind(to: date)
  40. .disposed(by: rx.disposeBag)
  41. }
  42. }
  43. struct MessageSection {
  44. var header: String
  45. var messages: [MessageTableViewCellViewModel]
  46. }
  47. extension MessageSection: AnimatableSectionModelType {
  48. typealias Item = MessageTableViewCellViewModel
  49. typealias Identity = String
  50. var items: [MessageTableViewCellViewModel] {
  51. return self.messages
  52. }
  53. init(original: MessageSection, items: [MessageTableViewCellViewModel]) {
  54. self = original
  55. self.messages = items
  56. }
  57. var identity: String {
  58. return header
  59. }
  60. }
  61. extension MessageTableViewCellViewModel: IdentifiableType {
  62. typealias Identity = String
  63. var identity: String {
  64. return "\(self.message.id)"
  65. }
  66. override func isEqual(_ object: Any?) -> Bool {
  67. if let obj = object as? MessageTableViewCellViewModel {
  68. return self.identity == obj.identity
  69. }
  70. return super.isEqual(object)
  71. }
  72. }