import UIKit
import CometChatUIKitSwift
import CometChatSDK
class ProductionAIAgentViewController: UIViewController {
// MARK: - Properties
private var user: User?
private var group: Group?
private var parentMessage: BaseMessage?
private var isHistoryMode: Bool = false
private var messageHeader: CometChatMessageHeader!
private var messageList: CometChatMessageList!
private var messageComposer: CometChatMessageComposer!
// MARK: - Initialization
convenience init(user: User, parentMessage: BaseMessage? = nil, isHistory: Bool = false) {
self.init()
self.user = user
self.parentMessage = parentMessage
self.isHistoryMode = isHistory
}
convenience init(group: Group, parentMessage: BaseMessage? = nil, isHistory: Bool = false) {
self.init()
self.group = group
self.parentMessage = parentMessage
self.isHistoryMode = isHistory
}
// MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemBackground
setupMessageHeader()
setupMessageList()
setupMessageComposer()
setupConstraints()
}
// MARK: - Setup
private func setupMessageHeader() {
messageHeader = CometChatMessageHeader()
messageHeader.translatesAutoresizingMaskIntoConstraints = false
if let user = user {
messageHeader.set(user: user)
} else if let group = group {
messageHeader.set(group: group)
}
// Back button handler
messageHeader.set(onBack: { [weak self] in
self?.navigationController?.popViewController(animated: true)
})
// Chat history button handler
messageHeader.set(chatHistoryButtonClick: { [weak self] in
self?.openChatHistory()
})
view.addSubview(messageHeader)
}
private func setupMessageList() {
messageList = CometChatMessageList()
messageList.translatesAutoresizingMaskIntoConstraints = false
messageList.hideThreadView = true
if let user = user {
messageList.set(user: user)
} else if let group = group {
messageList.set(group: group)
}
// If resuming from history, set parent message
if let parentMessage = parentMessage {
messageList.set(parentMessage: parentMessage)
}
view.addSubview(messageList)
}
private func setupMessageComposer() {
messageComposer = CometChatMessageComposer()
messageComposer.translatesAutoresizingMaskIntoConstraints = false
if let user = user {
messageComposer.set(user: user)
} else if let group = group {
messageComposer.set(group: group)
}
// If resuming from history, set parent message
if let parentMessage = parentMessage {
messageComposer.set(parentMessage: parentMessage)
}
view.addSubview(messageComposer)
}
private func setupConstraints() {
NSLayoutConstraint.activate([
messageHeader.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
messageHeader.leadingAnchor.constraint(equalTo: view.leadingAnchor),
messageHeader.trailingAnchor.constraint(equalTo: view.trailingAnchor),
messageHeader.heightAnchor.constraint(equalToConstant: 60),
messageList.topAnchor.constraint(equalTo: messageHeader.bottomAnchor),
messageList.leadingAnchor.constraint(equalTo: view.leadingAnchor),
messageList.trailingAnchor.constraint(equalTo: view.trailingAnchor),
messageList.bottomAnchor.constraint(equalTo: messageComposer.topAnchor),
messageComposer.leadingAnchor.constraint(equalTo: view.leadingAnchor),
messageComposer.trailingAnchor.constraint(equalTo: view.trailingAnchor),
messageComposer.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor)
])
}
// MARK: - Chat History
private func openChatHistory() {
let chatHistoryVC = CometChatAIAssistantChatHistory()
if let user = user {
chatHistoryVC.set(user: user)
} else if let group = group {
chatHistoryVC.set(group: group)
}
// Handle new chat button
chatHistoryVC.set(onNewChatButtonClicked: { [weak self] in
self?.startNewChat()
})
// Handle message selection to resume conversation
chatHistoryVC.set(onMessageClicked: { [weak self] message in
self?.resumeConversation(from: message)
})
// Handle close
chatHistoryVC.set(onClose: { [weak self] in
self?.navigationController?.popViewController(animated: true)
})
navigationController?.pushViewController(chatHistoryVC, animated: true)
}
private func startNewChat() {
let newChatVC: ProductionAIAgentViewController
if let user = user {
newChatVC = ProductionAIAgentViewController(user: user)
} else if let group = group {
newChatVC = ProductionAIAgentViewController(group: group)
} else {
return
}
navigationController?.pushViewController(newChatVC, animated: true)
}
private func resumeConversation(from message: BaseMessage) {
let resumeVC: ProductionAIAgentViewController
if let user = user {
resumeVC = ProductionAIAgentViewController(user: user, parentMessage: message, isHistory: true)
} else if let group = group {
resumeVC = ProductionAIAgentViewController(group: group, parentMessage: message, isHistory: true)
} else {
return
}
navigationController?.pushViewController(resumeVC, animated: true)
}
}