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

# Edit Message

> Edit CometChat text and custom messages after sending them with the iOS SDK and update message state in chats.

<Accordion title="AI Integration Quick Reference">
  ```swift theme={null}
  // Edit a text message
  let textMessage = TextMessage(receiverUid: "UID", text: "Updated text", receiverType: .user)
  textMessage.id = 12345
  CometChat.edit(message: textMessage, onSuccess: { msg in }, onError: { err in })

  // Listen for real-time edits
  extension VC: CometChatMessageDelegate {
    func onMessageEdited(message: BaseMessage) {
      print("Edited:", message.id, message.editedAt)
    }
  }
  ```
</Accordion>

Editing a message is straightforward. Receiving edit events has two parts:

1. Adding a listener for [real-time edits](#real-time-message-edit-events) when your app is running
2. Fetching [missed edits](#missed-message-edit-events) when your app was offline

## Edit a Message

Use `CometChat.edit(message:)` with a [`TextMessage`](/sdk/reference/messages#textmessage) or [`CustomMessage`](/sdk/reference/messages#custommessage) object. Set the message ID on the object before calling edit.

```swift theme={null}
let textMessage = TextMessage(receiverUid: "cometchat-uid-2", text: "Updated message", receiverType: .user)
textMessage.id = 12345

CometChat.edit(message: textMessage, onSuccess: { (message) in
    print("Message edited: \(message)")
}, onError: { (error) in
    print("Error: \(error.errorDescription)")
})
```

The edited message object is returned with `editedAt` (timestamp) and `editedBy` (UID of editor) fields set.

The `edit()` method returns a [`BaseMessage`](/sdk/reference/messages#basemessage) object (or a subclass like [`TextMessage`](/sdk/reference/messages#textmessage)).

### Add/Update Tags

Use `tags` to update tags when editing. New tags replace existing ones.

```swift theme={null}
let tags = ["pinned", "important"]
let textMessage = TextMessage(receiverUid: "cometchat-uid-2", text: "Pinned message", receiverType: .user)
textMessage.id = 12345
textMessage.tags = tags

CometChat.edit(message: textMessage, onSuccess: {...}, onError: {...})
```

By default, CometChat allows certain users to edit a message:

| User            | Conversation Type | Edit Capabilities |
| --------------- | ----------------- | ----------------- |
| Message Sender  | One-on-one        | Own messages only |
| Message Sender  | Group             | Own messages only |
| Group Owner     | Group             | All messages      |
| Group Moderator | Group             | All messages      |

## Real-time Message Edit Events

The `onMessageEdited` callback receives a [`BaseMessage`](/sdk/reference/messages#basemessage) object with the `editedAt` and `editedBy` fields set.

```swift theme={null}
extension YourViewController: CometChatMessageDelegate {

    func onMessageEdited(message: BaseMessage) {
        print("Message edited: \(message.id)")
        print("Edited at: \(message.editedAt)")
        print("Edited by: \(message.editedBy ?? "")")

        if let textMessage = message as? TextMessage {
            print("New text: \(textMessage.text)")
        }
    }
}

// Register the delegate:
CometChat.messagedelegate = self
```

## Missed Message Edit Events

When fetching message history, edited messages have `editedAt` and `editedBy` fields set. Additionally, an [`Action`](/sdk/reference/messages#action) message is added to history indicating the edit.

The [`Action`](/sdk/reference/messages#action) object contains:

* `action` — `edited`
* `actionOn` — Updated message object
* `actionBy` — User who edited the message
* `actionFor` — Receiver (User or Group)

```swift theme={null}
for message in messages {
    if message.editedAt > 0 {
        print("Message \(message.id) was edited at \(message.editedAt)")
    }

    if let actionMessage = message as? ActionMessage {
        if actionMessage.action == .messageEdited {
            print("Edit action detected")
        }
    }
}
```

<Note>
  You must be the message sender or a group admin/moderator to edit a message.
</Note>

***

## Next Steps

<CardGroup cols={2}>
  <Card title="Delete a Message" icon="trash" href="/sdk/ios/delete-message">
    Remove messages from conversations
  </Card>

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

  <Card title="Threaded Messages" icon="comments" href="/sdk/ios/threaded-messages">
    Organize conversations with message threads
  </Card>

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