import UIKit
import CometChatUIKitSwift
import CometChatSDK
// MARK: - Singleton Event Manager
class ChatEventManager {
static let shared = ChatEventManager()
private let listenerId = "app-event-manager"
private init() {}
func startListening() {
CometChatUserEvents.addListener(listenerId, self)
CometChatGroupEvents.addListener(listenerId, self)
CometChatConversationEvents.addListener(listenerId, self)
CometChatMessageEvents.addListener(listenerId, self)
CometChatCallEvents.addListener(listenerId, self)
}
func stopListening() {
CometChatUserEvents.removeListener(listenerId)
CometChatGroupEvents.removeListener(listenerId)
CometChatConversationEvents.removeListener(listenerId)
CometChatMessageEvents.removeListener(listenerId)
CometChatCallEvents.removeListener(listenerId)
}
}
// MARK: - User Events
extension ChatEventManager: CometChatUserEventListener {
func onUserBlock(user: User) {
NotificationCenter.default.post(name: .userBlocked, object: user)
}
func onUserUnblock(user: User) {
NotificationCenter.default.post(name: .userUnblocked, object: user)
}
}
// MARK: - Group Events
extension ChatEventManager: CometChatGroupEventListener {
func onGroupCreate(group: Group) {
NotificationCenter.default.post(name: .groupCreated, object: group)
}
func onGroupDelete(group: Group) {
NotificationCenter.default.post(name: .groupDeleted, object: group)
}
func onGroupMemberJoin(joinedUser: User, joinedGroup: Group) {
NotificationCenter.default.post(name: .memberJoined, object: nil,
userInfo: ["user": joinedUser, "group": joinedGroup])
}
func onGroupMemberLeave(leftUser: User, leftGroup: Group) {
NotificationCenter.default.post(name: .memberLeft, object: nil,
userInfo: ["user": leftUser, "group": leftGroup])
}
// Implement other required methods...
func onGroupMemberAdd(group: Group, members: [GroupMember], addedBy: User) {}
func onGroupMemberKick(kickedUser: User, kickedGroup: Group) {}
func onGroupMemberBan(bannedUser: User, bannedGroup: Group) {}
func onGroupMemberUnban(unbannedUserUser: User, unbannedUserGroup: Group) {}
func onGroupMemberChangeScope(updatedBy: User, updatedUser: User, scopeChangedTo: CometChat.MemberScope, scopeChangedFrom: CometChat.MemberScope, group: Group) {}
func onOwnershipChange(group: Group?, member: GroupMember?) {}
func onCreateGroupClick() {}
}
// MARK: - Conversation Events
extension ChatEventManager: CometChatConversationEventListener {
func ccConversationDeleted(conversation: Conversation) {
NotificationCenter.default.post(name: .conversationDeleted, object: conversation)
}
func ccUpdateConversation(conversation: Conversation) {
NotificationCenter.default.post(name: .conversationUpdated, object: conversation)
}
}
// MARK: - Message Events
extension ChatEventManager: CometChatMessageEventListener {
func onMessageSent(message: BaseMessage, status: MessageStatus) {
if status == .success {
NotificationCenter.default.post(name: .messageSent, object: message)
}
}
// Implement other required methods...
func onMessageEdit(message: BaseMessage, status: MessageStatus) {}
func onMessageDelete(message: BaseMessage, status: MessageStatus) {}
func onMessageRead(message: BaseMessage) {}
func onLiveReaction(reaction: TransientMessage) {}
func onMessageReact(message: BaseMessage, reaction: CometChatMessageReaction) {}
func onParentMessageUpdate(message: BaseMessage) {}
func onViewInformation(user: User) {}
func onViewInformation(group: Group) {}
func onVoiceCall(user: User) {}
func onVideoCall(user: User) {}
func onVoiceCall(group: Group) {}
func onVideoCall(group: Group) {}
func onMessageError(error: CometChatException) {}
func onMessageReply(message: BaseMessage, status: MessageStatus) {}
}
// MARK: - Call Events
extension ChatEventManager: CometChatCallEventListener {
func onCallInitiated(call: Call) {
NotificationCenter.default.post(name: .callStarted, object: call)
}
func onCallEnded(call: Call) {
NotificationCenter.default.post(name: .callEnded, object: call)
}
func onIncomingCallAccepted(call: Call) {}
func onIncomingCallRejected(call: Call) {}
func onOutgoingCallAccepted(call: Call) {}
func onOutgoingCallRejected(call: Call) {}
}
// MARK: - Notification Names
extension Notification.Name {
static let userBlocked = Notification.Name("userBlocked")
static let userUnblocked = Notification.Name("userUnblocked")
static let groupCreated = Notification.Name("groupCreated")
static let groupDeleted = Notification.Name("groupDeleted")
static let memberJoined = Notification.Name("memberJoined")
static let memberLeft = Notification.Name("memberLeft")
static let conversationDeleted = Notification.Name("conversationDeleted")
static let conversationUpdated = Notification.Name("conversationUpdated")
static let messageSent = Notification.Name("messageSent")
static let callStarted = Notification.Name("callStarted")
static let callEnded = Notification.Name("callEnded")
}