{"id":"c07dd9c6-3313-4a74-8a46-af87ef7efdf6","shortId":"fYgSAC","kind":"skill","title":"cometchat-ios-components","tagline":"Complete catalog of CometChat iOS UI Kit v5 components with correct usage patterns from official documentation.","description":"## Purpose\n\nThis is the single source of truth for CometChat iOS UI Kit v5 component names, properties, and usage patterns. All examples are based on official CometChat documentation.\n\nAll components are imported from `CometChatUIKitSwift`. All SDK types are imported from `CometChatSDK`.\n\n---\n\n## 1. CometChatConversations\n\nA `UIViewController` that displays a scrollable list of the logged-in user's conversations.\n\n**Usage:**\n```swift\nimport CometChatUIKitSwift\nimport CometChatSDK\n\nlet conversationsVC = CometChatConversations()\nlet navController = UINavigationController(rootViewController: conversationsVC)\n\nconversationsVC.set(onItemClick: { [weak navController] conversation, indexPath in\n    let messagesVC = MessagesVC()  // your own VC composing CometChatMessageHeader + List + Composer; see cometchat-ios-components § 12\n    if let group = conversation.conversationWith as? Group {\n        messagesVC.set(group: group)\n    } else if let user = conversation.conversationWith as? User {\n        messagesVC.set(user: user)\n    }\n    navController?.pushViewController(messagesVC, animated: true)\n})\n```\n\n**Key Properties:**\n| Property | Type | Description |\n|---|---|---|\n| `style` | `ConversationsStyle` | Visual styling |\n| `hideReceipts` | `Bool` | Hide message read receipts |\n| `hideUserStatus` | `Bool` | Hide online/offline status |\n| `disableTyping` | `Bool` | Disable typing indicators |\n| `disableSoundForMessages` | `Bool` | Disable message sounds |\n\n**Callbacks:**\n| Callback | Method | Description |\n|---|---|---|\n| `onItemClick` | `set(onItemClick:)` | Conversation tapped |\n| `onItemLongClick` | `set(onItemLongClick:)` | Conversation long-pressed |\n| `onError` | `set(onError:)` | Error occurred |\n| `onEmpty` | `set(onEmpty:)` | List is empty |\n| `onLoad` | `set(onLoad:)` | Conversations loaded |\n\n---\n\n## 2. CometChatUsers\n\nA `UIViewController` that displays a list of users.\n\n**Usage:**\n```swift\nlet usersVC = CometChatUsers()\nlet usersNav = UINavigationController(rootViewController: usersVC)\n\nusersVC.set(onItemClick: { [weak usersNav] user, indexPath in\n    let messagesVC = MessagesVC()  // your own VC composing CometChatMessageHeader + List + Composer; see cometchat-ios-components § 12\n    messagesVC.set(user: user)\n    usersNav?.pushViewController(messagesVC, animated: true)\n})\n```\n\n**Key Properties:**\n| Property | Type | Description |\n|---|---|---|\n| `style` | `UsersStyle` | Visual styling |\n| `hideSearch` | `Bool` | Hide the built-in search bar (inherited from `CometChatListBase`; default `true`) |\n| `hideUserStatus` | `Bool` | Hide online/offline indicator |\n| `selectionMode` | `SelectionMode` | `.none`, `.single`, `.multiple` |\n\n**Callbacks:**\n| Callback | Method | Description |\n|---|---|---|\n| `onItemClick` | `set(onItemClick:)` | User tapped |\n| `onSelection` | `set(onSelection:)` | Selection changed |\n| `onError` | `set(onError:)` | Error occurred |\n\n**Custom Subtitle View:**\n```swift\nimport CometChatSDK\n\nlet usersVC = CometChatUsers()\n\n// Custom subtitle with explicit type annotation\nusersVC.set(subtitle: { (user: User?) -> UIView in\n    let label = UILabel()\n    label.font = .systemFont(ofSize: 13)\n    if user?.status == .online {\n        label.text = \"Online\"\n        label.textColor = .systemGreen\n    } else {\n        label.text = \"Offline\"\n        label.textColor = .secondaryLabel\n    }\n    return label\n})\n```\n\n**Custom Request Builder:**\n```swift\nlet usersVC = CometChatUsers()\nusersVC.set(userRequestBuilder: UsersRequest.UsersRequestBuilder()\n    .set(limit: 30)\n    .set(searchKeyword: \"john\")\n)\n```\n\n---\n\n## 3. CometChatGroups\n\nA `UIViewController` that displays a list of groups.\n\n**Usage:**\n```swift\nlet groupsVC = CometChatGroups()\nlet groupsNav = UINavigationController(rootViewController: groupsVC)\n\ngroupsVC.set(onItemClick: { [weak groupsNav] group, indexPath in\n    let messagesVC = MessagesVC()  // your own VC composing CometChatMessageHeader + List + Composer; see cometchat-ios-components § 12\n    messagesVC.set(group: group)\n    groupsNav?.pushViewController(messagesVC, animated: true)\n})\n```\n\n**Key Properties:**\n| Property | Type | Description |\n|---|---|---|\n| `style` | `GroupsStyle` | Visual styling |\n| `hideSearch` | `Bool` | Hide the built-in search bar (inherited from `CometChatListBase`; default `true`) |\n| `selectionMode` | `SelectionMode` | `.none`, `.single`, `.multiple` |\n\n**Callbacks:**\n| Callback | Method | Description |\n|---|---|---|\n| `onItemClick` | `set(onItemClick:)` | Group tapped |\n| `onSelection` | `set(onSelection:)` | Selection changed |\n| `onError` | `set(onError:)` | Error occurred |\n\n---\n\n## 4. CometChatMessageHeader\n\nA `UIView` that displays user/group info and back button at the top of a message view.\n\n**Usage:**\n```swift\nprivate lazy var headerView: CometChatMessageHeader = {\n    let view = CometChatMessageHeader()\n    view.translatesAutoresizingMaskIntoConstraints = false\n    if let user = user {\n        view.set(user: user)\n    } else if let group = group {\n        view.set(group: group)\n    }\n    view.set(controller: self)\n    return view\n}()\n```\n\n**Key Properties:**\n| Property | Type | Description |\n|---|---|---|\n| `style` | `MessageHeaderStyle` | Visual styling |\n| `hideBackButton` | `Bool` | Hide back button |\n| `hideVideoCallButton` | `Bool` | Hide video call button |\n| `hideVoiceCallButton` | `Bool` | Hide voice call button |\n\n**Important:** Always call `view.set(controller: self)` to enable navigation.\n\n---\n\n## 5. CometChatMessageList\n\nA `UIView` that displays messages with real-time updates.\n\n**Usage:**\n```swift\nprivate lazy var messageListView: CometChatMessageList = {\n    let listView = CometChatMessageList()\n    listView.translatesAutoresizingMaskIntoConstraints = false\n    if let user = user {\n        listView.set(user: user)\n    } else if let group = group {\n        listView.set(group: group)\n    }\n    listView.set(controller: self)\n    return listView\n}()\n```\n\n**Key Properties:**\n| Property | Type | Description |\n|---|---|---|\n| `style` | `MessageListStyle` | Visual styling |\n| `hideReceipts` | `Bool` | Hide read receipts |\n| `hideDateSeparator` | `Bool` | Hide date separators |\n| `hideAvatar` | `Bool` | Hide sender avatars |\n| `scrollToBottomOnNewMessages` | `Bool` | Auto-scroll on new messages |\n| `messageAlignment` | `MessageListAlignment` | `.standard` or `.leftAligned` |\n\n**Important:** Always call `listView.set(controller: self)` for proper functionality.\n\n---\n\n## 6. CometChatMessageComposer\n\nA `UIView` for composing and sending messages.\n\n**Usage:**\n```swift\nprivate lazy var composerView: CometChatMessageComposer = {\n    let composer = CometChatMessageComposer()\n    composer.translatesAutoresizingMaskIntoConstraints = false\n    if let user = user {\n        composer.set(user: user)\n    } else if let group = group {\n        composer.set(group: group)\n    }\n    composer.set(controller: self)\n    return composer\n}()\n```\n\n**Key Properties:**\n| Property | Type | Description |\n|---|---|---|\n| `style` | `MessageComposerStyle` | Visual styling |\n| `placeholderText` | `String` | Placeholder text |\n| `hideVoiceRecordingButton` | `Bool` | Hide voice recording button |\n| `hideAttachmentButton` | `Bool` | Hide attachment button |\n| `hideStickersButton` | `Bool` | Hide stickers button |\n\n**Important:** Always call `composer.set(controller: self)` for proper functionality.\n\n---\n\n## 7. CometChatCallLogs\n\nA `UIViewController` that displays call history.\n\n**Requires:** `CometChatCallsSDK`\n\n**Usage:**\n```swift\n#if canImport(CometChatCallsSDK)\nlet callLogsVC = CometChatCallLogs()\nlet callLogsNav = UINavigationController(rootViewController: callLogsVC)\n#endif\n```\n\n---\n\n## 8. CometChatGroupMembers\n\nA `UIViewController` that displays members of a specific group.\n\n**Usage:**\n```swift\n// CometChatGroupMembers has a zero-arg initializer; pass the group via\n// `set(group:)`. There is no `CometChatGroupMembers(group:)` initializer.\nlet groupMembers = CometChatGroupMembers()\ngroupMembers.set(group: group)\nnavigationController?.pushViewController(groupMembers, animated: true)\n```\n\n---\n\n## 9. User / Group details — build your own VC\n\nThere is **no `CometChatDetails` view controller exported by the kit.** The sample app builds a details screen by composing avatar, list rows, and action sheets directly. Follow the same pattern in your app — `SampleApp/View Controllers/DetailsPage/UserDetailsViewController.swift` is a reasonable starting point to copy.\n\n---\n\n## 10. CometChatUIKit\n\nStatic class for initialization and authentication.\n\n**Initialization:**\n```swift\nlet uikitSettings = UIKitSettings()\n    .set(appID: \"APP_ID\")\n    .set(region: \"REGION\")\n    .set(authKey: \"AUTH_KEY\")\n    .subscribePresenceForAllUsers()\n    .build()\n\n// Init takes a `UIKitSettings` and a `Result<Bool, Error>` completion.\n// Both `CometChatUIKit(uiKitSettings: ...) { ... }` (constructor form)\n// and `CometChatUIKit.init(uiKitSettings: ...) { ... }` (explicit `.init`\n// call) compile to the same thing in Swift; the kit's sample apps use\n// the `.init` form, so don't be alarmed if you see both. See\n// cometchat-ios-core § 2 for the recommended singleton pattern.\nCometChatUIKit(uiKitSettings: uikitSettings) { result in\n    switch result {\n    case .success:\n        debugPrint(\"CometChat initialized\")\n    case .failure(let error):\n        debugPrint(\"Init failed: \\(error.localizedDescription)\")\n    }\n}\n```\n\n**Login:**\n```swift\nCometChatUIKit.login(uid: \"cometchat-uid-1\") { result in\n    switch result {\n    case .success(let user):\n        print(\"Login successful: \\(user.name ?? \"\")\")\n    case .onError(let error):\n        print(\"Login failed: \\(error.errorDescription)\")\n    @unknown default:\n        break\n    }\n}\n```\n\n**Logout:**\n```swift\nif let currentUser = CometChat.getLoggedInUser() {\n    CometChatUIKit.logout(user: currentUser) { result in\n        switch result {\n        case .success:\n            print(\"Logged out successfully\")\n        case .onError(let error):\n            print(\"Logout failed: \\(error.errorDescription)\")\n        @unknown default:\n            break\n        }\n    }\n}\n```\n\n---\n\n## 11. Composing a chat screen — `MessagesVC`\n\nThe kit does **not** ship a `CometChatMessages` or `CometChatConversationsWithMessages` view controller. The standard pattern (and what the sample app uses) is to compose `CometChatMessageHeader` + `CometChatMessageList` + `CometChatMessageComposer` inside your own `UIViewController`. See § 12 below for the full implementation — it's ~50 lines and gives you full control over navigation and lifecycle.\n\nIf you previously read about a \"pre-built `CometChatMessages` UIViewController\" in older docs or AI-generated guides, that was incorrect. Always build your own `MessagesVC` as shown in § 12 (or copy `SampleApp/View Controllers/CometChat Components/MessagesVC.swift` from the kit's sample app).\n\n---\n\n## 12. Custom MessagesVC Implementation\n\nIf you need more control over the messaging UI, create a custom view controller that combines header, list, and composer:\n\n```swift\nimport UIKit\nimport CometChatSDK\nimport CometChatUIKitSwift\n\nclass MessagesVC: UIViewController {\n    \n    // MARK: - Properties\n    var user: User?\n    var group: Group?\n    \n    // MARK: - UI Components\n    private lazy var headerView: CometChatMessageHeader = {\n        let view = CometChatMessageHeader()\n        view.translatesAutoresizingMaskIntoConstraints = false\n        if let user = user {\n            view.set(user: user)\n        } else if let group = group {\n            view.set(group: group)\n        }\n        view.set(controller: self)\n        return view\n    }()\n    \n    private lazy var messageListView: CometChatMessageList = {\n        let listView = CometChatMessageList()\n        listView.translatesAutoresizingMaskIntoConstraints = false\n        if let user = user {\n            listView.set(user: user)\n        } else if let group = group {\n            listView.set(group: group)\n        }\n        listView.set(controller: self)\n        return listView\n    }()\n    \n    private lazy var composerView: CometChatMessageComposer = {\n        let composer = CometChatMessageComposer()\n        composer.translatesAutoresizingMaskIntoConstraints = false\n        if let user = user {\n            composer.set(user: user)\n        } else if let group = group {\n            composer.set(group: group)\n        }\n        composer.set(controller: self)\n        return composer\n    }()\n    \n    // MARK: - Lifecycle\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        configureView()\n        setupLayout()\n    }\n    \n    override func viewWillDisappear(_ animated: Bool) {\n        super.viewWillDisappear(animated)\n        navigationController?.setNavigationBarHidden(false, animated: true)\n    }\n    \n    // MARK: - Setup\n    private func configureView() {\n        view.backgroundColor = .systemBackground\n        navigationController?.setNavigationBarHidden(true, animated: false)\n    }\n    \n    private func setupLayout() {\n        [headerView, messageListView, composerView].forEach { view.addSubview($0) }\n        \n        NSLayoutConstraint.activate([\n            headerView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),\n            headerView.leadingAnchor.constraint(equalTo: view.leadingAnchor),\n            headerView.trailingAnchor.constraint(equalTo: view.trailingAnchor),\n            headerView.heightAnchor.constraint(equalToConstant: 50),\n            \n            messageListView.topAnchor.constraint(equalTo: headerView.bottomAnchor),\n            messageListView.leadingAnchor.constraint(equalTo: view.leadingAnchor),\n            messageListView.trailingAnchor.constraint(equalTo: view.trailingAnchor),\n            messageListView.bottomAnchor.constraint(equalTo: composerView.topAnchor),\n            \n            composerView.leadingAnchor.constraint(equalTo: view.leadingAnchor),\n            composerView.trailingAnchor.constraint(equalTo: view.trailingAnchor),\n            composerView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor)\n        ])\n    }\n}\n```\n\n---\n\n## 14. Complete Tab-Based Chat App\n\nFull implementation of a tabbed chat app with Chats, Calls, Users, and Groups:\n\n```swift\nimport UIKit\nimport CometChatUIKitSwift\nimport CometChatSDK\n\nclass SceneDelegate: UIResponder, UIWindowSceneDelegate {\n\n    var window: UIWindow?\n\n    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {\n        guard let windowScene = (scene as? UIWindowScene) else { return }\n\n        let uikitSettings = UIKitSettings()\n            .set(appID: \"APP_ID\")\n            .set(region: \"REGION\")\n            .set(authKey: \"AUTH_KEY\")\n            .subscribePresenceForAllUsers()\n            .build()\n\n        CometChatUIKit.init(uiKitSettings: uikitSettings) { result in\n            switch result {\n            case .success:\n                CometChatUIKit.login(uid: \"cometchat-uid-1\") { loginResult in\n                    switch loginResult {\n                    case .success:\n                        DispatchQueue.main.async {\n                            self.setupTabbedView(windowScene: windowScene)\n                        }\n                    case .onError(let error):\n                        print(\"Login failed: \\(error.errorDescription)\")\n                    @unknown default:\n                        break\n                    }\n                }\n            case .failure(let error):\n                print(\"Init failed: \\(error)\")\n            }\n        }\n    }\n\n    func setupTabbedView(windowScene: UIWindowScene) {\n        let tabBarController = UITabBarController()\n        tabBarController.tabBar.backgroundColor = .white\n        \n        // Conversations Tab\n        let conversationsVC = CometChatConversations()\n        let conversationsNav = UINavigationController(rootViewController: conversationsVC)\n        conversationsVC.tabBarItem = UITabBarItem(\n            title: \"CHATS\",\n            image: UIImage(systemName: \"message.fill\"),\n            tag: 0\n        )\n        \n        conversationsVC.set(onItemClick: { [weak conversationsNav] conversation, indexPath in\n            let messagesVC = MessagesVC()  // your own VC composing CometChatMessageHeader + List + Composer; see cometchat-ios-components § 12\n            if let group = conversation.conversationWith as? Group {\n                messagesVC.set(group: group)\n            } else if let user = conversation.conversationWith as? User {\n                messagesVC.set(user: user)\n            }\n            messagesVC.hidesBottomBarWhenPushed = true\n            conversationsNav?.pushViewController(messagesVC, animated: true)\n        })\n        \n        // Call Logs Tab\n        #if canImport(CometChatCallsSDK)\n        let callLogsVC = CometChatCallLogs()\n        let callLogsNav = UINavigationController(rootViewController: callLogsVC)\n        callLogsVC.tabBarItem = UITabBarItem(\n            title: \"CALLS\",\n            image: UIImage(systemName: \"phone.fill\"),\n            tag: 1\n        )\n        #endif\n        \n        // Users Tab\n        let usersVC = CometChatUsers()\n        let usersNav = UINavigationController(rootViewController: usersVC)\n        usersVC.tabBarItem = UITabBarItem(\n            title: \"USERS\",\n            image: UIImage(systemName: \"person.2.fill\"),\n            tag: 2\n        )\n        \n        usersVC.set(onItemClick: { [weak usersNav] user, indexPath in\n            let messagesVC = MessagesVC()  // your own VC composing CometChatMessageHeader + List + Composer; see cometchat-ios-components § 12\n            messagesVC.set(user: user)\n            messagesVC.hidesBottomBarWhenPushed = true\n            usersNav?.pushViewController(messagesVC, animated: true)\n        })\n        \n        // Groups Tab\n        let groupsVC = CometChatGroups()\n        let groupsNav = UINavigationController(rootViewController: groupsVC)\n        groupsVC.tabBarItem = UITabBarItem(\n            title: \"GROUPS\",\n            image: UIImage(systemName: \"person.3.fill\"),\n            tag: 3\n        )\n        \n        groupsVC.set(onItemClick: { [weak groupsNav] group, indexPath in\n            let messagesVC = MessagesVC()  // your own VC composing CometChatMessageHeader + List + Composer; see cometchat-ios-components § 12\n            messagesVC.set(group: group)\n            messagesVC.hidesBottomBarWhenPushed = true\n            groupsNav?.pushViewController(messagesVC, animated: true)\n        })\n        \n        #if canImport(CometChatCallsSDK)\n        tabBarController.viewControllers = [conversationsNav, callLogsNav, usersNav, groupsNav]\n        #else\n        tabBarController.viewControllers = [conversationsNav, usersNav, groupsNav]\n        #endif\n        \n        window = UIWindow(windowScene: windowScene)\n        window?.rootViewController = tabBarController\n        window?.makeKeyAndVisible()\n    }\n}\n```\n\n---\n\n## 15. Shared UI Components\n\n### CometChatAvatar\n```swift\nlet avatar = CometChatAvatar()\navatar.setAvatar(avatarUrl: user.avatar ?? \"\", with: user.name)\n```\n\n### CometChatBadge\n```swift\nlet badge = CometChatBadge()\nbadge.set(count: 5)\n```\n\n### CometChatStatusIndicator\n```swift\nlet statusIndicator = CometChatStatusIndicator()\nstatusIndicator.set(status: .online)\n```\n\n---\n\n## 16. AI Components\n\n### CometChatAIConversationStarter\nDisplays AI-suggested conversation starters.\n\n### CometChatAISmartReply\nDisplays AI-suggested quick replies.\n\n### CometChatAIConversationSummary\nDisplays AI-generated conversation summary.\n\n---\n\n## 17. Extensions\n\n### CometChatPollsBubble\nRenders poll messages.\n\n### CometChatStickerKeyboard\nSticker picker keyboard.\n\n### CometChatLinkPreviewBubble\nRenders URL link previews.\n\n---\n\n## 18. SwiftUI Integration\n\nWrap UIKit components for SwiftUI:\n\n```swift\nimport SwiftUI\nimport CometChatUIKitSwift\nimport CometChatSDK\n\nstruct ConversationsView: UIViewControllerRepresentable {\n    @Binding var selectedConversation: Conversation?\n    \n    func makeUIViewController(context: Context) -> UINavigationController {\n        let conversationsVC = CometChatConversations()\n        conversationsVC.set(onItemClick: { conversation, _ in\n            selectedConversation = conversation\n        })\n        return UINavigationController(rootViewController: conversationsVC)\n    }\n    \n    func updateUIViewController(_ uiViewController: UINavigationController, context: Context) {}\n}\n```","tags":["cometchat","ios","components","skills","agent-skills","ai-agent","chat","claude-code","cursor","messaging","nextjs","react"],"capabilities":["skill","source-cometchat","skill-cometchat-ios-components","topic-agent-skills","topic-ai-agent","topic-chat","topic-claude-code","topic-cometchat","topic-cursor","topic-messaging","topic-nextjs","topic-react","topic-react-native","topic-ui-kit"],"categories":["cometchat-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/cometchat/cometchat-skills/cometchat-ios-components","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add cometchat/cometchat-skills","source_repo":"https://github.com/cometchat/cometchat-skills","install_from":"skills.sh"}},"qualityScore":"0.463","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 27 github stars · SKILL.md body (20,401 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:04:52.860Z","embedding":null,"createdAt":"2026-05-07T13:05:12.594Z","updatedAt":"2026-05-18T19:04:52.860Z","lastSeenAt":"2026-05-18T19:04:52.860Z","tsv":"'0':1270,1445 '1':62,943,1387,1518 '10':833 '11':997 '12':115,244,406,1034,1083,1095,1468,1562,1615 '13':332 '14':1305 '15':1649 '16':1679 '17':1703 '18':1718 '2':202,910,1539 '3':364,1592 '30':360 '4':462 '5':547,1670 '50':1042,1283 '6':637 '7':716 '8':740 '9':783 'action':814 'ai':1069,1680,1685,1692,1699 'ai-gener':1068,1698 'ai-suggest':1684,1691 'alarm':900 'alway':539,629,708,1075 'anim':138,251,413,781,1241,1244,1248,1260,1493,1571,1624 'annot':319 'app':803,823,848,891,1021,1094,1311,1318,1362 'appid':847,1361 'arg':758 'attach':700 'auth':855,1369 'authent':840 'authkey':854,1368 'auto':618 'auto-scrol':617 'avatar':614,810,1656 'avatar.setavatar':1658 'avatarurl':1659 'back':471,524 'badg':1666 'badge.set':1668 'bar':270,432 'base':44,1309 'bind':1736 'bool':150,156,161,166,263,277,425,522,527,533,601,606,611,616,692,698,703,866,1242 'break':966,996,1408 'build':787,804,858,1076,1372 'builder':350 'built':267,429,1061 'built-in':266,428 'button':472,525,531,537,696,701,706 'call':530,536,540,630,709,722,879,1321,1495,1512 'callback':170,171,286,287,443,444 'calllogsnav':735,1505,1631 'calllogsvc':732,738,1502,1508 'calllogsvc.tabbaritem':1509 'canimport':729,1499,1627 'case':923,928,948,956,980,986,1380,1392,1398,1409 'catalog':6 'chang':299,456 'chat':1000,1310,1317,1320,1439 'class':836,1126,1332 'combin':1114 'cometchat':2,8,30,47,112,241,403,907,926,941,1385,1465,1559,1612 'cometchat-ios-compon':1,111,240,402,1464,1558,1611 'cometchat-ios-cor':906 'cometchat-uid':940,1384 'cometchat.getloggedinuser':972 'cometchataiconversationstart':1682 'cometchataiconversationsummari':1696 'cometchataismartrepli':1689 'cometchatavatar':1653,1657 'cometchatbadg':1663,1667 'cometchatcalllog':717,733,1503 'cometchatcallssdk':725,730,1500,1628 'cometchatconvers':63,87,1430,1747 'cometchatconversationswithmessag':1011 'cometchatdetail':794 'cometchatgroup':365,378,1577 'cometchatgroupmemb':741,753,769,774 'cometchatlinkpreviewbubbl':1713 'cometchatlistbas':273,435 'cometchatmessag':1009,1062 'cometchatmessagecompos':638,652,655,1028,1204,1207 'cometchatmessagehead':107,236,398,463,486,489,1026,1144,1147,1460,1554,1607 'cometchatmessagelist':548,565,568,1027,1174,1177 'cometchatpollsbubbl':1705 'cometchatsdk':61,84,310,1123,1331,1732 'cometchatstatusind':1671,1675 'cometchatstickerkeyboard':1709 'cometchatuikit':834,870,916 'cometchatuikit.init':875,1373 'cometchatuikit.login':938,1382 'cometchatuikit.logout':973 'cometchatuikitswift':54,82,1125,1329,1730 'cometchatus':203,216,313,354,1524 'compil':880 'complet':5,868,1306 'compon':4,13,35,50,114,243,405,1139,1467,1561,1614,1652,1681,1723 'components/messagesvc.swift':1088 'compos':106,109,235,238,397,400,642,654,677,809,998,1025,1118,1206,1229,1459,1462,1553,1556,1606,1609 'composer.set':662,670,673,710,1214,1222,1225 'composer.translatesautoresizingmaskintoconstraints':656,1208 'composerview':651,1203,1267 'composerview.bottomanchor.constraint':1302 'composerview.leadinganchor.constraint':1296 'composerview.topanchor':1295 'composerview.trailinganchor.constraint':1299 'configureview':1236,1254 'connectionopt':1347 'constructor':872 'context':1742,1743,1762,1763 'control':508,542,587,632,674,711,796,1013,1048,1103,1112,1166,1196,1226 'controllers/cometchat':1087 'controllers/detailspage/userdetailsviewcontroller.swift':825 'convers':78,97,177,182,200,1426,1450,1687,1701,1739,1750,1753 'conversation.conversationwith':119,129,1472,1482 'conversationsnav':1432,1449,1490,1630,1636 'conversationsstyl':146 'conversationsvc':86,92,1429,1435,1746,1757 'conversationsvc.set':93,1446,1748 'conversationsvc.tabbaritem':1436 'conversationsview':1734 'copi':832,1085 'core':909 'correct':15 'count':1669 'creat':1108 'currentus':971,975 'custom':305,314,348,1096,1110 'date':608 'debugprint':925,932 'default':274,436,965,995,1407 'descript':144,173,257,289,419,446,516,595,682 'detail':786,806 'direct':816 'disabl':162,167 'disablesoundformessag':165 'disabletyp':160 'dispatchqueue.main.async':1394 'display':67,207,369,467,552,721,745,1683,1690,1697 'doc':1066 'document':20,48 'els':125,341,499,578,665,1157,1187,1217,1355,1478,1634 'empti':196 'enabl':545 'endif':739,1519,1639 'equalto':1273,1276,1279,1285,1288,1291,1294,1297,1300,1303 'equaltoconst':1282 'error':189,303,460,867,931,959,989,1401,1412,1416 'error.errordescription':963,993,1405 'error.localizeddescription':935 'exampl':42 'explicit':317,877 'export':797 'extens':1704 'fail':934,962,992,1404,1415 'failur':929,1410 'fals':491,570,657,1149,1179,1209,1247,1261 'follow':817 'foreach':1268 'form':873,895 'full':1038,1047,1312 'func':1233,1239,1253,1263,1339,1417,1740,1758 'function':636,715 'generat':1070,1700 'give':1045 'group':118,121,123,124,373,388,408,409,450,502,503,505,506,581,582,584,585,668,669,671,672,750,762,765,770,776,777,785,1135,1136,1160,1161,1163,1164,1190,1191,1193,1194,1220,1221,1223,1224,1324,1471,1474,1476,1477,1573,1586,1597,1617,1618 'groupmemb':773,780 'groupmembers.set':775 'groupsnav':380,387,410,1579,1596,1621,1633,1638 'groupsstyl':421 'groupsvc':377,383,1576,1582 'groupsvc.set':384,1593 'groupsvc.tabbaritem':1583 'guard':1349 'guid':1071 'header':1115 'headerview':485,1143,1265 'headerview.bottomanchor':1286 'headerview.heightanchor.constraint':1281 'headerview.leadinganchor.constraint':1275 'headerview.topanchor.constraint':1272 'headerview.trailinganchor.constraint':1278 'hide':151,157,264,278,426,523,528,534,602,607,612,693,699,704 'hideattachmentbutton':697 'hideavatar':610 'hidebackbutton':521 'hidedatesepar':605 'hidereceipt':149,600 'hidesearch':262,424 'hidestickersbutton':702 'hideuserstatus':155,276 'hidevideocallbutton':526 'hidevoicecallbutton':532 'hidevoicerecordingbutton':691 'histori':723 'id':849,1363 'imag':1440,1513,1534,1587 'implement':1039,1098,1313 'import':52,59,81,83,309,538,628,707,1120,1122,1124,1326,1328,1330,1727,1729,1731 'incorrect':1074 'indexpath':98,227,389,1451,1545,1598 'indic':164,280 'info':469 'inherit':271,433 'init':859,878,894,933,1414 'initi':759,771,838,841,927 'insid':1029 'integr':1720 'io':3,9,31,113,242,404,908,1466,1560,1613 'john':363 'key':140,253,415,512,591,678,856,1370 'keyboard':1712 'kit':11,33,800,888,1004,1091 'label':327,347 'label.font':329 'label.text':337,342 'label.textcolor':339,344 'lazi':483,562,649,1141,1171,1201 'leftalign':627 'let':85,88,100,117,127,214,217,229,311,326,352,376,379,391,487,493,501,566,572,580,653,659,667,731,734,772,843,930,950,958,970,988,1145,1151,1159,1175,1181,1189,1205,1211,1219,1350,1357,1400,1411,1421,1428,1431,1453,1470,1480,1501,1504,1522,1525,1547,1575,1578,1600,1655,1665,1673,1745 'lifecycl':1052,1231 'limit':359 'line':1043 'link':1716 'list':70,108,194,209,237,371,399,811,1116,1461,1555,1608 'listview':567,590,1176,1199 'listview.set':575,583,586,631,1184,1192,1195 'listview.translatesautoresizingmaskintoconstraints':569,1178 'load':201 'log':74,983,1496 'logged-in':73 'login':936,953,961,1403 'loginresult':1388,1391 'logout':967,991 'long':184 'long-press':183 'makekeyandvis':1648 'makeuiviewcontrol':1741 'mark':1129,1137,1230,1250 'member':746 'messag':152,168,478,553,622,645,1106,1708 'message.fill':1443 'messagealign':623 'messagecomposerstyl':684 'messageheaderstyl':518 'messagelistalign':624 'messageliststyl':597 'messagelistview':564,1173,1266 'messagelistview.bottomanchor.constraint':1293 'messagelistview.leadinganchor.constraint':1287 'messagelistview.topanchor.constraint':1284 'messagelistview.trailinganchor.constraint':1290 'messagesvc':101,102,137,230,231,250,392,393,412,1002,1079,1097,1127,1454,1455,1492,1548,1549,1570,1601,1602,1623 'messagesvc.hidesbottombarwhenpushed':1488,1566,1619 'messagesvc.set':122,132,245,407,1475,1485,1563,1616 'method':172,288,445 'multipl':285,442 'name':36 'navcontrol':89,96,135 'navig':546,1050 'navigationcontrol':778,1245,1257 'need':1101 'new':621 'none':283,440 'nslayoutconstraint.activate':1271 'occur':190,304,461 'offici':19,46 'offlin':343 'ofsiz':331 'older':1065 'onempti':191,193 'onerror':186,188,300,302,457,459,957,987,1399 'onitemclick':94,174,176,223,290,292,385,447,449,1447,1541,1594,1749 'onitemlongclick':179,181 'onlin':336,338,1678 'online/offline':158,279 'onload':197,199 'onselect':295,297,452,454 'option':1346 'overrid':1232,1238 'pass':760 'pattern':17,40,820,915,1016 'person.2.fill':1537 'person.3.fill':1590 'phone.fill':1516 'picker':1711 'placehold':689 'placeholdertext':687 'point':830 'poll':1707 'pre':1060 'pre-built':1059 'press':185 'preview':1717 'previous':1055 'print':952,960,982,990,1402,1413 'privat':482,561,648,1140,1170,1200,1252,1262 'proper':635,714 'properti':37,141,142,254,255,416,417,513,514,592,593,679,680,1130 'purpos':21 'pushviewcontrol':136,249,411,779,1491,1569,1622 'quick':1694 'read':153,603,1056 'real':556 'real-tim':555 'reason':828 'receipt':154,604 'recommend':913 'record':695 'region':851,852,1365,1366 'render':1706,1714 'repli':1695 'request':349 'requir':724 'result':865,919,922,944,947,976,979,1376,1379 'return':346,510,589,676,1168,1198,1228,1356,1754 'rootviewcontrol':91,220,382,737,1434,1507,1528,1581,1645,1756 'row':812 'sampl':802,890,1020,1093 'sampleapp/view':824,1086 'scene':1340,1341,1352 'scenedeleg':1333 'screen':807,1001 'scroll':619 'scrollabl':69 'scrolltobottomonnewmessag':615 'sdk':56 'search':269,431 'searchkeyword':362 'secondarylabel':345 'see':110,239,401,903,905,1033,1463,1557,1610 'select':298,455 'selectedconvers':1738,1752 'selectionmod':281,282,438,439 'self':509,543,588,633,675,712,1167,1197,1227 'self.setuptabbedview':1395 'send':644 'sender':613 'separ':609 'session':1344 'set':175,180,187,192,198,291,296,301,358,361,448,453,458,764,846,850,853,1360,1364,1367 'setnavigationbarhidden':1246,1258 'setup':1251 'setuplayout':1237,1264 'setuptabbedview':1418 'share':1650 'sheet':815 'ship':1007 'shown':1081 'singl':25,284,441 'singleton':914 'skill' 'skill-cometchat-ios-components' 'sound':169 'sourc':26 'source-cometchat' 'specif':749 'standard':625,1015 'start':829 'starter':1688 'static':835 'status':159,335,1677 'statusind':1674 'statusindicator.set':1676 'sticker':705,1710 'string':688 'struct':1733 'style':145,148,258,261,420,423,517,520,596,599,683,686 'subscribepresenceforallus':857,1371 'subtitl':306,315,321 'success':924,949,954,981,985,1381,1393 'suggest':1686,1693 'summari':1702 'super.viewdidload':1235 'super.viewwilldisappear':1243 'swift':80,213,308,351,375,481,560,647,727,752,842,886,937,968,1119,1325,1654,1664,1672,1726 'swiftui':1719,1725,1728 'switch':921,946,978,1378,1390 'systembackground':1256 'systemfont':330 'systemgreen':340 'systemnam':1442,1515,1536,1589 'tab':1308,1316,1427,1497,1521,1574 'tab-bas':1307 'tabbarcontrol':1422,1646 'tabbarcontroller.tabbar.backgroundcolor':1424 'tabbarcontroller.viewcontrollers':1629,1635 'tag':1444,1517,1538,1591 'take':860 'tap':178,294,451 'text':690 'thing':884 'time':557 'titl':1438,1511,1532,1585 'top':475 'topic-agent-skills' 'topic-ai-agent' 'topic-chat' 'topic-claude-code' 'topic-cometchat' 'topic-cursor' 'topic-messaging' 'topic-nextjs' 'topic-react' 'topic-react-native' 'topic-ui-kit' 'true':139,252,275,414,437,782,1249,1259,1489,1494,1567,1572,1620,1625 'truth':28 'type':57,143,163,256,318,418,515,594,681 'ui':10,32,1107,1138,1651 'uid':939,942,1383,1386 'uiimag':1441,1514,1535,1588 'uikit':1121,1327,1722 'uikitset':844,845,862,871,876,917,918,1358,1359,1374,1375 'uilabel':328 'uinavigationcontrol':90,219,381,736,1433,1506,1527,1580,1744,1755,1761 'uirespond':1334 'uiscen':1342 'uiscene.connectionoptions':1348 'uiscenesess':1345 'uitabbarcontrol':1423 'uitabbaritem':1437,1510,1531,1584 'uiview':324,465,550,640 'uiviewcontrol':65,205,367,719,743,1032,1063,1128,1760 'uiviewcontrollerrepresent':1735 'uiwindow':1338,1641 'uiwindowscen':1354,1420 'uiwindowscenedeleg':1335 'unknown':964,994,1406 'updat':558 'updateuiviewcontrol':1759 'url':1715 'usag':16,39,79,212,374,480,559,646,726,751 'use':892,1022 'user':76,128,131,133,134,211,226,246,247,293,322,323,334,494,495,497,498,573,574,576,577,660,661,663,664,784,951,974,1132,1133,1152,1153,1155,1156,1182,1183,1185,1186,1212,1213,1215,1216,1322,1481,1484,1486,1487,1520,1533,1544,1564,1565 'user.avatar':1660 'user.name':955,1662 'user/group':468 'userrequestbuild':356 'usersnav':218,225,248,1526,1543,1568,1632,1637 'usersrequest.usersrequestbuilder':357 'usersstyl':259 'usersvc':215,221,312,353,1523,1529 'usersvc.set':222,320,355,1540 'usersvc.tabbaritem':1530 'v5':12,34 'var':484,563,650,1131,1134,1142,1172,1202,1336,1737 'vc':105,234,396,790,1458,1552,1605 'via':763 'video':529 'view':307,479,488,511,795,1012,1111,1146,1169 'view.addsubview':1269 'view.backgroundcolor':1255 'view.leadinganchor':1277,1289,1298 'view.safearealayoutguide.bottomanchor':1304 'view.safearealayoutguide.topanchor':1274 'view.set':496,504,507,541,1154,1162,1165 'view.trailinganchor':1280,1292,1301 'view.translatesautoresizingmaskintoconstraints':490,1148 'viewdidload':1234 'viewwilldisappear':1240 'visual':147,260,422,519,598,685 'voic':535,694 'weak':95,224,386,1448,1542,1595 'white':1425 'willconnectto':1343 'window':1337,1640,1644,1647 'windowscen':1351,1396,1397,1419,1642,1643 'wrap':1721 'zero':757 'zero-arg':756","prices":[{"id":"030c9b14-843b-415f-9563-f6715bd2e566","listingId":"c07dd9c6-3313-4a74-8a46-af87ef7efdf6","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"cometchat","category":"cometchat-skills","install_from":"skills.sh"},"createdAt":"2026-05-07T13:05:12.594Z"}],"sources":[{"listingId":"c07dd9c6-3313-4a74-8a46-af87ef7efdf6","source":"github","sourceId":"cometchat/cometchat-skills/cometchat-ios-components","sourceUrl":"https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-ios-components","isPrimary":false,"firstSeenAt":"2026-05-07T13:05:12.594Z","lastSeenAt":"2026-05-18T19:04:52.860Z"}],"details":{"listingId":"c07dd9c6-3313-4a74-8a46-af87ef7efdf6","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"cometchat","slug":"cometchat-ios-components","github":{"repo":"cometchat/cometchat-skills","stars":27,"topics":["agent-skills","ai-agent","chat","claude-code","cometchat","cursor","messaging","nextjs","react","react-native","ui-kit"],"license":null,"html_url":"https://github.com/cometchat/cometchat-skills","pushed_at":"2026-05-18T05:04:24Z","description":"Add CometChat chat to any React, Next.js, React Native, Angular, Android, iOS, or Flutter project through your AI coding agent. Works with Claude Code, Cursor, Codex, VS Code Copilot, Windsurf, Cline, Kiro, and 50+ more agents.","skill_md_sha":"91a16d15e38cc217969fad9540e35401da386ce0","skill_md_path":"skills/cometchat-ios-components/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-ios-components"},"layout":"multi","source":"github","category":"cometchat-skills","frontmatter":{"name":"cometchat-ios-components","license":"MIT","description":"Complete catalog of CometChat iOS UI Kit v5 components with correct usage patterns from official documentation.","compatibility":"CometChatUIKitSwift ^5; CometChatSDK ^4; iOS 13+"},"skills_sh_url":"https://skills.sh/cometchat/cometchat-skills/cometchat-ios-components"},"updatedAt":"2026-05-18T19:04:52.860Z"}}