Skip to content

Commit

Permalink
Pull to refresh working
Browse files Browse the repository at this point in the history
  • Loading branch information
bensmiley committed May 12, 2021
1 parent 02dadf7 commit c9516ec
Show file tree
Hide file tree
Showing 20 changed files with 571 additions and 439 deletions.
3 changes: 2 additions & 1 deletion ChatK!t.podspec
Expand Up @@ -8,7 +8,7 @@ Pod::Spec.new do |s|
s.source = { :git => "https://github.com/chat-sdk/chat-sdk-ios.git", :tag => s.version.to_s }
s.module_name = 'ChatKit'

s.platform = :ios, '11.0'
s.platform = :ios, '13.0'
s.requires_arc = true
s.swift_version = "5.0"

Expand All @@ -20,6 +20,7 @@ Pod::Spec.new do |s|
s.dependency 'ChatSDKKeepLayout'
s.dependency 'NextGrowingTextView'
s.dependency 'CollectionKit'
s.dependency 'SVPullToRefresh'

s.subspec 'ChatSDK' do |s|
s.source_files = ['ChatK!t/ChatSDK/**/*']
Expand Down
54 changes: 54 additions & 0 deletions ChatK!t/ChatSDK/CKChatModelDelegate.swift
@@ -0,0 +1,54 @@
//
// CKMessagesModelDelegate.swift
// ChatK!t
//
// Created by ben3 on 04/05/2021.
//

import Foundation
import ChatSDK
import RXPromise

public class CKChatModelDelegate: ChatModelDelegate {

public override func loadMessages(with oldestMessage: Message?) -> Single<[Message]> {
return Single<[Message]>.create { [weak self] single in
if let model = self?._model, let thread = BChatSDK.db().fetchEntity(withID: model.thread().threadId(), withType: bThreadEntity) as? PThread {
_ = BChatSDK.thread().loadMoreMessages(from: oldestMessage?.messageDate(), for: thread).thenOnMain({ success in
if let messages = success as? [PMessage] {
single(.success(CKChatModelDelegate.convert(messages)))
} else {
single(.success([]))
}
return success
}, { error in
single(.success([]))
return error
})
}
return Disposables.create {}
}
}

public override func initialMessages() -> [Message] {
var messages = [Message]()
if let model = _model, let thread = BChatSDK.db().fetchEntity(withID: model.thread().threadId(), withType: bThreadEntity) as? PThread {
for message in BChatSDK.db().loadMessages(for: thread, newest: 15) {
if let message = message as? PMessage {
messages.insert(CKMessage(message: message), at: 0)
}
}
}
return messages
}

public static func convert(_ messages: [PMessage]) -> [Message] {
var output = [Message]()
for message in messages {
output.append(CKMessage(message: message))
}
return output
}

}

20 changes: 10 additions & 10 deletions ChatK!t/ChatSDK/CKMessage.swift
Expand Up @@ -26,39 +26,39 @@ public class CKMessage: Message {
self.message = message
}

public func messageId() -> String {
public override func messageId() -> String {
return entityId!
}

public func messageDate() -> Date {
public override func messageDate() -> Date {
return date!
}

public func messageText() -> String? {
public override func messageText() -> String? {
return text
}

public func messageSender() -> User {
public override func messageSender() -> User {
return sender
}

public func messageImageUrl() -> URL? {
public override func messageImageUrl() -> URL? {
return imageUrl
}

public func messageType() -> String {
public override func messageType() -> String {
return type!
}

public func messageMeta() -> [AnyHashable: Any]? {
public override func messageMeta() -> [AnyHashable: Any]? {
return meta!
}

public func messageDirection() -> MessageDirection {
public override func messageDirection() -> MessageDirection {
return direction
}

public func messageReadStatus() -> MessageReadStatus {
public override func messageReadStatus() -> MessageReadStatus {
if BChatSDK.readReceipt() != nil && messageDirection() == .outgoing {
if let status = message.messageReadStatus?() {
if status == bMessageReadStatusRead {
Expand All @@ -75,7 +75,7 @@ public class CKMessage: Message {
return .none
}

public func messageReply() -> Reply? {
public override func messageReply() -> Reply? {
if message.isReply() {
// Get the user's name
var fromUser: PUser?
Expand Down
12 changes: 1 addition & 11 deletions ChatK!t/ChatSDK/CKThread.swift
Expand Up @@ -50,17 +50,7 @@ open class CKThread: Thread {
}
return users
}

open func threadMessages() -> [Message] {
var messages = [Message]()
for message in _thread.messagesOrderedByDateOldestFirst() {
if let message = message as? PMessage {
messages.append(CKMessage(message: message))
}
}
return messages
}


open func threadType() -> ThreadType {
return _threadType
}
Expand Down
2 changes: 2 additions & 0 deletions ChatK!t/Core/ChatKit.swift
Expand Up @@ -13,6 +13,7 @@ public class ChatKit {

public static let instance = ChatKit()


public static func shared() -> ChatKit {
return instance
}
Expand All @@ -39,6 +40,7 @@ public class ChatKit {
public static func provider() -> Provider {
return shared().provider
}

}


45 changes: 38 additions & 7 deletions ChatK!t/Core/ChatModel.swift
Expand Up @@ -8,7 +8,31 @@
import Foundation
import RxSwift

public class ChatModel: NSObject {
public protocol PChatModelDelegate: PMessagesModelDelegate {
}

public class ChatModelDelegate: PChatModelDelegate {

weak var _model: ChatModel?

public init() {
}

public func setModel(_ model: ChatModel) {
_model = model
}

public func loadMessages(with oldestMessage: Message?) -> Single<[Message]> {
preconditionFailure("This method must be overridden")
}

public func initialMessages() -> [Message] {
preconditionFailure("This method must be overridden")
}

}

public class ChatModel {

public let _thread: Thread
public var _options = [Option]()
Expand All @@ -17,13 +41,16 @@ public class ChatModel: NSObject {
public var _keyboardOverlays = [String: KeyboardOverlay]()

public var _view: PChatViewController?
public let _delegate: ChatModelDelegate

public lazy var _messagesModel = {
return ChatKit.provider().messagesModel(_thread)
return ChatKit.provider().messagesModel(_thread, delegate: _delegate)
}()

public init(_ thread: Thread) {
public init(_ thread: Thread, delegate: ChatModelDelegate) {
_thread = thread
_delegate = delegate
_delegate.setModel(self)
}

open func messagesModel() -> MessagesModel {
Expand All @@ -43,7 +70,7 @@ public class ChatModel: NSObject {
if _thread.threadType() == .private1to1 {
if let user = _thread.threadOtherUser() {
if user.userIsOnline() {
return t(Strings.online)
return Strings.t(Strings.online)
} else if let lastOnline = user.userLastOnline() as NSDate?, let text = lastOnline.lastSeenTimeAgo() {
return text
}
Expand All @@ -69,7 +96,7 @@ public class ChatModel: NSObject {
*/
open func initialSubtitle() -> String? {
if ChatKit.config().userChatInfoEnabled {
return t(Strings.tapHereForContactInfo)
return Strings.t(Strings.tapHereForContactInfo)
}
return nil
}
Expand Down Expand Up @@ -114,8 +141,12 @@ public class ChatModel: NSObject {
_view = view
}

public func loadMessages() {
_messagesModel.loadMessages()
public func loadInitialMessages() {
_messagesModel.loadInitialMessages()
}

public func thread() -> Thread {
return _thread
}

}
Expand Down
18 changes: 11 additions & 7 deletions ChatK!t/Core/ChatViewController.swift
Expand Up @@ -82,9 +82,10 @@ public class ChatViewController: UIViewController {
setupKeyboardListener()
setupKeyboardOverlays()

model.loadMessages()
model.loadInitialMessages()

}


override public func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
Expand All @@ -99,6 +100,7 @@ public class ChatViewController: UIViewController {
override public func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
updateMessageViewBottomInset()
print("New Height after layout: \(messagesView._tableView.contentSize.height)")
}

public override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
Expand All @@ -108,11 +110,13 @@ public class ChatViewController: UIViewController {
}

public func updateMessageViewBottomInset(keyboardHeight: CGFloat? = nil) {
var keyboardHeight = keyboardHeight ?? -(sendBarViewBottomConstraint?.constant ?? 0)
var height = keyboardHeight ?? -(sendBarViewBottomConstraint?.constant ?? 0)
if (replyView.isVisible() || replyView.willShow) && !replyView.willHide {
keyboardHeight += replyView.frame.size.height
height += replyView.frame.size.height
}
messagesView.setBottomInset(height: keyboardHeight + sendBarView.frame.size.height)
height += sendBarView.frame.size.height
print("Height: ", height)
messagesView.setBottomInset(height: height)
}

override public func viewWillAppear(_ animated: Bool) {
Expand Down Expand Up @@ -248,9 +252,9 @@ public class ChatViewController: UIViewController {
}
}

public func clearSelection() {
model.messagesModel().clearSelection(true)
}
// public func clearSelection() {
// model.messagesModel().clearSelection()
// }

public func setuptoolbar() {
view.addSubview(toolbar)
Expand Down
2 changes: 2 additions & 0 deletions ChatK!t/Core/Customization/Config.swift
Expand Up @@ -53,6 +53,8 @@ public class Config {

public var messagesViewRefreshHeight: CGFloat = 300
public var messagesViewSectionViewCornerRadius: CGFloat = 5

public var messagesViewSectionHeight: CGFloat = 40

// The reply view that shows inside the message bubble
public var messageReplyViewHeight: CGFloat = 50
Expand Down
4 changes: 2 additions & 2 deletions ChatK!t/Core/Customization/Provider.swift
Expand Up @@ -82,7 +82,7 @@ public class Provider {
return SendBarView()
}

public func messagesModel(_ thread: Thread) -> MessagesModel {
return MessagesModel(thread)
public func messagesModel(_ thread: Thread, delegate: PMessagesModelDelegate) -> MessagesModel {
return MessagesModel(thread, delegate: delegate)
}
}

0 comments on commit c9516ec

Please sign in to comment.