The CometChatOutgoingCall component is a visual representation of a user-initiated call, whether voice or video. It serves as an interface for managing outgoing calls, providing users with essential options to control the call experience.
AI Integration Quick Reference
{
"component" : "CometChatOutgoingCall" ,
"package" : "CometChatUIKitSwift" ,
"import" : "import CometChatUIKitSwift \n import CometChatSDK" ,
"description" : "Displays outgoing call interface while waiting for recipient to answer" ,
"inherits" : "UIViewController" ,
"primaryOutput" : {
"callback" : "onCancelClick" ,
"type" : "(Call, UIViewController) -> Void"
},
"props" : {
"data" : {
"call" : { "type" : "Call" , "required" : true }
},
"callbacks" : {
"onCancelClick" : "(Call, UIViewController) -> Void" ,
"onError" : "(CometChatException) -> Void"
},
"sound" : {
"disableSoundForCalls" : { "type" : "Bool" , "default" : false },
"customSoundForCalls" : { "type" : "URL?" , "default" : "nil" }
},
"viewSlots" : {
"listItemView" : "(Call) -> UIView" ,
"leadingView" : "(Call) -> UIView" ,
"titleView" : "(Call) -> UIView"
}
},
"events" : [
{ "name" : "onOutgoingCallAccepted" , "payload" : "Call" , "description" : "Fires when outgoing call is accepted" },
{ "name" : "onOutgoingCallRejected" , "payload" : "Call" , "description" : "Fires when outgoing call is rejected" }
],
"sdkListeners" : [],
"compositionExample" : {
"description" : "OutgoingCall is presented when user initiates a call" ,
"components" : [ "CometChatCallButtons" , "CometChatOutgoingCall" , "CometChatOngoingCall" ],
"flow" : "User taps call → OutgoingCall shown → Recipient answers → OngoingCall starts"
}
}
Field Value Component CometChatOutgoingCallPackage CometChatUIKitSwiftInherits UIViewController
Usage
Integration
CometChatOutgoingCall is a custom view controller that offers versatility in its integration. It can be seamlessly launched via button clicks or any user-triggered action, enhancing the overall user experience and facilitating smoother interactions within the application.
let cometChatOutgoingCall = CometChatOutgoingCall ()
cometChatOutgoingCall. set ( call : call)
cometChatOutgoingCall. modalPresentationStyle = . fullScreen
self . present (cometChatOutgoingCall, animated : true )
If you are already using a navigation controller, you can use the pushViewController function instead of presenting the view controller.
Actions
Actions dictate how a component functions. They are divided into two types: Predefined and User-defined. You can override either type, allowing you to tailor the behavior of the component to fit your specific needs.
1. SetOnCancelClick
The setOnCancelClick action is typically triggered when the call is canceled, carrying out default actions. You can customize or override this default behavior using the following code snippet:
let cometChatOutgoingCall = CometChatOutgoingCall ()
cometChatOutgoingCall. set ( onCancelClick : { call, controller in
// Perform your action
})
2. OnError
You can customize error handling behavior by using the provided code snippet to override the onError callback:
let incomingCallConfiguration = CometChatOutgoingCall ()
. set ( onError : { error in
// Perform your action
})
Filters
Filters allow you to customize the data displayed in a list within a Component. You can filter the list based on your specific criteria for a more customized experience. Filters can be applied using RequestBuilders of the Chat SDK.
The OutgoingCall component does not have any exposed filters.
Events
Events are emitted by a Component. By using events, you can extend existing functionality. Being global events, they can be applied in multiple locations and can be added or removed as needed.
Event Description onOutgoingCallAccepted Triggers when the outgoing call is accepted. onOutgoingCallRejected Triggers when the outgoing call is rejected.
// View controller from your project where you want to listen to events
public class ViewController : UIViewController {
public override func viewDidLoad () {
super . viewDidLoad ()
// Subscribe to the listener for call events
CometChatCallEvents. addListener ( "UNIQUE_ID" , self as CometChatCallEventListener)
}
}
// Listener for call events
extension ViewController : CometChatCallEventListener {
func onOutgoingCallAccepted ( call : Call) {
// Handle call accepted
}
func onOutgoingCallRejected ( call : Call) {
// Handle call rejected
}
}
// Emit this when the other user accepts the call
CometChatCallEvents. emitOnOutgoingCallAccepted ( call : Call)
// Emit this when the other user rejects a call
CometChatCallEvents. emitOnOutgoingCallRejected ( call : Call)
public override func viewWillDisappear ( _ animated : Bool ) {
// Unsubscribe from the listener
CometChatCallEvents. removeListener ( "LISTENER_ID_USED_FOR_ADDING_THIS_LISTENER" )
}
Customization
To fit your app’s design requirements, you can customize the appearance of the component. We provide exposed methods that allow you to modify the experience and behavior according to your specific needs.
Style
Using Style, you can customize the look and feel of the component in your app. These parameters typically control elements such as the color, size, shape, and fonts used within the component.
1. OutgoingCall Style
You can customize the appearance of the OutgoingCall Component by applying the OutgoingCallStyle to it.
Global level styling
let customAvatarStyle = AvatarStyle ()
customAvatarStyle. backgroundColor = UIColor ( hex : "#FBAA75" )
customAvatarStyle. cornerRadius = CometChatCornerStyle ( cornerRadius : 8 )
CometChatOutgoingCall. style . nameLabelFont = UIFont ( name : "Times-New-Roman" , size : 20 )
CometChatOutgoingCall. style . callLabelFont = UIFont ( name : "Times-New-Roman" , size : 14 )
CometChatOutgoingCall. style . declineButtonCornerRadius = . init ( cornerRadius : 8 )
CometChatOutgoingCall. avatarStyle = customAvatarStyle
Instance level styling
let customAvatarStyle = AvatarStyle ()
customAvatarStyle. backgroundColor = UIColor ( hex : "#FBAA75" )
customAvatarStyle. cornerRadius = CometChatCornerStyle ( cornerRadius : 8 )
let outgoingCallStyle = OutgoingCallStyle ()
outgoingCallStyle. nameLabelFont = UIFont ( name : "Times-New-Roman" , size : 20 )
outgoingCallStyle. callLabelFont = UIFont ( name : "Times-New-Roman" , size : 14 )
outgoingCallStyle. declineButtonCornerRadius = . init ( cornerRadius : 8 )
let outgoingCall = CometChatOutgoingCall ()
outgoingCall. style = outgoingCallStyle
outgoingCall. avatarStyle = customAvatarStyle
OutgoingCallStyle Properties
Property Description Code backgroundColorSets the background color for the outgoing call view. CometChatOutgoingCall.style.backgroundColor = UIColor()borderColorSets the border color for the outgoing call view. CometChatOutgoingCall.style.borderColor = UIColor.clearborderWidthSets the border width for the outgoing call view. CometChatOutgoingCall.style.borderWidth = 0cornerRadiusSets the corner radius for the outgoing call view. CometChatOutgoingCall.style.cornerRadius = .init(cornerRadius: 0)nameTextColorSets the text color for the name label in the outgoing call view. CometChatOutgoingCall.style.nameTextColor = UIColor()nameTextFontSets the font for the name label in the outgoing call view. CometChatOutgoingCall.style.nameTextFont = UIFont()callTextColorSets the text color for the call label in the outgoing call view. CometChatOutgoingCall.style.callTextColor = UIColor()callTextFontSets the font for the call label in the outgoing call view. CometChatOutgoingCall.style.callTextFont = UIFont()declineButtonBackgroundColorSets the background color for the decline button in the outgoing call view. CometChatOutgoingCall.style.declineButtonBackgroundColor = UIColor()declineButtonIconTintSets the tint color for the decline button icon. CometChatOutgoingCall.style.declineButtonIconTint = UIColor()declineButtonIconSets the icon for the decline button. CometChatOutgoingCall.style.declineButtonIcon = UIImage(systemName: "phone.down.fill")declineButtonCornerRadiusSets the corner radius for the decline button. CometChatOutgoingCall.style.declineButtonCornerRadius: CometChatCornerStyle?declineButtonBorderColorSets the border color for the decline button. CometChatOutgoingCall.style.declineButtonBorderColor: UIColor?declineButtonBorderWidthSets the border width for the decline button. CometChatOutgoingCall.style.declineButtonBorderWidth: CGFloat?
Functionality
These are small functional customizations that allow you to fine-tune the overall experience of the component.
Property Description Code disableSoundForCalls Disables sound for outgoing calls. disableSoundForCalls = truesetCustomSoundForCalls Sets a custom sound for outgoing calls. set(customSoundForCalls: URL)
Advanced
For advanced-level customization, you can set custom views to the component. This lets you tailor each aspect of the component to fit your exact needs and application aesthetics. You can create and define your own views, layouts, and UI elements and then incorporate those into the component.
SetAvatarView
With this function, you can assign a custom view to the avatar of the OutgoingCall Component.
cometChatOutgoingCall. set ( avatarView : { call in
let customView = CustomAvatarView ()
return customView
})
Demonstration
You can create a CustomAvatarView as a custom UIView:
import UIKit
class CustomAvatarView : UIView {
private let imageView: UIImageView = {
let imageView = UIImageView ( image : UIImage ( named : "user_profile" )) // Replace with actual image
imageView. contentMode = . scaleAspectFill
imageView. layer . cornerRadius = 50
imageView. layer . masksToBounds = true
imageView. translatesAutoresizingMaskIntoConstraints = false
return imageView
}()
private let badgeView: UIView = {
let view = UIView ()
view. backgroundColor = . yellow
view. layer . cornerRadius = 14
view. translatesAutoresizingMaskIntoConstraints = false
return view
}()
private let starIcon: UIImageView = {
let imageView = UIImageView ( image : UIImage ( systemName : "star.fill" ))
imageView. tintColor = . white
imageView. translatesAutoresizingMaskIntoConstraints = false
return imageView
}()
override init ( frame : CGRect) {
super . init ( frame : frame)
setupView ()
}
required init? ( coder : NSCoder) {
super . init ( coder : coder)
setupView ()
}
private func setupView () {
translatesAutoresizingMaskIntoConstraints = false
addSubview (imageView)
addSubview (badgeView)
badgeView. addSubview (starIcon)
NSLayoutConstraint. activate ([
imageView. centerXAnchor . constraint ( equalTo : centerXAnchor),
imageView. centerYAnchor . constraint ( equalTo : centerYAnchor),
imageView. widthAnchor . constraint ( equalToConstant : 100 ),
imageView. heightAnchor . constraint ( equalToConstant : 100 ),
badgeView. trailingAnchor . constraint ( equalTo : imageView. trailingAnchor , constant : 5 ),
badgeView. bottomAnchor . constraint ( equalTo : imageView. bottomAnchor , constant : 5 ),
badgeView. widthAnchor . constraint ( equalToConstant : 28 ),
badgeView. heightAnchor . constraint ( equalToConstant : 28 ),
starIcon. centerXAnchor . constraint ( equalTo : badgeView. centerXAnchor ),
starIcon. centerYAnchor . constraint ( equalTo : badgeView. centerYAnchor ),
starIcon. widthAnchor . constraint ( equalToConstant : 14 ),
starIcon. heightAnchor . constraint ( equalToConstant : 14 )
])
}
}
SetCancelView
You can modify the cancel call view of the Outgoing call component using the property below:
cometChatOutgoingCall. set ( cancelView : { call in
let view = CustomCancelView ()
return view
})
Demonstration
You can create a CustomCancelView as a custom UIView:
import UIKit
class EndCallButton : UIButton {
private let phoneIcon: UIImageView = {
let imageView = UIImageView ( image : UIImage ( systemName : "phone.down.fill" ))
imageView. tintColor = . white
imageView. translatesAutoresizingMaskIntoConstraints = false
return imageView
}()
override init ( frame : CGRect) {
super . init ( frame : frame)
setupView ()
}
required init? ( coder : NSCoder) {
super . init ( coder : coder)
setupView ()
}
private func setupView () {
setTitle ( "End Call" , for : . normal )
setTitleColor (. white , for : . normal )
backgroundColor = . red
layer. cornerRadius = 10
titleLabel ? . font = UIFont. systemFont ( ofSize : 18 )
translatesAutoresizingMaskIntoConstraints = false
let stackView = UIStackView ( arrangedSubviews : [phoneIcon, titleLabel ! ])
stackView. axis = . horizontal
stackView. spacing = 5
stackView. alignment = . center
stackView. translatesAutoresizingMaskIntoConstraints = false
addSubview (stackView)
NSLayoutConstraint. activate ([
stackView. centerXAnchor . constraint ( equalTo : centerXAnchor),
stackView. centerYAnchor . constraint ( equalTo : centerYAnchor)
])
addTarget ( self , action : #selector (endCallTapped), for : . touchUpInside )
}
@objc private func endCallTapped () {
print ( "Call Ended" )
}
}
SetTitleView
You can customize the title view of the outgoing call component using the property below:
cometChatOutgoingCall. set ( titleView : { call in
let view = CustomTitleView ()
view. configure ( call : call)
return view
})
Demonstration
You can create a CustomTitleView as a custom UIView:
import UIKit
class CustomTitleView : UILabel {
override init ( frame : CGRect) {
super . init ( frame : frame)
setupView ()
}
required init? ( coder : NSCoder) {
super . init ( coder : coder)
setupView ()
}
private func setupView () {
font = UIFont. boldSystemFont ( ofSize : 22 )
textAlignment = . center
translatesAutoresizingMaskIntoConstraints = false
}
func configure ( call : Call) {
text = " \( call. callInitiator ) <> \( call. receiver ) "
}
}
SetSubtitleView
You can modify the subtitle view of the outgoing call component using the property below:
cometChatOutgoingCall. set ( subtitleView : { call in
let view = CustomSubtitleView ()
return view
})
Demonstration
You can create a CustomSubtitleView as a custom UIView:
import UIKit
class CustomSubtitleView : UIStackView {
private let phoneIcon: UIImageView = {
let imageView = UIImageView ( image : UIImage ( systemName : "phone.fill" ))
imageView. tintColor = . gray
imageView. translatesAutoresizingMaskIntoConstraints = false
return imageView
}()
private let callingLabel: UILabel = {
let label = UILabel ()
label. text = "Calling..."
label. textColor = . gray
label. font = UIFont. systemFont ( ofSize : 18 )
label. translatesAutoresizingMaskIntoConstraints = false
return label
}()
override init ( frame : CGRect) {
super . init ( frame : frame)
setupView ()
}
required init ( coder : NSCoder) {
super . init ( coder : coder)
setupView ()
}
private func setupView () {
axis = . horizontal
spacing = 5
alignment = . center
translatesAutoresizingMaskIntoConstraints = false
addArrangedSubview (phoneIcon)
addArrangedSubview (callingLabel)
}
}
Props
All props are optional unless noted.
call
The outgoing call object to display.
disableSoundForCalls
Disables the outgoing call ringtone.
customSoundForCalls
Custom sound file URL for outgoing calls.
avatarStyle
Customizes the appearance of the recipient’s avatar.
Type AvatarStyleDefault AvatarStyle()
import CometChatUIKitSwift
let customAvatarStyle = AvatarStyle ()
customAvatarStyle. backgroundColor = UIColor. systemOrange
customAvatarStyle. cornerRadius = CometChatCornerStyle ( cornerRadius : 8 )
let outgoingCall = CometChatOutgoingCall ()
outgoingCall. avatarStyle = customAvatarStyle
Events
Events emitted by the Outgoing Call component:
Event Description onOutgoingCallAcceptedTriggers when the outgoing call is accepted by the recipient onOutgoingCallRejectedTriggers when the outgoing call is rejected by the recipient
View Slots
Slot Signature Replaces avatarView(Call) -> UIViewRecipient avatar cancelView(Call) -> UIViewCancel call button titleView(Call) -> UIViewRecipient name subtitleView(Call) -> UIView”Calling…” text leadingView(Call) -> UIViewLeft section trailingView(Call) -> UIViewRight section
leadingView
You can customize the leading view of an outgoing call component using the property below.
cometChatOutgoingCall. set ( leadingView : { call in
let view = CustomLeadingView ()
return view
})
trailingView
You can customize the trailing view of an outgoing call component using the property below.
cometChatOutgoingCall. set ( trailingView : { call in
let view = CustomTrailingView ()
return view
})
Common Patterns
Initiate Call and Present Outgoing Screen
Start a call and show the outgoing call interface:
func initiateCall ( to user : User, callType : CometChat.CallType) {
let call = Call ( receiverId : user. uid ?? "" , callType : callType, receiverType : . user )
CometChat. initiateCall ( call : call) { [ weak self ] initiatedCall in
guard let initiatedCall = initiatedCall else { return }
DispatchQueue. main . async {
let outgoingCall = CometChatOutgoingCall ()
outgoingCall. set ( call : initiatedCall)
outgoingCall. modalPresentationStyle = . fullScreen
self ? . present (outgoingCall, animated : true )
}
} onError : { error in
print ( "Call initiation failed: \( error ? . errorDescription ?? "" ) " )
}
}
Handle Call Acceptance and Transition to Ongoing Call
Navigate to ongoing call when the recipient accepts:
// Subscribe to call events
CometChatCallEvents. addListener ( "outgoing_call_listener" , self as CometChatCallEventListener)
// In CometChatCallEventListener extension
func onOutgoingCallAccepted ( call : Call) {
DispatchQueue. main . async { [ weak self ] in
self ? . dismiss ( animated : false ) {
let ongoingCall = CometChatOngoingCall ()
ongoingCall. set ( sessionId : call. sessionId ?? "" )
ongoingCall. modalPresentationStyle = . fullScreen
self ? . present (ongoingCall, animated : true )
}
}
}
Custom Cancel Action with Confirmation
Show confirmation before canceling an outgoing call:
let outgoingCall = CometChatOutgoingCall ()
outgoingCall. set ( call : call)
outgoingCall. set ( onCancelClick : { [ weak self ] call, controller in
let alert = UIAlertController (
title : "Cancel Call" ,
message : "Are you sure you want to cancel this call?" ,
preferredStyle : . alert
)
alert. addAction ( UIAlertAction ( title : "No" , style : . cancel ))
alert. addAction ( UIAlertAction ( title : "Yes" , style : . destructive ) { _ in
CometChat. rejectCall ( sessionID : call. sessionId ?? "" , status : . cancelled ) { _ in
controller. dismiss ( animated : true )
} onError : { error in
print ( "Failed to cancel: \( error ? . errorDescription ?? "" ) " )
}
})
controller. present (alert, animated : true )
})
Incoming Call Display incoming call interface
Ongoing Call Display active call interface
Call Logs Display call history