diff --git a/ChattoAdditions/Source/Chat Items/BaseMessage/BaseMessagePresenter.swift b/ChattoAdditions/Source/Chat Items/BaseMessage/BaseMessagePresenter.swift index 95d5167cb..09b81b75e 100644 --- a/ChattoAdditions/Source/Chat Items/BaseMessage/BaseMessagePresenter.swift +++ b/ChattoAdditions/Source/Chat Items/BaseMessage/BaseMessagePresenter.swift @@ -28,6 +28,7 @@ import Chatto public protocol ViewModelBuilderProtocol { typealias ModelT: MessageModelProtocol typealias ViewModelT: MessageViewModelProtocol + func canCreateViewModel(fromModel model: Any) -> Bool func createViewModel(model: ModelT) -> ViewModelT } @@ -40,7 +41,6 @@ public protocol BaseMessageInteractionHandlerProtocol { public class BaseMessagePresenter diff --git a/ChattoAdditions/Source/Chat Items/PhotoMessages/PhotoMessagePresenterBuilder.swift b/ChattoAdditions/Source/Chat Items/PhotoMessages/PhotoMessagePresenterBuilder.swift index 7643fc449..a35ee1396 100644 --- a/ChattoAdditions/Source/Chat Items/PhotoMessages/PhotoMessagePresenterBuilder.swift +++ b/ChattoAdditions/Source/Chat Items/PhotoMessages/PhotoMessagePresenterBuilder.swift @@ -27,7 +27,6 @@ import Chatto public class PhotoMessagePresenterBuilder Bool { - return chatItem is PhotoMessageModelProtocol ? true : false + return self.viewModelBuilder.canCreateViewModel(fromModel: chatItem) } public func createPresenterWithChatItem(chatItem: ChatItemProtocol) -> ChatItemPresenterProtocol { diff --git a/ChattoAdditions/Source/Chat Items/PhotoMessages/PhotoMessageViewModel.swift b/ChattoAdditions/Source/Chat Items/PhotoMessages/PhotoMessageViewModel.swift index c53f2b0c3..e6f1860a3 100644 --- a/ChattoAdditions/Source/Chat Items/PhotoMessages/PhotoMessageViewModel.swift +++ b/ChattoAdditions/Source/Chat Items/PhotoMessages/PhotoMessageViewModel.swift @@ -80,14 +80,18 @@ public class PhotoMessageViewModel: PhotoMessageViewModelProtocol { } } -public class PhotoMessageViewModelDefaultBuilder: ViewModelBuilderProtocol { +public class PhotoMessageViewModelDefaultBuilder: ViewModelBuilderProtocol { public init() { } let messageViewModelBuilder = MessageViewModelDefaultBuilder() - public func createViewModel(model: PhotoMessageModel) -> PhotoMessageViewModel { + public func createViewModel(model: ModelT) -> PhotoMessageViewModel { let messageViewModel = self.messageViewModelBuilder.createMessageViewModel(model) let photoMessageViewModel = PhotoMessageViewModel(photoMessage: model, messageViewModel: messageViewModel) return photoMessageViewModel } + + public func canCreateViewModel(fromModel model: Any) -> Bool { + return model is ModelT + } } diff --git a/ChattoAdditions/Source/Chat Items/TextMessages/TextMessagePresenter.swift b/ChattoAdditions/Source/Chat Items/TextMessages/TextMessagePresenter.swift index 0cedc7017..1e8f452ed 100644 --- a/ChattoAdditions/Source/Chat Items/TextMessages/TextMessagePresenter.swift +++ b/ChattoAdditions/Source/Chat Items/TextMessages/TextMessagePresenter.swift @@ -26,7 +26,6 @@ import UIKit public class TextMessagePresenter diff --git a/ChattoAdditions/Source/Chat Items/TextMessages/TextMessagePresenterBuilder.swift b/ChattoAdditions/Source/Chat Items/TextMessages/TextMessagePresenterBuilder.swift index db2c444af..d0b720f7c 100644 --- a/ChattoAdditions/Source/Chat Items/TextMessages/TextMessagePresenterBuilder.swift +++ b/ChattoAdditions/Source/Chat Items/TextMessages/TextMessagePresenterBuilder.swift @@ -27,7 +27,6 @@ import Chatto public class TextMessagePresenterBuilder @@ -63,7 +62,7 @@ public class TextMessagePresenterBuilder Bool { - return chatItem is TextMessageModelProtocol ? true : false + return self.viewModelBuilder.canCreateViewModel(fromModel: chatItem) } public func createPresenterWithChatItem(chatItem: ChatItemProtocol) -> ChatItemPresenterProtocol { diff --git a/ChattoAdditions/Source/Chat Items/TextMessages/TextMessageViewModel.swift b/ChattoAdditions/Source/Chat Items/TextMessages/TextMessageViewModel.swift index 07c73282f..bbb39d1b8 100644 --- a/ChattoAdditions/Source/Chat Items/TextMessages/TextMessageViewModel.swift +++ b/ChattoAdditions/Source/Chat Items/TextMessages/TextMessageViewModel.swift @@ -38,15 +38,19 @@ public class TextMessageViewModel: TextMessageViewModelProtocol { } } -public class TextMessageViewModelDefaultBuilder: ViewModelBuilderProtocol { +public class TextMessageViewModelDefaultBuilder: ViewModelBuilderProtocol { public init() { } let messageViewModelBuilder = MessageViewModelDefaultBuilder() - public func createViewModel(model: TextMessageModel) -> TextMessageViewModel { + public func createViewModel(model: ModelT) -> TextMessageViewModel { let messageViewModel = self.messageViewModelBuilder.createMessageViewModel(model) let textMessageViewModel = TextMessageViewModel(text: model.text, messageViewModel: messageViewModel) return textMessageViewModel } + + public func canCreateViewModel(fromModel model: Any) -> Bool { + return model is ModelT + } } diff --git a/ChattoAdditions/Tests/Chat Items/BaseMessage/BaseMessagePresenterTests.swift b/ChattoAdditions/Tests/Chat Items/BaseMessage/BaseMessagePresenterTests.swift index ad5e450b6..2aa8ddd14 100644 --- a/ChattoAdditions/Tests/Chat Items/BaseMessage/BaseMessagePresenterTests.swift +++ b/ChattoAdditions/Tests/Chat Items/BaseMessage/BaseMessagePresenterTests.swift @@ -29,11 +29,11 @@ import Chatto class BaseMessagePresenterTests: XCTestCase { // BaseMessagePresenter is generic, let's use the photo one for instance - var presenter: PhotoMessagePresenter! + var presenter: PhotoMessagePresenter, PhotoMessageTestHandler>! let decorationAttributes = ChatItemDecorationAttributes(bottomMargin: 0, showsTail: false) var interactionHandler: PhotoMessageTestHandler! override func setUp() { - let viewModelBuilder = PhotoMessageViewModelDefaultBuilder() + let viewModelBuilder = PhotoMessageViewModelDefaultBuilder() let sizingCell = PhotoMessageCollectionViewCell.sizingCell() let photoStyle = PhotoMessageCollectionViewCellDefaultStyle() let baseStyle = BaseMessageCollectionViewCellDefaultSyle() diff --git a/ChattoAdditions/Tests/Chat Items/PhotoMessages/PhotoMessagePresenterBuilderTests.swift b/ChattoAdditions/Tests/Chat Items/PhotoMessages/PhotoMessagePresenterBuilderTests.swift index 5a40d9d3d..36b0b15ee 100644 --- a/ChattoAdditions/Tests/Chat Items/PhotoMessages/PhotoMessagePresenterBuilderTests.swift +++ b/ChattoAdditions/Tests/Chat Items/PhotoMessages/PhotoMessagePresenterBuilderTests.swift @@ -30,7 +30,7 @@ class PhotoMessagePresenterBuilderTests: XCTestCase { func testThat_CreatesPresenter() { let messageModel = MessageModel(uid: "uid", senderId: "senderId", type: "photo-message", isIncoming: true, date: NSDate(), status: .Success) let photoMessageModel = PhotoMessageModel(messageModel: messageModel, imageSize: CGSize(width: 30, height: 30), image: UIImage()) - let builder = PhotoMessagePresenterBuilder(viewModelBuilder: PhotoMessageViewModelDefaultBuilder(), interactionHandler: PhotoMessageTestHandler()) + let builder = PhotoMessagePresenterBuilder(viewModelBuilder: PhotoMessageViewModelDefaultBuilder(), interactionHandler: PhotoMessageTestHandler()) XCTAssertNotNil(builder.createPresenterWithChatItem(photoMessageModel)) } } diff --git a/ChattoAdditions/Tests/Chat Items/PhotoMessages/PhotoMessagePresenterTests.swift b/ChattoAdditions/Tests/Chat Items/PhotoMessages/PhotoMessagePresenterTests.swift index 01195fd7f..3f08da655 100644 --- a/ChattoAdditions/Tests/Chat Items/PhotoMessages/PhotoMessagePresenterTests.swift +++ b/ChattoAdditions/Tests/Chat Items/PhotoMessages/PhotoMessagePresenterTests.swift @@ -27,11 +27,11 @@ import XCTest class PhotoMessagePresenterTests: XCTestCase, UICollectionViewDataSource { - var presenter: PhotoMessagePresenter! + var presenter: PhotoMessagePresenter, PhotoMessageTestHandler>! let decorationAttributes = ChatItemDecorationAttributes(bottomMargin: 0, showsTail: false) let testImage = UIImage() override func setUp() { - let viewModelBuilder = PhotoMessageViewModelDefaultBuilder() + let viewModelBuilder = PhotoMessageViewModelDefaultBuilder() let sizingCell = PhotoMessageCollectionViewCell.sizingCell() let photoStyle = PhotoMessageCollectionViewCellDefaultStyle() let baseStyle = BaseMessageCollectionViewCellDefaultSyle() @@ -57,7 +57,7 @@ class PhotoMessagePresenterTests: XCTestCase, UICollectionViewDataSource { func testThat_RegistersAndDequeuesCells() { let collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: UICollectionViewFlowLayout()) - PhotoMessagePresenter.registerCells(collectionView) + PhotoMessagePresenter, PhotoMessageTestHandler>.registerCells(collectionView) collectionView.dataSource = self collectionView.reloadData() XCTAssertNotNil(self.presenter.dequeueCell(collectionView: collectionView, indexPath: NSIndexPath(forItem: 0, inSection: 0))) diff --git a/ChattoAdditions/Tests/Chat Items/TextMessages/TextMessagePresenterBuilderTests.swift b/ChattoAdditions/Tests/Chat Items/TextMessages/TextMessagePresenterBuilderTests.swift index fa1eac541..4ea064193 100644 --- a/ChattoAdditions/Tests/Chat Items/TextMessages/TextMessagePresenterBuilderTests.swift +++ b/ChattoAdditions/Tests/Chat Items/TextMessages/TextMessagePresenterBuilderTests.swift @@ -30,7 +30,7 @@ class TextMessagePresenterBuilderTests: XCTestCase { func testThat_CreatesPresenter() { let messageModel = MessageModel(uid: "uid", senderId: "senderId", type: "text-message", isIncoming: true, date: NSDate(), status: .Success) let textMessageModel = TextMessageModel(messageModel: messageModel, text: "Some text") - let builder = TextMessagePresenterBuilder(viewModelBuilder: TextMessageViewModelDefaultBuilder(), interactionHandler: TextMessageTestHandler()) + let builder = TextMessagePresenterBuilder(viewModelBuilder: TextMessageViewModelDefaultBuilder(), interactionHandler: TextMessageTestHandler()) XCTAssertNotNil(builder.createPresenterWithChatItem(textMessageModel)) } } diff --git a/ChattoAdditions/Tests/Chat Items/TextMessages/TextMessagePresenterTests.swift b/ChattoAdditions/Tests/Chat Items/TextMessages/TextMessagePresenterTests.swift index c67200172..314d17b61 100644 --- a/ChattoAdditions/Tests/Chat Items/TextMessages/TextMessagePresenterTests.swift +++ b/ChattoAdditions/Tests/Chat Items/TextMessages/TextMessagePresenterTests.swift @@ -28,10 +28,10 @@ import Chatto class TextMessagePresenterTests: XCTestCase, UICollectionViewDataSource { - var presenter: TextMessagePresenter! + var presenter: TextMessagePresenter, TextMessageTestHandler>! let decorationAttributes = ChatItemDecorationAttributes(bottomMargin: 0, showsTail: false) override func setUp() { - let viewModelBuilder = TextMessageViewModelDefaultBuilder() + let viewModelBuilder = TextMessageViewModelDefaultBuilder() let sizingCell = TextMessageCollectionViewCell.sizingCell() let textStyle = TextMessageCollectionViewCellDefaultStyle() let baseStyle = BaseMessageCollectionViewCellDefaultSyle() @@ -43,7 +43,7 @@ class TextMessagePresenterTests: XCTestCase, UICollectionViewDataSource { func testThat_RegistersAndDequeuesCells() { let collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: UICollectionViewFlowLayout()) - TextMessagePresenter.registerCells(collectionView) + TextMessagePresenter, TextMessageTestHandler>.registerCells(collectionView) collectionView.dataSource = self collectionView.reloadData() XCTAssertNotNil(self.presenter.dequeueCell(collectionView: collectionView, indexPath: NSIndexPath(forItem: 0, inSection: 0))) diff --git a/ChattoApp/ChattoApp/DemoChatViewController.swift b/ChattoApp/ChattoApp/DemoChatViewController.swift index 0d179d231..2c52c5422 100644 --- a/ChattoApp/ChattoApp/DemoChatViewController.swift +++ b/ChattoApp/ChattoApp/DemoChatViewController.swift @@ -71,7 +71,7 @@ class DemoChatViewController: BaseChatViewController { return [ TextMessageModel.chatItemType: [ TextMessagePresenterBuilder( - viewModelBuilder: TextMessageViewModelDefaultBuilder(), + viewModelBuilder: TextMessageViewModelDefaultBuilder(), interactionHandler: TextMessageHandler(baseHandler: self.baseMessageHandler) ) ], diff --git a/ChattoApp/ChattoApp/FakePhotoMessageViewModel.swift b/ChattoApp/ChattoApp/FakePhotoMessageViewModel.swift index 602a7239d..7429f15d1 100644 --- a/ChattoApp/ChattoApp/FakePhotoMessageViewModel.swift +++ b/ChattoApp/ChattoApp/FakePhotoMessageViewModel.swift @@ -74,4 +74,8 @@ public class FakePhotoMessageViewModelBuilder: ViewModelBuilderProtocol { let photoMessageViewModel = FakePhotoMessageViewModel(photoMessage: model, messageViewModel: messageViewModel) return photoMessageViewModel } + + public func canCreateViewModel(fromModel model: Any) -> Bool { + return model is PhotoMessageModel + } } diff --git a/README.md b/README.md index 37930a2f4..38bb347b6 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ override func createPresenterBuilders() -> [ChatItemType: [ChatItemPresenterBuil return [ TextMessageModel.chatItemType: [ TextMessagePresenterBuilder( - viewModelBuilder: TextMessageViewModelDefaultBuilder(), + viewModelBuilder: TextMessageViewModelDefaultBuilder(), interactionHandler: TextMessageHandler(baseHandler: self.baseMessageHandler) ) ]