Hello @Tez
I have put the log as per your suggestion. But typing related log is not showing when I am typing to send messages.
SBUMain.setLogLevel(.all)
I cannot attach the file, so I am posting the implementation of " SBParentChatVC
" controller over here. Please review and let me know.
============================================================
import UIKit
import SendBirdUIKit
import CallKit // sendBird calls
import SendBirdCalls // sendBird calls
class SBParentChatVC: UIViewController { //UIViewController //SBUChannelViewController
//MARK: - Variable Declaration
//For Conversations //For Provider
var IsCallingContinue : Bool = false
var channelUrl : String = ""
var selectedChannelInfo : SBDGroupChannel?
//MARK: - ViewController Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
self.setUpUI()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
APP_DELEGATE.currentVC = self
//APP_DELEGATE.chatCurrentDialogID = dialog?.id as! String
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
APP_DELEGATE.currentVC = nil
SBDMain.removeChannelDelegate(forIdentifier: self.description)
}
/*override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if !APP_DELEGATE.isFromImageShown {
self.setChatData()
}else{
APP_DELEGATE.isFromImageShown = false
}
}*/
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
APP_DELEGATE.chatCurrentDialogID = self.channelUrl
}
//MARK: - setUp UI
func setUpUI() {
self.setChatData()
self.objNav.addShadowLikeAndroidView()
SBDMain.add(self as SBDChannelDelegate, identifier: self.description)
//SBDMain.add(self as SBUMessageInputViewDelegate, identifier: self.description)
//self.selectedChannelInfo?.startTyping()
//self.selectedChannelInfo?.endTyping()
var SELF_USER_ID = ""
if getFromUserDefaultForKeyByUnArchive(key_IsProviderLogin) == nil { //User / Patient
SELF_USER_ID = APP_DELEGATE.objUser["mobile"].stringValue
}
else { //Provider
SELF_USER_ID = APP_DELEGATE.objUser["email"].stringValue
}
var arrTempUserData = [SBDUser]()
arrTempUserData = self.selectedChannelInfo?.members as! [SBDUser]
arrTempUserData = arrTempUserData.filter { (user) -> Bool in
return user.userId != SELF_USER_ID
}
if arrTempUserData.count>0 {
self.lblName.text = (arrTempUserData[0]).nickname
self.imgProfile.sd_setImage(with: URL(string: (arrTempUserData[0]).profileUrl ?? ""), placeholderImage: UIImage(named: "ico_profile.png"), options: .scaleDownLargeImages, context: nil)
}
else {
self.lblName.text = ""
self.imgProfile.sd_setImage(with: URL(string: ""), placeholderImage: UIImage(named: "ico_profile.png"), options: .scaleDownLargeImages, context: nil)
}
self.lblTyping.isHidden = true
if self.IsCallingContinue {
self.btnAudioCall.isHidden = true
self.btnVideoCall.isHidden = true
self.imgProfile.isHidden = false
self.cnstImgProfileHeight.constant = 40.0
}else{
self.btnAudioCall.isHidden = false
self.btnVideoCall.isHidden = false
self.imgProfile.isHidden = false
self.cnstImgProfileHeight.constant = 40.0
}
}
//MARK: - Set Chat Data
func setChatData() {
self.openChannelVC(channelUrl: self.channelUrl)
}
func openChannelVC(channelUrl: String, messageListParams: SBDMessageListParams? = nil) {
let channelVC = SBUChannelViewController(
channelUrl: channelUrl,
messageListParams: messageListParams
)
channelVC.navigationController?.isToolbarHidden = true
channelVC.navigationController?.isNavigationBarHidden = true
self.addChild(channelVC)
SBUTheme.messageCellTheme.adminMessageFont = .systemFont(ofSize: 15)
SBUTheme.messageCellTheme.userMessageFont = .systemFont(ofSize: 15)
SBUTheme.messageCellTheme.rightBackgroundColor = UIColor(hexString: "218271")!
SBUTheme.messageCellTheme.rightBackgroundColor = UIColor(hexString: "218271")!
SBUTheme.messageCellTheme.fileIconColor = UIColor(hexString: "218271")!
SBUTheme.messageCellTheme.fileImageIconColor = UIColor(hexString: "218271")!
SBUTheme.messageInputTheme.buttonTintColor = UIColor(hexString: "218271")!
SBUTheme.messageInputTheme.textFieldTintColor = UIColor(hexString: "218271")!
SBUTheme.componentTheme.loadingSpinnerColor = UIColor(hexString: "218271")!
SBUIconSet.iconAdd = UIImage(named: "icon_attachment.png")!
channelVC.view.frame = self.viewChat.bounds
viewChat.addSubview(channelVC.view)
channelVC.didMove(toParent: self)
}
}
//MARK: - Extension for Button Click
extension SBParentChatVC {
@IBAction func btnClicked(_ sender: UIButton) {
self.view.endEditing(true)
switch sender.tag {
case 1: //back
var isIncludingMessageList : Bool = false
var messageListVC = UIViewController()
for controller in self.navigationController!.viewControllers as Array {
if controller.isKind(of: MessageListVC.self) {
self.navigationController!.popToViewController(controller, animated: true)
messageListVC = controller
isIncludingMessageList = true
break
}
}
if isIncludingMessageList {
self.navigationController?.popToViewController(messageListVC, animated: true)
}else{
self.navigationController?.popViewController(animated: true)
}
case 2: //audio call
print(“audio call”)
//Sendbird - 9spl - audio
self.didTapVoiceCall()
case 3: //video call
print(“video call”)
//Sendbird - 9spl - video
self.didTapVideoCall()
default:
break;
}
}
}
// MARK: - Audio and Video call
extension SBParentChatVC {
func didTapVoiceCall() {
var SELF_USER_ID = “”
if getFromUserDefaultForKeyByUnArchive(key_IsProviderLogin) == nil { //User / Patient
SELF_USER_ID = APP_DELEGATE.objUser[“mobile”].stringValue
}
else { //Provider
SELF_USER_ID = APP_DELEGATE.objUser[“email”].stringValue
}
var arrTempUserData = [SBDUser]()
arrTempUserData = self.selectedChannelInfo?.members as! [SBDUser]
arrTempUserData = arrTempUserData.filter { (user) -> Bool in
return user.userId != SELF_USER_ID
}
var calleeId = ""
if arrTempUserData.count>0 {
calleeId = (arrTempUserData[0]).userId
}
else {
return
}
if calleeId == "" {
self.presentErrorAlert(message: DialErrors.emptyUserID.localizedDescription)
return
}
SVProgressHUD.show()
self.btnAudioCall.isEnabled = false
//self.indicator.startLoading(on: self.view)
// MARK: SendBirdCall.dial()
let callOptions = CallOptions(isAudioEnabled: true)
let dialParams = DialParams(calleeId: calleeId, isVideoCall: false, callOptions: callOptions, customItems: [:])
SendBirdCall.dial(with: dialParams) { call, error in
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
self.btnAudioCall.isEnabled = true
//self.indicator.stopLoading()
SVProgressHUD.dismiss()
}
guard error == nil, let call = call else {
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
self.presentErrorAlert(message: DialErrors.voiceCallFailed(error: error).localizedDescription)
}
return
}
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
SVProgressHUD.dismiss()
let vc = storyboardName.storyBoard_CallMain.instantiateViewController(withIdentifier: "\(VoiceCallViewController.self)") as! VoiceCallViewController
vc.call = call
vc.isDialing = true
self.navigationController?.pushViewController(vc, animated: true)
//self.performSegue(withIdentifier: "voiceCall", sender: call)
}
}
}
func didTapVideoCall() {
/*guard let calleeId = calleeIdTextField.text?.collapsed else {
self.presentErrorAlert(message: DialErrors.emptyUserID.localizedDescription)
return
}*/
var SELF_USER_ID = ""
if getFromUserDefaultForKeyByUnArchive(key_IsProviderLogin) == nil { //User / Patient
SELF_USER_ID = APP_DELEGATE.objUser["mobile"].stringValue
}
else { //Provider
SELF_USER_ID = APP_DELEGATE.objUser["email"].stringValue
}
var arrTempUserData = [SBDUser]()
arrTempUserData = self.selectedChannelInfo?.members as! [SBDUser]
arrTempUserData = arrTempUserData.filter { (user) -> Bool in
return user.userId != SELF_USER_ID
}
var calleeId = ""
if arrTempUserData.count>0 {
calleeId = (arrTempUserData[0]).userId
}
else {
return
}
if calleeId == "" {
self.presentErrorAlert(message: DialErrors.emptyUserID.localizedDescription)
return
}
SVProgressHUD.show()
self.btnVideoCall.isEnabled = false
//self.indicator.startLoading(on: self.view)
// MARK: SendBirdCall.dial()
let callOptions = CallOptions(isAudioEnabled: true, isVideoEnabled: true, useFrontCamera: true)
let dialParams = DialParams(calleeId: calleeId, isVideoCall: true, callOptions: callOptions, customItems: [:])
SendBirdCall.dial(with: dialParams) { call, error in
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
self.btnVideoCall.isEnabled = true
//self.indicator.stopLoading()
SVProgressHUD.dismiss()
}
guard error == nil, let call = call else {
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
self.presentErrorAlert(message: DialErrors.videoCallFailed(error: error).localizedDescription)
}
return
}
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
SVProgressHUD.dismiss()
let vc = storyboardName.storyBoard_CallMain.instantiateViewController(withIdentifier: "\(VideoCallViewController.self)") as! VideoCallViewController
vc.call = call
vc.isDialing = true
self.navigationController?.pushViewController(vc, animated: true)
//self.performSegue(withIdentifier: "videoCall", sender: call)
}
}
}
}
// MARK: - SBUMessageInputViewDelegate
extension SBParentChatVC : SBUMessageInputViewDelegate {
func messageInputViewDidStartTyping() {
//self.channelViewModel?.startTypingMessage()
self.selectedChannelInfo?.startTyping()
}
func messageInputViewDidEndTyping() {
//self.channelViewModel?.endTypingMessage()
self.selectedChannelInfo?.endTyping()
}
/*
override func messageInputViewDidStartTyping() {
super.messageInputViewDidStartTyping()
self.selectedChannelInfo?.startTyping()
}
override func messageInputViewDidEndTyping() {
super.messageInputViewDidEndTyping()
self.selectedChannelInfo?.endTyping()
}
*/
}
// MARK: - SBDChannelDelegate
extension SBParentChatVC: SBDChannelDelegate {
func channelDidUpdateTypingStatus(_ sender: SBDGroupChannel) {
if sender.channelUrl == self.selectedChannelInfo!.channelUrl {
let members = sender.getTypingMembers()
var SELF_USER_ID = “”
if getFromUserDefaultForKeyByUnArchive(key_IsProviderLogin) == nil { //User / Patient
SELF_USER_ID = APP_DELEGATE.objUser[“mobile”].stringValue
}
else {
SELF_USER_ID = APP_DELEGATE.objUser[“email”].stringValue
}
var arrTempUserData = [SBDMember]()
arrTempUserData = members as! [SBDMember]
arrTempUserData = arrTempUserData.filter { (user) -> Bool in
return user.userId != SELF_USER_ID
}
if arrTempUserData.count>0 {
self.lblTyping.isHidden = false
}
else {
self.lblTyping.isHidden = true
}
}
}
}
============================================================
Thank you.