Skip to main content

Chat Consultation

ChatConfig Object

For chat consultations, the consultation data will include the ChatConfig object. This config data is used to initiate and handle the chat between the user and the doctor.

struct ChatConfig {
var id: Int?
var consultationId: Int?
var groupId: String?
var chatUserId: String?
var appId: String?
var chatUserToken: String?
}

Chat Initialization

Use the chatConfig from the consultation data to initialize the chat.

import AltibbiTelehealth

if let info = consultationInfo, let config = info.chatConfig {
AltibbiChat.initialize(config: config)
}

Adding Event Listeners and Handlers

Handle chat connection and events by implementing the related protocols: GroupChannelDelegate and ConnectionDelegate.

// Connection Delegate
func didDisconnect(userId: String) {
print("ConnectionDelegate >>> didDisconnect user id: \(userId)")
}

// Group Channel Delegate
func channel(_ channel: BaseChannel, didReceive message: BaseMessage) {
// This is to handle the received messages
self.messages.append(message)
self.tableView.reloadData()
}

func channel(_ channel: GroupChannel, userDidLeave user: SendbirdChatSDK.User) {
// This is to handle if the doctor left the chat, indicating the consultation is closed
}

func channelDidUpdateTypingStatus(_ channel: GroupChannel) {
// This reflects the typing status of the other side
if channel.isTyping() {
self.typingLabel.text = "Typing..."
} else {
self.typingLabel.text = ""
}
}

Handle Chat Display

Display chat messages using UITableView and implementing its protocols.

var messages: [BaseMessage] = []
@IBOutlet weak var tableView: UITableView!

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return messages.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let message = messages[indexPath.row]

if message.sender?.userId == (consultationInfo?.chatConfig?.chatUserId)! {
let cell = tableView.dequeueReusableCell(withIdentifier: "MyMessageCell", for: indexPath) as! MyMessageCell
cell.configure(with: message)
return cell
} else {
let cell = tableView.dequeueReusableCell(withIdentifier: "MessageCell", for: indexPath) as! MessageCell
cell.configure(with: message)
return cell
}
}

override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self

// Registering chat cells
tableView.register(UINib(nibName: "MyMessageCell", bundle: nil), forCellReuseIdentifier: "MyMessageCell")
tableView.register(UINib(nibName: "MessageCell", bundle: nil), forCellReuseIdentifier: "MessageCell")
}

Loading Previous Messages

When entering the chat screen, load the previous messages from the channel. Ensure this happens after AltibbiChat.initialize().

var query: PreviousMessageListQuery?

func loadPreviousMessages() {
guard let channel = AltibbiChat.chatChannel else { return }

self.query = channel.createPreviousMessageListQuery { params in
params.limit = 200
params.reverse = false
}

self.query?.loadNextPage { messages, error in
if let error = error {
print("Error loading messages: \(error.localizedDescription)")
return
}

if let oldMessages = messages {
DispatchQueue.main.async {
self.messages.append(contentsOf: oldMessages)
self.tableView.reloadData()
self.scrollToBottom()

// Add delegates
AltibbiChat.addChannelDelegate(self, identifier: "Channel_Delegate")
// Note: AltibbiChat.addConnectionDelegate can also be used
}
}
}
}

Sending Messages

Use sendUserMessage from AltibbiChat.chatChannel to send text messages.

AltibbiChat.chatChannel?.sendUserMessage(text: msg) { userMsg, error in
if let error = error {
print("sendUserMessage Error: \(error.localizedDescription)")
}
if let sentMessage = userMsg {
DispatchQueue.main.async {
self.messages.append(sentMessage)
self.tableView.reloadData()
}
}
}

Sending Media Files

You can send pictures and PDF files by uploading them using ApiService.uploadMedia first. Once the file is uploaded, you get a Media object with a url, which you can then send as a message.

For displaying these media messages, check if the message content includes a URL to a supported file type (e.g., .jpg, .pdf).