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

# MessageTemplateUtils & Data Source

> Customize how messages are rendered, what options appear on bubbles, and what formatters are used — all through the central MessageTemplateUtils registry.

`MessageTemplateUtils` is the central registry that defines how each message type is rendered, what options appear on message bubbles, and what text formatters are applied. It replaces the `DataSource` / `ChatConfigurator` pattern used in the Android UI Kit.

## How It Works

In V6, `MessageTemplateUtils` is a static utility class that provides:

* Message templates (how each message type is rendered as a bubble)
* Message options (long-press actions per message type)
* Text formatters (text processing for mentions, links, etc.)
* Message type/category lists (for request builder filtering)

Components call `MessageTemplateUtils` internally to get defaults. You override behavior by passing custom templates, options, or formatters directly to the component.

## Getting Default Templates

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    // Get all default templates
    final templates = MessageTemplateUtils.getAllMessageTemplates();

    // Get a specific template
    final textTemplate = MessageTemplateUtils.getTextMessageTemplate();
    final imageTemplate = MessageTemplateUtils.getImageMessageTemplate();

    // Get template by type and category
    final template = MessageTemplateUtils.getMessageTemplate(
      messageType: MessageTypeConstants.text,
      messageCategory: MessageCategoryConstants.message,
    );
    ```
  </Tab>
</Tabs>

## Available Template Methods

| Method                                             | Returns                                        |
| -------------------------------------------------- | ---------------------------------------------- |
| `getTextMessageTemplate()`                         | Template for text messages                     |
| `getImageMessageTemplate()`                        | Template for image messages                    |
| `getVideoMessageTemplate()`                        | Template for video messages                    |
| `getAudioMessageTemplate()`                        | Template for audio messages                    |
| `getFileMessageTemplate()`                         | Template for file messages                     |
| `getGroupActionTemplate()`                         | Template for group action messages             |
| `getFormMessageTemplate()`                         | Template for form messages                     |
| `getCardMessageTemplate()`                         | Template for card messages                     |
| `getSchedulerMessageTemplate()`                    | Template for scheduler messages                |
| `getPollMessageTemplate()`                         | Template for poll messages                     |
| `getStickerMessageTemplate()`                      | Template for sticker messages                  |
| `getCollaborativeDocumentTemplate()`               | Template for collaborative document messages   |
| `getCollaborativeWhiteboardTemplate()`             | Template for collaborative whiteboard messages |
| `getAllMessageTemplates()`                         | All templates combined                         |
| `getMessageTemplate(messageType, messageCategory)` | Template for a specific type/category          |

## Overriding Templates

### Replace All Templates

Pass a complete list of templates to `CometChatMessageList`:

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    CometChatMessageList(
      user: user,
      templates: [
        // Your custom text template
        CometChatMessageTemplate(
          type: MessageTypeConstants.text,
          category: MessageCategoryConstants.message,
          contentView: (message, context, alignment, {additionalConfigurations}) {
            return MyCustomTextBubble(message: message as TextMessage);
          },
          options: MessageTemplateUtils.getMessageOptions,
        ),
        // Keep defaults for other types
        MessageTemplateUtils.getImageMessageTemplate(),
        MessageTemplateUtils.getVideoMessageTemplate(),
        MessageTemplateUtils.getAudioMessageTemplate(),
        MessageTemplateUtils.getFileMessageTemplate(),
        MessageTemplateUtils.getGroupActionTemplate(),
      ],
    )
    ```
  </Tab>
</Tabs>

### Add or Override Specific Templates

Use `addTemplate` to merge custom templates with defaults. Templates are keyed by `category_type` — if your template matches an existing key, it overrides the default:

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    CometChatMessageList(
      user: user,
      addTemplate: [
        // Override text message rendering
        CometChatMessageTemplate(
          type: MessageTypeConstants.text,
          category: MessageCategoryConstants.message,
          contentView: (message, context, alignment, {additionalConfigurations}) {
            return MyCustomTextBubble(message: message as TextMessage);
          },
          options: MessageTemplateUtils.getMessageOptions,
        ),
        // Add a new custom message type
        CometChatMessageTemplate(
          type: 'contact',
          category: MessageCategoryConstants.custom,
          contentView: (message, context, alignment, {additionalConfigurations}) {
            return ContactCardBubble(message: message);
          },
        ),
      ],
    )
    ```
  </Tab>
</Tabs>

## Message Options

### Getting Default Options

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    // Get options for a specific message type
    final textOptions = MessageTemplateUtils.getTextMessageOptions(
      loggedInUser, messageObject, context, group, additionalConfigurations,
    );

    // Get options for any message (dispatches by type)
    final options = MessageTemplateUtils.getMessageOptions(
      loggedInUser, messageObject, context, group, additionalConfigurations,
    );

    // Get common options (shared across all types)
    final commonOptions = MessageTemplateUtils.getCommonOptions(
      loggedInUser, messageObject, context, group, additionalConfigurations,
    );
    ```
  </Tab>
</Tabs>

### Option Methods by Message Type

| Method                        | Message Type                                   |
| ----------------------------- | ---------------------------------------------- |
| `getTextMessageOptions(...)`  | Text                                           |
| `getImageMessageOptions(...)` | Image                                          |
| `getVideoMessageOptions(...)` | Video                                          |
| `getAudioMessageOptions(...)` | Audio                                          |
| `getFileMessageOptions(...)`  | File                                           |
| `getCommonOptions(...)`       | Shared across all types                        |
| `getMessageOptions(...)`      | Dispatches to the correct type-specific method |

## Text Formatters

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    // Get default formatters
    final formatters = MessageTemplateUtils.getDefaultTextFormatters();
    // Returns: [CometChatMentionsFormatter, CometChatEmailFormatter, CometChatPhoneNumberFormatter]
    ```
  </Tab>
</Tabs>

## Type and Category Lists

Used when building custom `MessagesRequestBuilder` instances:

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    // All registered message types
    final types = MessageTemplateUtils.getAllMessageTypes();

    // All registered message categories
    final categories = MessageTemplateUtils.getAllMessageCategories();
    ```
  </Tab>
</Tabs>

## Comparison with Android's DataSource

| Android                            | Flutter V6                                               | Notes                                                    |
| ---------------------------------- | -------------------------------------------------------- | -------------------------------------------------------- |
| `ChatConfigurator.getDataSource()` | `MessageTemplateUtils` (static)                          | Flutter uses static methods instead of a decorator chain |
| `DataSourceDecorator` pattern      | Template overrides via `templates` / `addTemplate` props | Flutter overrides at the component level, not globally   |
| `CometChatUIKit.getDataSource()`   | `MessageTemplateUtils`                                   | Same functionality, different access pattern             |
| Global decorator chain             | Per-component template lists                             | Flutter's approach is more explicit but less global      |

<Note>
  Unlike Android's `DataSourceDecorator` which applies globally, Flutter's template overrides are scoped to the component instance. To apply the same customization everywhere, pass the same template list to each `CometChatMessageList` instance.
</Note>

## Related

* [Message Template](/ui-kit/flutter/message-template) — Full template structure and examples.
* [Menu & Options](/ui-kit/flutter/customization-menu-options) — Component-level option customization.
* [Text Formatters](/ui-kit/flutter/customization-text-formatters) — Custom text processing.
* [Customization Overview](/ui-kit/flutter/customization-overview) — See all customization categories.
