Untitled
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