Untitled

 avatar
unknown
swift
2 years ago
11 kB
19
Indexable
import Foundation
import UIKit


// MARK: - MessagesLayoutDelegate

extension ParentChatViewController: MessagesLayoutDelegate {

    func cellTopLabelHeight(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> CGFloat {
        if indexPath.section % 3 == 0 {
            return 10
        }
        return 0
    }
    
    func messageTopLabelHeight(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> CGFloat {
        return 16
    }

    func messageBottomLabelHeight(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> CGFloat {
        return 16
    }

}


extension ParentChatViewController: MessagesDataSource {
    func currentSender() -> Sender {
        return Sender(id: "0", displayName: appDelegate.userDict["first_name"] as! String)
    }
    
    func numberOfSections(in messagesCollectionView: MessagesCollectionView) -> Int {
        return parentMessageList.count
    }

    func messageForItem(at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> MessageType {
        return parentMessageList[indexPath.section]
    }

    func cellTopLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString? {
        if indexPath.section % 3 == 0 {
            return NSAttributedString(string: MessageKitDateFormatter.shared.string(from: message.sentDate), attributes: [NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 10), NSAttributedStringKey.foregroundColor: UIColor.darkGray])
        }
        return nil
    }
    
    func messageTopLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString? {
        let name = message.sender.displayName
        return NSAttributedString(string: name, attributes: [NSAttributedStringKey.font: UIFont.preferredFont(forTextStyle: .caption1)])
    }

    func messageBottomLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString? {

        let dateString = formatter.string(from: message.sentDate)
        return NSAttributedString(string: dateString, attributes: [NSAttributedStringKey.font: UIFont.preferredFont(forTextStyle: .caption2)])
    }
    
}

// MARK: - MessagesDisplayDelegate

extension ParentChatViewController: MessagesDisplayDelegate {

    // MARK: - Text Messages

    func textColor(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> UIColor {
        return isFromCurrentSender(message: message) ? .white : .darkText
    }

    func detectorAttributes(for detector: DetectorType, and message: MessageType, at indexPath: IndexPath) -> [NSAttributedStringKey: Any] {
        return MessageLabel.defaultAttributes
    }

    func enabledDetectors(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> [DetectorType] {
//        return [.url, .address, .phoneNumber, .date, .transitInformation]
        return [.url]
    }

    // MARK: - All Messages
    
    func backgroundColor(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> UIColor {
        return isFromCurrentSender(message: message) ? UIColor(red: 69/255, green: 193/255, blue: 89/255, alpha: 1) : UIColor(red: 230/255, green: 230/255, blue: 230/255, alpha: 1)
    }

    func messageStyle(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> MessageStyle {
        let corner: MessageStyle.TailCorner = isFromCurrentSender(message: message) ? .bottomRight : .bottomLeft
        return .bubbleTail(corner, .curved)
    }
    
    func configureAvatarView(_ avatarView: AvatarView, for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) {
        let nameFirstVariable = message.sender.displayName.prefix(1)
        avatarView.set(avatar: Avatar(initials: String(nameFirstVariable)))
    }
}

class ParentChatViewController: MessagesViewController {
    
    @objc var messageId : String?
    @objc var messageTitle : String?
    let refreshControl = UIRefreshControl()
    var parentMessageList: [ParentMessageModel] = []
    
    lazy var formatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateStyle = .medium
        return formatter
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        callAPIForMessageLoad()
        self.messagesCollectionView.messagesDataSource = self
        self.messagesCollectionView.messagesLayoutDelegate = self
        self.messagesCollectionView.messagesDisplayDelegate = self
        
        messageInputBar.sendButton.tintColor = UIColor(red: 69/255, green: 193/255, blue: 89/255, alpha: 1)
        scrollsToBottomOnKeybordBeginsEditing = true // default false
        maintainPositionOnKeyboardFrameChanged = true // default false
        
        messagesCollectionView.addSubview(refreshControl)
        refreshControl.addTarget(self, action: #selector(ParentChatViewController.loadMoreMessage), for: .valueChanged)
    }
    
    @objc func loadMoreMessage() {
        print(String(parentMessageList.first!.messageId))
        let str_url = "API_CALL_GOES_HERE"
        sendRequest(str_url,
                    parameters: [
                        "message_id": messageId!,
                        "page_number": String(parentMessageList.first!.messageId)]){
                            responseObject, error in guard let responseObject = responseObject, error == nil else {
                                print(error ?? "Unknown error")
                                return
                            }
                            
                            DispatchQueue.global(qos: .userInitiated).asyncAfter(deadline: DispatchTime.now() + 4){
                                DispatchQueue.main.async {
                                    var result : [ParentMessageModel] = []
                                    print(String(responseObject.messages.count))
                                    if(responseObject.messages.count != 0){
                                        for messageDetails in 0...responseObject.messages.count - 1 {
                                            let messageResult = ParentMessageModel(
                                                text: responseObject.messages[messageDetails].message,
                                                sender: Sender(
                                                    id: String(responseObject.messages[messageDetails].senderType),
                                                    displayName: responseObject.messages[messageDetails].senderName),
                                                messageId: String(responseObject.messages[messageDetails].id),
                                                date: Date(timeIntervalSince1970: TimeInterval(responseObject.messages[messageDetails].createdAt))
                                            )
                                            result.append(messageResult)
                                        }
                                    }
                                    self.parentMessageList.insert(contentsOf: result, at: 0)
                                    self.messagesCollectionView.reloadDataAndKeepOffset()
                                    self.refreshControl.endRefreshing()
                                }
                            }
                        }
    }
    
    func sendRequest(_ url: String, parameters: [String: String], completion: @escaping (ParentChatResponse?, Error?) -> Void) {
            var components = URLComponents(string: url)!
            components.queryItems = parameters.map { (key, value) in
                URLQueryItem(name: key, value: value)
            }
            var request = URLRequest(url: components.url!)
            request.setValue("application/json", forHTTPHeaderField: "Content-Type")
            let authValue = "Bearer \(String(describing: TOKEN))"
            request.setValue(authValue, forHTTPHeaderField: "Authorization")
            let task = URLSession.shared.dataTask(with: request) { data, response, error in
                guard
                    let data = data,
                    let response = response as? HTTPURLResponse,
                    200 ..< 300 ~= response.statusCode,
                    error == nil
                else {
                    completion(nil, error)
                    return
                }
                //let responseObject = (try? JSONSerialization.jsonObject(with: data)) as? [ChatResponse]
                let chatResponse = try? JSONDecoder().decode(ParentChatResponse.self, from: data)
                completion(chatResponse, nil)
        }
        task.resume()
    }
    
    func callAPIForMessageLoad() {
        
        let str_url = "SAME_API_CALL_FOR_LOAD_MORE"
        sendRequest(str_url, parameters: ["message_id": messageId!, "page_number": String(0)])
        {
            responseObject, error in guard let responseObject = responseObject, error == nil else {
                print(error ?? "Unknown error")
                return
            }
            DispatchQueue.global(qos: .userInitiated).async {
                DispatchQueue.main.async {
                    var result : [ParentMessageModel] = []
                    SVProgressHUD.dismiss()
                    self.parentMessageList.removeAll()
                    
                    for messageDetails in 0...responseObject.messages.count - 1 {
                        let messageResult = ParentMessageModel(
                            text: responseObject.messages[messageDetails].message,
                            sender: Sender(
                                id: String(responseObject.messages[messageDetails].senderType),
                                displayName: responseObject.messages[messageDetails].senderName),
                            messageId: String(responseObject.messages[messageDetails].id),
                            date: Date(timeIntervalSince1970: TimeInterval(responseObject.messages[messageDetails].createdAt))
                        )
                        result.append(messageResult)
                    }
                    self.parentMessageList = result
                    self.messagesCollectionView.reloadData()
                    self.messagesCollectionView.scrollToBottom()
                    print(self.parentMessageList)
                }
            }
        }
    }
}
Editor is loading...
Leave a Comment