> ## Documentation Index
> Fetch the complete documentation index at: https://cometchat-22654f5b-docs-agentbuddy-4.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Interactive Messages

> Create and send interactive messages (forms, cards, schedulers) using the CometChat iOS SDK.

<Accordion title="AI Integration Quick Reference">
  | Method                             | Description                          |
  | ---------------------------------- | ------------------------------------ |
  | `sendInteractiveMessage(message:)` | Send an interactive message          |
  | `InteractiveMessage()`             | Create an interactive message object |
  | `InteractionGoal()`                | Define completion criteria           |

  ```swift theme={null}
  let interMessage = InteractiveMessage()
  interMessage.messageCategory = .interactive
  interMessage.type = "form"
  interMessage.receiverType = .user
  interMessage.receiverUid = "cometchat-uid-2"
  interMessage.interactiveData = ["title": "Contact Form", "formFields": [...]]

  CometChat.sendInteractiveMessage(message: interMessage, onSuccess: { msg in }, onError: { err in })

  // Listen for interactive events (CometChatMessageDelegate)
  func onInteractiveMessageReceived(_ message: InteractiveMessage) { }
  func onInteractionGoalCompleted(_ message: InteractiveMessage) { }
  ```
</Accordion>

## InteractiveMessage Properties

| Property               | Type              | Description                            |
| ---------------------- | ----------------- | -------------------------------------- |
| receiverUid            | `String`          | UID or GUID of recipient               |
| receiverType           | `ReceiverType`    | `.user` or `.group`                    |
| type                   | `String`          | `form`, `card`, `scheduler`, or custom |
| interactiveData        | `[String: Any]`   | JSON structure for content             |
| allowSenderInteraction | `Bool`            | Can sender interact (default: false)   |
| interactionGoal        | `InteractionGoal` | Completion criteria                    |
| messageCategory        | `MessageCategory` | `.interactive`                         |

***

## Interaction Goal Types

| Type       | Description                                          | Value        |
| ---------- | ---------------------------------------------------- | ------------ |
| Any Action | Goal completed if any interaction occurs             | `.anyAction` |
| Any Of     | Goal achieved if any specified interaction occurs    | `.anyOf`     |
| All Of     | Goal completed when all specified interactions occur | `.allOf`     |
| None       | Goal is never completed                              | `.none`      |

***

## Form Element Types

| Element Type | Description                      |
| ------------ | -------------------------------- |
| textInput    | Single or multi-line text input  |
| dropdown     | Dropdown select with options     |
| checkbox     | Multiple selection checkboxes    |
| radio        | Single selection radio buttons   |
| singleSelect | Single selection list            |
| button       | Action button (submit, navigate) |

***

## Button Action Types

| Action Type   | Description                                 |
| ------------- | ------------------------------------------- |
| urlNavigation | Opens a URL in browser                      |
| apiAction     | Makes an API call with specified parameters |
| customAction  | Custom action handled by app                |

***

## Send Form Interactive Message

<Tabs>
  <Tab title="Swift">
    ```swift theme={null}
    let interMessage = InteractiveMessage()
    interMessage.messageCategory = .interactive
    interMessage.type = "form"
    interMessage.receiverType = .user
    interMessage.receiverUid = "cometchat-uid-2"
    interMessage.allowSenderInteraction = true

    interMessage.interactiveData = [
        "title": "Contact Form",
        "formFields": [
            [
                "elementId": "name_field",
                "elementType": "textInput",
                "label": "Name",
                "optional": false
            ],
            [
                "elementId": "country_dropdown",
                "elementType": "dropdown",
                "label": "Country",
                "options": [
                    ["label": "USA", "value": "usa"],
                    ["label": "UK", "value": "uk"],
                    ["label": "India", "value": "india"]
                ]
            ]
        ],
        "submitElement": [
            "elementId": "submit_btn",
            "elementType": "button",
            "buttonText": "Submit",
            "disableAfterInteracted": true
        ],
        "goalCompletionText": "Thank you for submitting!"
    ]

    let goal = InteractionGoal()
    goal.elementIds = ["submit_btn"]
    goal.interactionType = .anyOf
    interMessage.interactionGoal = goal

    CometChat.sendInteractiveMessage(message: interMessage, onSuccess: { message in
        print("Interactive message sent: \(message)")
    }, onError: { error in
        print("Error: \(error?.errorDescription ?? "")")
    })
    ```
  </Tab>
</Tabs>

***

## Send Card Interactive Message

<Tabs>
  <Tab title="Swift">
    ```swift theme={null}
    let interMessage = InteractiveMessage()
    interMessage.messageCategory = .interactive
    interMessage.type = "card"
    interMessage.receiverType = .user
    interMessage.receiverUid = "cometchat-uid-2"
    interMessage.allowSenderInteraction = true

    interMessage.interactiveData = [
        "title": "Product Card",
        "subtitle": "Special Offer",
        "text": "Check out this amazing product with 20% discount!",
        "imageUrl": "https://example.com/product.png",
        "cardActions": [
            [
                "elementId": "buy_btn",
                "elementType": "button",
                "buttonText": "Buy Now",
                "action": [
                    "actionType": "urlNavigation",
                    "url": "https://example.com/buy"
                ]
            ],
            [
                "elementId": "details_btn",
                "elementType": "button",
                "buttonText": "View Details",
                "action": [
                    "actionType": "urlNavigation",
                    "url": "https://example.com/details"
                ]
            ]
        ]
    ]

    let goal = InteractionGoal()
    goal.elementIds = ["buy_btn", "details_btn"]
    goal.interactionType = .anyOf
    interMessage.interactionGoal = goal

    CometChat.sendInteractiveMessage(message: interMessage, onSuccess: {...}, onError: {...})
    ```
  </Tab>
</Tabs>

***

## Send Scheduler Interactive Message

<Tabs>
  <Tab title="Swift">
    ```swift theme={null}
    let interMessage = InteractiveMessage()
    interMessage.messageCategory = .interactive
    interMessage.type = "scheduler"
    interMessage.receiverType = .user
    interMessage.receiverUid = "cometchat-uid-2"
    interMessage.allowSenderInteraction = true

    interMessage.interactiveData = [
        "title": "Schedule a Meeting",
        "duration": 30,
        "bufferTime": 5,
        "availability": [
            "monday": ["09:00-12:00", "14:00-17:00"],
            "tuesday": ["09:00-12:00", "14:00-17:00"],
            "wednesday": ["09:00-12:00", "14:00-17:00"]
        ],
        "scheduleElement": [
            "elementId": "schedule_btn",
            "elementType": "button",
            "buttonText": "Schedule",
            "disableAfterInteracted": true
        ],
        "goalCompletionText": "Meeting scheduled successfully!"
    ]

    CometChat.sendInteractiveMessage(message: interMessage, onSuccess: {...}, onError: {...})
    ```
  </Tab>
</Tabs>

***

## Send Form to Group

<Tabs>
  <Tab title="Swift">
    ```swift theme={null}
    let interMessage = InteractiveMessage()
    interMessage.messageCategory = .interactive
    interMessage.type = "form"
    interMessage.receiverType = .group
    interMessage.receiverUid = "cometchat-guid-1"
    interMessage.allowSenderInteraction = true

    interMessage.interactiveData = [
        "title": "Group Poll",
        "formFields": [
            [
                "elementId": "poll_radio",
                "elementType": "radio",
                "label": "What's your favorite?",
                "optional": false,
                "options": [
                    ["label": "Option A", "value": "a"],
                    ["label": "Option B", "value": "b"],
                    ["label": "Option C", "value": "c"]
                ]
            ]
        ],
        "submitElement": [
            "elementId": "vote_btn",
            "elementType": "button",
            "buttonText": "Vote",
            "disableAfterInteracted": true
        ]
    ]

    CometChat.sendInteractiveMessage(message: interMessage, onSuccess: {...}, onError: {...})
    ```
  </Tab>
</Tabs>

***

## Interaction Object Properties

| Property     | Type     | Description              |
| ------------ | -------- | ------------------------ |
| elementId    | `String` | ID of interacted element |
| interactedAt | `Double` | Timestamp of interaction |

***

## InteractionGoal Object Properties

| Property        | Type                  | Description                               |
| --------------- | --------------------- | ----------------------------------------- |
| elementIds      | `[String]`            | IDs of target elements                    |
| interactionType | `InteractionGoalType` | `.anyAction`, `.anyOf`, `.allOf`, `.none` |

***

## Real-time Interactive Message Events

To receive interactive message events, implement `CometChatMessageDelegate`:

<Tabs>
  <Tab title="Swift">
    ```swift theme={null}
    class YourClass: CometChatMessageDelegate {
        
        init() {
            CometChat.addMessageListener("listener-id", self)
        }
        
        func onInteractiveMessageReceived(_ message: InteractiveMessage) {
            print("Interactive message received")
            print("Type: \(message.type ?? "")")
            print("Interactive Data: \(message.interactiveData ?? [:])")
        }
        
        func onInteractionGoalCompleted(_ message: InteractiveMessage) {
            print("Interaction goal completed")
            print("Message ID: \(message.id)")
        }
    }
    ```
  </Tab>
</Tabs>

***

## Next Steps

<CardGroup cols={2}>
  <Card title="Send Messages" icon="paper-plane" href="/sdk/ios/send-message">
    Send text, media, and custom messages
  </Card>

  <Card title="Receive Messages" icon="envelope-open" href="/sdk/ios/receive-message">
    Listen for incoming messages in real time
  </Card>

  <Card title="Reactions" icon="face-smile" href="/sdk/ios/reactions">
    Add emoji reactions to messages
  </Card>

  <Card title="Mentions" icon="at" href="/sdk/ios/mentions">
    Mention specific users in messages
  </Card>
</CardGroup>
