{"id":"4be76290-705f-4f7d-b3af-c603dbbc9a80","shortId":"8xFNnF","kind":"skill","title":"cometchat-ios-features","tagline":"Feature catalog for CometChat iOS UI Kit — calls, reactions, polls, stickers, AI features, and extensions.","description":"## Purpose\n\nThis skill documents all features available in CometChat iOS UI Kit v5 — voice/video calls, reactions, polls, stickers, AI features, and extensions. Use this to understand what's available and how to enable/configure each feature.\n\n---\n\n## 1. Voice & Video Calls\n\n### Prerequisites\n\nAdd the CometChat Calls SDK to your project:\n\n**CocoaPods:**\n```ruby\npod 'CometChatCallsSDK', '~> 4.0'\n```\n\n**Swift Package Manager:**\n```\nhttps://github.com/cometchat/cometchat-calls-sdk-ios\n```\n\n### Required Permissions\n\nAdd to `Info.plist`:\n```xml\n<key>NSCameraUsageDescription</key>\n<string>Camera access is required for video calls</string>\n<key>NSMicrophoneUsageDescription</key>\n<string>Microphone access is required for voice and video calls</string>\n```\n\n### Enable Background Modes\n\nIn Xcode → Target → Signing & Capabilities → Background Modes:\n- ✅ Audio, AirPlay, and Picture in Picture\n- ✅ Voice over IP\n\n### Call Buttons\n\nAdd call buttons to your message header:\n\n```swift\nlet messageHeader = CometChatMessageHeader()\nmessageHeader.set(user: user)\n\n// Call buttons are shown by default when CometChatCallsSDK is available\n// To hide them:\nmessageHeader.hideVideoCallButton = true\nmessageHeader.hideVoiceCallButton = true\n```\n\n### Standalone Call Buttons\n\n```swift\n// CometChatCallButtons requires explicit width/height at init — no zero-arg init.\nlet callButtons = CometChatCallButtons(width: 80, height: 32)\ncallButtons.set(user: user)\n\n// Or for group calls\ncallButtons.set(group: group)\n\n// Customize\ncallButtons.hideVideoCallButton = false\ncallButtons.hideVoiceCallButton = false\n```\n\n### Initiating Calls Programmatically\n\n```swift\nimport CometChatSDK\n\n// Voice call to user\nlet call = Call(receiverId: user.uid ?? \"\", callType: .audio, receiverType: .user)\nCometChat.initiateCall(call: call) { call in\n    print(\"Call initiated: \\(call?.sessionID ?? \"\")\")\n} onError: { error in\n    print(\"Error: \\(error?.errorDescription ?? \"\")\")\n}\n\n// Video call to user\nlet videoCall = Call(receiverId: user.uid ?? \"\", callType: .video, receiverType: .user)\nCometChat.initiateCall(call: videoCall) { call in\n    print(\"Video call initiated\")\n} onError: { error in\n    print(\"Error: \\(error?.errorDescription ?? \"\")\")\n}\n\n// Group call\nlet groupCall = Call(receiverId: group.guid ?? \"\", callType: .video, receiverType: .group)\nCometChat.initiateCall(call: groupCall) { call in\n    print(\"Group call initiated\")\n} onError: { error in\n    print(\"Error: \\(error?.errorDescription ?? \"\")\")\n}\n```\n\n### Handling Incoming Calls\n\nCometChat UI Kit automatically handles incoming calls when properly configured. The `CometChatIncomingCall` view controller is presented automatically.\n\nFor custom handling:\n\n```swift\nimport CometChatSDK\n\nclass CallListener: CometChatCallDelegate {\n    \n    func onIncomingCallReceived(incomingCall: Call?, error: CometChatException?) {\n        guard let call = incomingCall else { return }\n        \n        DispatchQueue.main.async {\n            let incomingCallVC = CometChatIncomingCall()\n            incomingCallVC.set(call: call)\n            incomingCallVC.modalPresentationStyle = .fullScreen\n            \n            // Present from root view controller\n            UIApplication.shared.windows.first?.rootViewController?.present(\n                incomingCallVC,\n                animated: true\n            )\n        }\n    }\n    \n    func onOutgoingCallAccepted(acceptedCall: Call?, error: CometChatException?) {\n        print(\"Call accepted\")\n    }\n    \n    func onOutgoingCallRejected(rejectedCall: Call?, error: CometChatException?) {\n        print(\"Call rejected\")\n    }\n    \n    func onIncomingCallCancelled(canceledCall: Call?, error: CometChatException?) {\n        print(\"Call cancelled\")\n    }\n}\n\n// Register listener\nCometChat.addCallListener(\"call-listener\", CallListener())\n```\n\n### Call Settings Builder\n\nCustomize call behavior:\n\n```swift\n#if canImport(CometChatCallsSDK)\nimport CometChatCallsSDK\n\nlet callSettings = CallSettingsBuilder()\n    .setIsAudioOnly(false)                    // Video call\n    .setDefaultAudioMode(\"SPEAKER\")           // \"SPEAKER\" or \"EARPIECE\"\n    .setShowSwitchToVideoCall(true)           // Allow switching to video\n    .setShowEndCallButton(true)\n    .setShowMuteAudioButton(true)\n    .setShowPauseVideoButton(true)\n    .setShowSwitchCameraButton(true)\n    .setShowAudioModeButton(true)\n    .setStartWithAudioMuted(false)\n    .setStartWithVideoMuted(false)\n    .build()\n\nlet outgoingCall = CometChatOutgoingCall()\noutgoingCall.set(call: call)\noutgoingCall.set(callSettingsBuilder: callSettings)\n#endif\n```\n\n### Call Logs\n\nDisplay call history:\n\n```swift\nlet callLogs = CometChatCallLogs()\ncallLogs.onItemClick = { callLog, indexPath in\n    // Handle call log tap - maybe initiate a new call\n    print(\"Call log tapped: \\(callLog)\")\n}\nnavigationController?.pushViewController(callLogs, animated: true)\n```\n\n---\n\n## 2. Message Reactions\n\nReactions are enabled by default in CometChat UI Kit v5.\n\n### Enable/Disable Reactions\n\n```swift\nlet messageList = CometChatMessageList()\nmessageList.set(user: user)\n\n// Hide reaction option from message menu\nmessageList.hideReactionOption = true\n```\n\n### Reaction Events\n\n```swift\nclass ReactionListener: CometChatMessageEventListener {\n    \n    func onMessageReactionAdded(reactionEvent: ReactionEvent) {\n        print(\"Reaction added: \\(reactionEvent.reaction ?? \"\")\")\n        print(\"By user: \\(reactionEvent.reactedBy?.name ?? \"\")\")\n        print(\"On message: \\(reactionEvent.message?.id ?? 0)\")\n    }\n    \n    func onMessageReactionRemoved(reactionEvent: ReactionEvent) {\n        print(\"Reaction removed: \\(reactionEvent.reaction ?? \"\")\")\n    }\n}\n\nCometChatMessageEvents.addListener(\"reaction-listener\", ReactionListener())\n```\n\n### Custom Reaction Set\n\n```swift\n// Configure available reactions\nlet messageList = CometChatMessageList()\n\n// The reaction set is configured through the data source\n// See cometchat-ios-customization skill for DataSource customization\n```\n\n---\n\n## 3. Polls\n\nPolls allow users to create and vote on questions.\n\n### Enable Polls Extension\n\n```bash\ncometchat apply-feature polls --app-id <your-app-id>\n```\n\nOnce enabled, the poll creation option appears in the attachment menu.\n\n### Create Poll Programmatically\n\n```swift\nimport CometChatSDK\n\n// Create poll data\nlet pollData: [String: Any] = [\n    \"question\": \"What's your favorite programming language?\",\n    \"options\": [\"Swift\", \"Kotlin\", \"JavaScript\", \"Python\"]\n]\n\n// Create custom message with poll type\nlet pollMessage = CustomMessage(\n    receiverUid: user.uid ?? \"\",\n    receiverType: .user,\n    customType: \"extension_poll\",\n    customData: pollData\n)\n\nCometChat.sendCustomMessage(message: pollMessage) { message in\n    print(\"Poll sent: \\(message?.id ?? 0)\")\n} onError: { error in\n    print(\"Error: \\(error?.errorDescription ?? \"\")\")\n}\n```\n\n### Poll Bubble Customization\n\n```swift\n// Polls are rendered using CometChatPollBubble\n// Style customization:\nCometChatPollBubble.style.backgroundColor = .secondarySystemBackground\nCometChatPollBubble.style.questionTextColor = .label\nCometChatPollBubble.style.questionTextFont = CometChatTypography.Heading4.medium\nCometChatPollBubble.style.optionTextColor = .label\nCometChatPollBubble.style.optionTextFont = CometChatTypography.Body.regular\nCometChatPollBubble.style.voteCountTextColor = .secondaryLabel\n```\n\n---\n\n## 4. Stickers\n\nStickers provide a fun way to express emotions.\n\n### Enable Stickers\n\n```bash\ncometchat apply-feature stickers --app-id <your-app-id>\n```\n\nOnce enabled, the sticker button appears in the message composer.\n\n### Hide Stickers\n\n```swift\nlet messageComposer = CometChatMessageComposer()\nmessageComposer.set(user: user)\nmessageComposer.hideStickersButton = true\n```\n\n### Custom Sticker Packs\n\nSticker packs are managed through the CometChat Dashboard:\n1. Go to CometChat Dashboard\n2. Navigate to Extensions → Stickers\n3. Add custom sticker packs\n\n---\n\n## 5. AI Features\n\nCometChat provides AI-powered features for enhanced chat experiences.\n\n### Prerequisites — enable each AI feature via the CLI\n\niOS projects don't run `cometchat apply` (no `.cometchat/state.json`), so call the CLI in stateless mode with `--app-id`. AI features need an OpenAI key the first time:\n\n```bash\ncometchat apply-feature smart-replies --app-id <your-app-id> --openai-key sk-...\ncometchat apply-feature conversation-summary --app-id <your-app-id>\ncometchat apply-feature conversation-starter --app-id <your-app-id>\n```\n\nThe OpenAI key is stored on the app once. Subsequent ai-feature applies don't need `--openai-key` repeated. Requires `cometchat auth login` once per machine.\n\nGet an OpenAI key at https://platform.openai.com/api-keys.\n4. Configure your AI provider (OpenAI, etc.)\n\n### AI Conversation Starter\n\nSuggests conversation starters for new chats:\n\n```swift\nlet conversationStarter = CometChatAIConversationStarter()\n\n// Set AI message options\nconversationStarter.set(aiMessageOptions: [\n    \"How can I help you today?\",\n    \"What brings you here?\",\n    \"Tell me about your project\"\n])\n\n// Handle selection\nconversationStarter.onMessageClicked { selectedReply in\n    print(\"Selected: \\(selectedReply)\")\n    // Send the selected message\n}\n\n// Show loading state\nconversationStarter.showLoadingView()\n\n// Hide loading state\nconversationStarter.hideLoadingView()\n\n// Show error state\nconversationStarter.show(error: true)\n```\n\n### AI Smart Replies\n\nSuggests quick replies based on conversation context:\n\n```swift\n// Smart replies are automatically shown in the message composer\n// when enabled in the dashboard\n\n// To customize the smart replies view:\nlet messageComposer = CometChatMessageComposer()\nmessageComposer.set(user: user)\n\n// Smart replies appear above the composer when available\n```\n\n### AI Conversation Summary\n\nGenerates a summary of the conversation:\n\n```swift\n// Conversation summary is available through the AI extension\n// Enable in CometChat Dashboard → AI → Conversation Summary\n\n// The summary can be accessed through the message header menu\n// or programmatically:\n\n// Get conversation summary\nCometChat.getConversationSummary(\n    conversationWith: user.uid ?? \"\",\n    conversationType: .user\n) { summary in\n    print(\"Summary: \\(summary)\")\n} onError: { error in\n    print(\"Error: \\(error?.errorDescription ?? \"\")\")\n}\n```\n\n### AI Assistant / Bot\n\nCreate AI-powered chat bots:\n\n```swift\n// AI Bots are configured in CometChat Dashboard\n// They appear as regular users in the chat\n\n// To start a conversation with an AI bot:\nlet botUID = \"ai-assistant\"  // Your bot's UID from dashboard\n\nCometChat.getUser(UID: botUID) { bot in\n    guard let bot = bot else { return }\n    \n    let messagesVC = MessagesVC()  // your own VC composing CometChatMessageHeader + List + Composer\n    messagesVC.set(user: bot)\n    // Present the messages view\n} onError: { error in\n    print(\"Error: \\(error?.errorDescription ?? \"\")\")\n}\n```\n\n### AI Assistant Bubble Style\n\n```swift\nCometChatAIAssistantBubble.style.backgroundColor = .secondarySystemBackground\nCometChatAIAssistantBubble.style.textColor = .label\nCometChatAIAssistantBubble.style.textFont = CometChatTypography.Body.regular\nCometChatAIAssistantBubble.style.borderColor = .separator\nCometChatAIAssistantBubble.style.borderWidth = 1\nCometChatAIAssistantBubble.style.cornerRadius = CometChatCornerStyle(cornerRadius: 12)\n```\n\n---\n\n## 6. Link Preview\n\nAutomatically generates previews for URLs shared in messages.\n\n### Enable/Disable Link Preview\n\nLink preview is enabled by default.\n\n```swift\n// Link previews are handled automatically\n// No additional configuration needed\n```\n\n### Link Preview Style\n\n```swift\n// Customize link preview appearance\n// Link previews use the standard message bubble styling\n```\n\n---\n\n## 7. Message Translation\n\nTranslate messages to different languages.\n\n### Enable Translation\n\n```bash\ncometchat apply-feature message-translation --app-id <your-app-id>\n```\n\n### Translate a Message\n\n```swift\n// Translation option appears in message menu when enabled\n// Users can tap \"Translate\" to see the translated version\n\n// Programmatic translation:\nCometChat.translateMessage(\n    message: textMessage,\n    targetLanguage: \"es\"  // Spanish\n) { translatedMessage in\n    print(\"Translated: \\(translatedMessage.text ?? \"\")\")\n} onError: { error in\n    print(\"Error: \\(error?.errorDescription ?? \"\")\")\n}\n```\n\n---\n\n## 8. Collaborative Features\n\n### Collaborative Whiteboard\n\nReal-time whiteboard for drawing and collaboration:\n\n```bash\n# Enable Collaborative Whiteboard via CLI:\ncometchat apply-feature collaborative-whiteboard --app-id <your-app-id>\n```\n\n```swift\n// Whiteboard option appears in attachment menu\n// Opens a shared whiteboard session\n```\n\n### Collaborative Document\n\nReal-time document editing:\n\n```bash\n# Enable Collaborative Document via CLI:\ncometchat apply-feature collaborative-document --app-id <your-app-id>\n```\n\n```swift\n// Document option appears in attachment menu\n// Opens a shared document session\n```\n\n---\n\n## 9. Typing Indicators\n\nShow when users are typing.\n\n### Enable/Disable Typing Indicators\n\n```swift\nlet messageComposer = CometChatMessageComposer()\nmessageComposer.set(user: user)\n\n// Disable sending typing events\nmessageComposer.disableTypingEvents = true\n\n// Typing indicators in message list\nlet messageList = CometChatMessageList()\nmessageList.set(user: user)\n// Typing indicators are shown automatically\n```\n\n### Listen for Typing Events\n\n```swift\nclass TypingListener: CometChatMessageDelegate {\n    \n    func onTypingStarted(_ typingIndicator: TypingIndicator) {\n        print(\"\\(typingIndicator.sender?.name ?? \"\") is typing...\")\n    }\n    \n    func onTypingEnded(_ typingIndicator: TypingIndicator) {\n        print(\"\\(typingIndicator.sender?.name ?? \"\") stopped typing\")\n    }\n}\n\nCometChat.addMessageListener(\"typing-listener\", TypingListener())\n```\n\n---\n\n## 10. Read Receipts\n\nShow message delivery and read status.\n\n### Enable/Disable Read Receipts\n\n```swift\nlet messageList = CometChatMessageList()\nmessageList.set(user: user)\n\n// Hide read receipts\nmessageList.hideReceipts = true\n\n// In conversations list\nlet conversations = CometChatConversations()\nconversations.hideReceipts = true\n```\n\n### Receipt Status\n\n- **Sent** — Message sent to server\n- **Delivered** — Message delivered to recipient's device\n- **Read** — Message read by recipient\n\n---\n\n## 11. Threaded Messages\n\nReply to specific messages in threads.\n\n### Enable/Disable Threads\n\n```swift\nlet messageList = CometChatMessageList()\nmessageList.set(user: user)\n\n// Hide thread reply option\nmessageList.hideReplyInThreadOption = true\n```\n\n### Open Thread View\n\n```swift\n// Thread replies are handled automatically\n// Tapping \"Reply in thread\" opens the thread view\n\n// Programmatic thread access:\nmessageList.onThreadRepliesClick = { message, template in\n    // Custom thread handling\n    print(\"Thread for message: \\(message.id)\")\n}\n```\n\n---\n\n## 12. Voice Recording\n\nRecord and send voice messages.\n\n### Enable/Disable Voice Recording\n\n```swift\nlet messageComposer = CometChatMessageComposer()\nmessageComposer.set(user: user)\n\n// Hide voice recording button\nmessageComposer.hideVoiceRecording = true\n```\n\n### Required Permission\n\nAdd to `Info.plist`:\n```xml\n<key>NSMicrophoneUsageDescription</key>\n<string>Microphone access is required for voice messages</string>\n```\n\n---\n\n## 13. Live Reactions\n\nSend animated reactions that appear on screen. Live reactions are enabled by default and handled automatically by the SDK.\n\n### Listen for Live Reactions\n\n```swift\nclass LiveReactionListener: CometChatMessageEventListener {\n    \n    func ccLiveReaction(reaction: TransientMessage) {\n        print(\"Live reaction received: \\(reaction.data)\")\n        // Show animation on screen\n    }\n}\n\nCometChatMessageEvents.addListener(\"live-reaction-listener\", LiveReactionListener())\n```\n\n---\n\n## 14. Profanity Filter / Data Masking\n\nFilter inappropriate content and mask sensitive data.\n\n### Enable in Dashboard\n\n1. Go to CometChat Dashboard\n2. Navigate to Extensions → Profanity Filter\n3. Configure blocked words and masking rules\n\n### How It Works\n\n- Messages containing blocked words are automatically filtered\n- Sensitive data (credit cards, SSN, etc.) can be masked\n- Works on both sent and received messages\n\n---\n\n## 15. Thumbnail Generation\n\nAutomatically generates thumbnails for images and videos.\n\n### How It Works\n\n- Thumbnails are generated automatically for media messages\n- Displayed in conversation list and message list\n- Full media loads on tap\n\n---\n\n## Feature Availability Matrix\n\n| Feature | Requires SDK | Dashboard Config | Default |\n|---|---|---|---|\n| Voice/Video Calls | CometChatCallsSDK | No | Enabled* |\n| Reactions | No | No | Enabled |\n| Polls | No | Yes | Enabled |\n| Stickers | No | Yes | Enabled |\n| AI Features | No | Yes | Disabled |\n| Link Preview | No | Yes | Enabled |\n| Translation | No | Yes | Disabled |\n| Whiteboard | No | Yes | Disabled |\n| Collaborative Doc | No | Yes | Disabled |\n| Typing Indicators | No | No | Enabled |\n| Read Receipts | No | No | Enabled |\n| Threaded Messages | No | No | Enabled |\n| Voice Recording | No | No | Enabled |\n| Live Reactions | No | No | Enabled |\n| Profanity Filter | No | Yes | Disabled |\n\n*Calls require CometChatCallsSDK to be installed\n\n---\n\n## Best Practices\n\n1. **Enable only needed features** — Disable unused features to reduce complexity\n2. **Configure in Dashboard first** — Most features require Dashboard configuration\n3. **Test on real devices** — Calls and voice recording require physical devices\n4. **Handle permissions gracefully** — Request permissions before using camera/microphone\n5. **Monitor usage** — AI features may have usage limits based on your plan","tags":["cometchat","ios","features","skills","agent-skills","ai-agent","chat","claude-code","cursor","messaging","nextjs","react"],"capabilities":["skill","source-cometchat","skill-cometchat-ios-features","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-features","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 (17,688 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:53.132Z","embedding":null,"createdAt":"2026-05-07T13:05:13.005Z","updatedAt":"2026-05-18T19:04:53.132Z","lastSeenAt":"2026-05-18T19:04:53.132Z","tsv":"'/api-keys.':868 '/cometchat/cometchat-calls-sdk-ios':78 '0':520,649 '1':55,733,1131,1600,1763 '10':1391 '11':1442 '12':1135,1498 '13':1536 '14':1585 '15':1644 '2':466,738,1605,1774 '3':562,743,1611,1784 '32':176 '4':680,869,1796 '4.0':72 '5':748,1805 '6':1136 '7':1182 '8':1244 '80':174 '9':1320 'accept':353 'acceptedcal':347 'access':87,95,1010,1485,1530 'ad':508 'add':60,81,124,744,1524 'addit':1163 'ai':16,38,749,754,764,789,844,872,876,890,936,981,997,1003,1038,1043,1048,1069,1074,1117,1702,1808 'ai-assist':1073 'ai-featur':843 'ai-pow':753,1042 'aimessageopt':894 'airplay':114 'allow':405,565 'anim':343,464,1540,1576 'app':583,699,787,807,821,831,840,1201,1271,1306 'app-id':582,698,786,806,820,830,1200,1270,1305 'appear':591,706,975,1056,1173,1209,1276,1311,1543 'appli':579,695,775,801,815,825,846,1195,1265,1300 'apply-featur':578,694,800,814,824,1194,1264,1299 'arg':168 'assist':1039,1075,1118 'attach':594,1278,1313 'audio':113,208 'auth':856 'automat':290,303,950,1139,1161,1359,1474,1554,1626,1647,1660 'avail':26,48,147,539,980,994,1677 'background':104,111 'base':942,1814 'bash':576,692,798,1192,1257,1292 'behavior':384 'best':1761 'block':1613,1623 'bot':1040,1046,1049,1070,1077,1085,1089,1090,1105 'botuid':1072,1084 'bring':902 'bubbl':658,1119,1180 'build':423 'builder':381 'button':123,126,139,157,705,1519 'call':12,34,58,63,92,102,122,125,138,156,183,193,199,203,204,212,213,214,217,219,229,234,242,244,248,258,261,269,271,275,286,293,316,321,330,331,348,352,357,361,366,370,376,379,383,397,428,429,434,437,448,455,457,779,1686,1755,1789 'call-listen':375 'callbutton':171 'callbuttons.hidevideocallbutton':188 'callbuttons.hidevoicecallbutton':190 'callbuttons.set':177,184 'calllisten':311,378 'calllog':441,444,460,463 'calllogs.onitemclick':443 'callset':392,432 'callsettingsbuild':393,431 'calltyp':207,237,264 'camera':86 'camera/microphone':1804 'cancel':371 'canceledcal':365 'canimport':387 'capabl':110 'card':1631 'catalog':6 'cclivereact':1567 'chat':759,884,1045,1062 'class':310,499,1365,1563 'cli':768,781,1262,1297 'cocoapod':68 'collabor':1245,1247,1256,1259,1268,1285,1294,1303,1720 'collaborative-docu':1302 'collaborative-whiteboard':1267 'cometchat':2,8,28,62,287,475,555,577,693,731,736,751,774,799,813,823,855,1001,1053,1193,1263,1298,1603 'cometchat-ios-custom':554 'cometchat-ios-featur':1 'cometchat.addcalllistener':374 'cometchat.addmessagelistener':1386 'cometchat.getconversationsummary':1021 'cometchat.getuser':1082 'cometchat.initiatecall':211,241,268 'cometchat.sendcustommessage':639 'cometchat.translatemessage':1226 'cometchat/state.json':777 'cometchataiassistantbubble.style.backgroundcolor':1122 'cometchataiassistantbubble.style.bordercolor':1128 'cometchataiassistantbubble.style.borderwidth':1130 'cometchataiassistantbubble.style.cornerradius':1132 'cometchataiassistantbubble.style.textcolor':1124 'cometchataiassistantbubble.style.textfont':1126 'cometchataiconversationstart':888 'cometchatcallbutton':159,172 'cometchatcalldeleg':312 'cometchatcalllog':442 'cometchatcallssdk':71,145,388,390,1687,1757 'cometchatconvers':1420 'cometchatcornerstyl':1133 'cometchatexcept':318,350,359,368 'cometchatincomingcal':298,328 'cometchatmessagecompos':716,969,1334,1512 'cometchatmessagedeleg':1367 'cometchatmessageeventlisten':501,1565 'cometchatmessageevents.addlistener':529,1579 'cometchatmessagehead':134,1100 'cometchatmessagelist':484,543,1351,1406,1456 'cometchatoutgoingcal':426 'cometchatpollbubbl':665 'cometchatpollbubble.style.backgroundcolor':668 'cometchatpollbubble.style.optiontextcolor':674 'cometchatpollbubble.style.optiontextfont':676 'cometchatpollbubble.style.questiontextcolor':670 'cometchatpollbubble.style.questiontextfont':672 'cometchatpollbubble.style.votecounttextcolor':678 'cometchatsdk':197,309,601 'cometchattypography.body.regular':677,1127 'cometchattypography.heading4.medium':673 'complex':1773 'compos':710,955,978,1099,1102 'config':1683 'configur':296,538,548,870,1051,1164,1612,1775,1783 'contain':1622 'content':1592 'context':945 'control':300,338 'convers':818,828,877,880,944,982,989,991,1004,1019,1066,1416,1419,1666 'conversation-start':827 'conversation-summari':817 'conversations.hidereceipts':1421 'conversationstart':887 'conversationstarter.hideloadingview':929 'conversationstarter.onmessageclicked':912 'conversationstarter.set':893 'conversationstarter.show':933 'conversationstarter.showloadingview':925 'conversationtyp':1024 'conversationwith':1022 'cornerradius':1134 'creat':568,596,602,621,1041 'creation':589 'credit':1630 'custom':187,305,382,534,557,561,622,659,667,722,745,962,1170,1490 'customdata':637 'custommessag':629 'customtyp':634 'dashboard':732,737,960,1002,1054,1081,1599,1604,1682,1777,1782 'data':551,604,1588,1596,1629 'datasourc':560 'default':143,473,1155,1551,1684 'deliv':1430,1432 'deliveri':1396 'devic':1436,1788,1795 'differ':1188 'disabl':1338,1706,1715,1719,1724,1754,1768 'dispatchqueue.main.async':325 'display':436,1664 'doc':1721 'document':23,1286,1290,1295,1304,1309,1318 'draw':1254 'earpiec':402 'edit':1291 'els':323,1091 'emot':689 'enabl':103,471,573,586,690,702,762,957,999,1153,1190,1214,1258,1293,1549,1597,1689,1693,1697,1701,1711,1729,1734,1739,1744,1749,1764 'enable/configure':52 'enable/disable':479,1147,1328,1400,1451,1506 'endif':433 'enhanc':758 'error':222,225,226,251,254,255,278,281,282,317,349,358,367,651,654,655,931,934,1032,1035,1036,1111,1114,1115,1238,1241,1242 'errordescript':227,256,283,656,1037,1116,1243 'es':1230 'etc':875,1633 'event':497,1341,1363 'experi':760 'explicit':161 'express':688 'extens':19,41,575,635,741,998,1608 'fals':189,191,395,420,422 'favorit':613 'featur':4,5,17,25,39,54,580,696,750,756,765,790,802,816,826,845,1196,1246,1266,1301,1676,1679,1703,1767,1770,1780,1809 'filter':1587,1590,1610,1627,1751 'first':796,1778 'full':1671 'fullscreen':333 'fun':685 'func':313,345,354,363,502,521,1368,1377,1566 'generat':984,1140,1646,1648,1659 'get':861,1018 'github.com':77 'github.com/cometchat/cometchat-calls-sdk-ios':76 'go':734,1601 'grace':1799 'group':182,185,186,257,267,274 'group.guid':263 'groupcal':260,270 'guard':319,1087 'handl':284,291,306,447,910,1160,1473,1492,1553,1797 'header':130,1014 'height':175 'help':898 'hide':149,488,711,926,1410,1460,1516 'histori':438 'id':519,584,648,700,788,808,822,832,1202,1272,1307 'imag':1651 'import':196,308,389,600 'inappropri':1591 'incom':285,292 'incomingcal':315,322 'incomingcallvc':327,342 'incomingcallvc.modalpresentationstyle':332 'incomingcallvc.set':329 'indexpath':445 'indic':1322,1330,1345,1356,1726 'info.plist':83,1526 'init':164,169 'initi':192,218,249,276,452 'instal':1760 'io':3,9,29,556,769 'ip':121 'javascript':619 'key':794,811,835,852,864 'kit':11,31,289,477 'kotlin':618 'label':671,675,1125 'languag':615,1189 'let':132,170,202,232,259,320,326,391,424,440,482,541,605,627,714,886,967,1071,1088,1093,1332,1349,1404,1418,1454,1510 'limit':1813 'link':1137,1148,1150,1157,1166,1171,1174,1707 'list':1101,1348,1417,1667,1670 'listen':373,377,532,1360,1389,1558,1583 'live':1537,1546,1560,1571,1581,1745 'live-reaction-listen':1580 'livereactionlisten':1564,1584 'load':923,927,1673 'log':435,449,458 'login':857 'machin':860 'manag':75,728 'mask':1589,1594,1616,1636 'matrix':1678 'may':1810 'mayb':451 'media':1662,1672 'menu':493,595,1015,1212,1279,1314 'messag':129,467,492,517,623,640,642,647,709,891,921,954,1013,1108,1146,1179,1183,1186,1198,1205,1211,1227,1347,1395,1426,1431,1438,1444,1448,1487,1496,1505,1535,1621,1643,1663,1669,1736 'message-transl':1197 'message.id':1497 'messagecompos':715,968,1333,1511 'messagecomposer.disabletypingevents':1342 'messagecomposer.hidestickersbutton':720 'messagecomposer.hidevoicerecording':1520 'messagecomposer.set':717,970,1335,1513 'messagehead':133 'messageheader.hidevideocallbutton':151 'messageheader.hidevoicecallbutton':153 'messageheader.set':135 'messagelist':483,542,1350,1405,1455 'messagelist.hidereactionoption':494 'messagelist.hidereceipts':1413 'messagelist.hidereplyinthreadoption':1464 'messagelist.onthreadrepliesclick':1486 'messagelist.set':485,1352,1407,1457 'messagesvc':1094,1095 'messagesvc.set':1103 'microphon':94,1529 'mode':105,112,784 'monitor':1806 'name':514,1374,1383 'navig':739,1606 'navigationcontrol':461 'need':791,849,1165,1766 'new':454,883 'nscamerausagedescript':85 'nsmicrophoneusagedescript':93,1528 'onerror':221,250,277,650,1031,1110,1237 'onincomingcallcancel':364 'onincomingcallreceiv':314 'onmessagereactionad':503 'onmessagereactionremov':522 'onoutgoingcallaccept':346 'onoutgoingcallreject':355 'ontypingend':1378 'ontypingstart':1369 'open':1280,1315,1466,1479 'openai':793,810,834,851,863,874 'openai-key':809,850 'option':490,590,616,892,1208,1275,1310,1463 'outgoingcal':425 'outgoingcall.set':427,430 'pack':724,726,747 'packag':74 'per':859 'permiss':80,1523,1798,1801 'physic':1794 'pictur':116,118 'plan':1817 'platform.openai.com':867 'platform.openai.com/api-keys.':866 'pod':70 'poll':14,36,563,564,574,581,588,597,603,625,636,645,657,661,1694 'polldata':606,638 'pollmessag':628,641 'power':755,1044 'practic':1762 'prerequisit':59,761 'present':302,334,341,1106 'preview':1138,1141,1149,1151,1158,1167,1172,1175,1708 'print':216,224,246,253,273,280,351,360,369,456,506,510,515,525,644,653,915,1028,1034,1113,1234,1240,1372,1381,1493,1570 'profan':1586,1609,1750 'program':614 'programmat':194,598,1017,1224,1483 'project':67,770,909 'proper':295 'provid':683,752,873 'purpos':20 'pushviewcontrol':462 'python':620 'question':572,609 'quick':940 'reaction':13,35,468,469,480,489,496,507,526,531,535,540,545,1538,1541,1547,1561,1568,1572,1582,1690,1746 'reaction-listen':530 'reaction.data':1574 'reactionev':504,505,523,524 'reactionevent.message':518 'reactionevent.reactedby':513 'reactionevent.reaction':509,528 'reactionlisten':500,533 'read':1392,1398,1401,1411,1437,1439,1730 'real':1250,1288,1787 'real-tim':1249,1287 'receipt':1393,1402,1412,1423,1731 'receiv':1573,1642 'receiverid':205,235,262 'receivertyp':209,239,266,632 'receiveruid':630 'recipi':1434,1441 'record':1500,1501,1508,1518,1741,1792 'reduc':1772 'regist':372 'regular':1058 'reject':362 'rejectedcal':356 'remov':527 'render':663 'repeat':853 'repli':805,938,941,948,965,974,1445,1462,1471,1476 'request':1800 'requir':79,89,97,160,854,1522,1532,1680,1756,1781,1793 'return':324,1092 'root':336 'rootviewcontrol':340 'rubi':69 'rule':1617 'run':773 'screen':1545,1578 'sdk':64,1557,1681 'secondarylabel':679 'secondarysystembackground':669,1123 'see':553,1220 'select':911,916,920 'selectedrepli':913,917 'send':918,1339,1503,1539 'sensit':1595,1628 'sent':646,1425,1427,1640 'separ':1129 'server':1429 'session':1284,1319 'sessionid':220 'set':380,536,546,889 'setdefaultaudiomod':398 'setisaudioon':394 'setshowaudiomodebutton':417 'setshowendcallbutton':409 'setshowmuteaudiobutton':411 'setshowpausevideobutton':413 'setshowswitchcamerabutton':415 'setshowswitchtovideocal':403 'setstartwithaudiomut':419 'setstartwithvideomut':421 'share':1144,1282,1317 'show':922,930,1323,1394,1575 'shown':141,951,1358 'sign':109 'sk':812 'skill':22,558 'skill-cometchat-ios-features' 'smart':804,937,947,964,973 'smart-repli':803 'sourc':552 'source-cometchat' 'spanish':1231 'speaker':399,400 'specif':1447 'ssn':1632 'standalon':155 'standard':1178 'start':1064 'starter':829,878,881 'state':924,928,932 'stateless':783 'status':1399,1424 'sticker':15,37,681,682,691,697,704,712,723,725,742,746,1698 'stop':1384 'store':837 'string':607 'style':666,1120,1168,1181 'subsequ':842 'suggest':879,939 'summari':819,983,986,992,1005,1007,1020,1026,1029,1030 'swift':73,131,158,195,307,385,439,481,498,537,599,617,660,713,885,946,990,1047,1121,1156,1169,1206,1273,1308,1331,1364,1403,1453,1469,1509,1562 'switch':406 'tap':450,459,1217,1475,1675 'target':108 'targetlanguag':1229 'tell':905 'templat':1488 'test':1785 'textmessag':1228 'thread':1443,1450,1452,1461,1467,1470,1478,1481,1484,1491,1494,1735 'thumbnail':1645,1649,1657 'time':797,1251,1289 'today':900 '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' 'transientmessag':1569 'translat':1184,1185,1191,1199,1203,1207,1218,1222,1225,1235,1712 'translatedmessag':1232 'translatedmessage.text':1236 'true':152,154,344,404,410,412,414,416,418,465,495,721,935,1343,1414,1422,1465,1521 'type':626,1321,1327,1329,1340,1344,1355,1362,1376,1385,1388,1725 'typing-listen':1387 'typingind':1370,1371,1379,1380 'typingindicator.sender':1373,1382 'typinglisten':1366,1390 'ui':10,30,288,476 'uiapplication.shared.windows.first':339 'uid':1079,1083 'understand':45 'unus':1769 'url':1143 'usag':1807,1812 'use':42,664,1176,1803 'user':136,137,178,179,201,210,231,240,486,487,512,566,633,718,719,971,972,1025,1059,1104,1215,1325,1336,1337,1353,1354,1408,1409,1458,1459,1514,1515 'user.uid':206,236,631,1023 'v5':32,478 'vc':1098 'version':1223 'via':766,1261,1296 'video':57,91,101,228,238,247,265,396,408,1653 'videocal':233,243 'view':299,337,966,1109,1468,1482 'voic':56,99,119,198,1499,1504,1507,1517,1534,1740,1791 'voice/video':33,1685 'vote':570 'way':686 'whiteboard':1248,1252,1260,1269,1274,1283,1716 'width':173 'width/height':162 'word':1614,1624 'work':1620,1637,1656 'xcode':107 'xml':84,1527 'yes':1696,1700,1705,1710,1714,1718,1723,1753 'zero':167 'zero-arg':166","prices":[{"id":"dd3bf4d3-3f23-4a62-ad32-22126a940563","listingId":"4be76290-705f-4f7d-b3af-c603dbbc9a80","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:13.005Z"}],"sources":[{"listingId":"4be76290-705f-4f7d-b3af-c603dbbc9a80","source":"github","sourceId":"cometchat/cometchat-skills/cometchat-ios-features","sourceUrl":"https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-ios-features","isPrimary":false,"firstSeenAt":"2026-05-07T13:05:13.005Z","lastSeenAt":"2026-05-18T19:04:53.132Z"}],"details":{"listingId":"4be76290-705f-4f7d-b3af-c603dbbc9a80","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"cometchat","slug":"cometchat-ios-features","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":"606b9948133ba1d2439e874b7fc9ad09a17fed60","skill_md_path":"skills/cometchat-ios-features/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-ios-features"},"layout":"multi","source":"github","category":"cometchat-skills","frontmatter":{"name":"cometchat-ios-features","license":"MIT","description":"Feature catalog for CometChat iOS UI Kit — calls, reactions, polls, stickers, AI features, and extensions.","compatibility":"CometChatUIKitSwift ^5; iOS 13+"},"skills_sh_url":"https://skills.sh/cometchat/cometchat-skills/cometchat-ios-features"},"updatedAt":"2026-05-18T19:04:53.132Z"}}