# Surface Components

The root component of a view containing layout components.

You can add components to these surfaces: the Home tab, messages, and modals.

## Home

The Home tab is a persistent, dynamic interface for apps.

Present each of your users with a unique Home tab just for them, always found in the same place.

The Home tab is a space you can fully customize in your app, complete with intricate layouts and deep interactivity. A single API endpoint handles building and updating the Home tab. See [Home is where the tabs are](https://api.slack.com/surfaces/tabs).

Publish views to the app's home tab in Slack using Slack.BotClient. See [Access a Slack Client](/docs/platform/salesforce-slack-sdk/guide/actions_register.md#access-a-slack-client).

:::warning
Apex SDK for Slack is subject to Slack's block limit, which is 100 blocks in a the Home tab. If you are displaying Salesforce record data that exceeds 100 blocks, we recommend that you provide a button or link that directs a user back to Salesforce for a complete view.
:::

![Home tab example](https://a.sfdcstatic.com/developer-website/sfdocs/salesforce-slack-sdk/media/home.png)

**Examples**

This example creates a header and section for the Home tab.

```yaml
components:
  - definition: home
    components:
      - definition: header
        properties:
          text: "Our App"
      - definition: section
        properties:
          text:
            type: "mrkdwn"
            text: "Our app helps you take off. :rocket:"
      - definition: divider
      - definition: section
        properties:
          text: "For more information, check out the example."
        components:
          - definition: button
            properties:
              name: "my_button"
              label: "Click Me"
              url: "https://www.example.com"
```

This example creates some text, a header, and several buttons for the Home tab.

```yaml
description: "This is a simple app home"
schema:
  properties:
    bodyText:
      type: string
      required: true
    headerText:
      type: string
      defaultValue: "Welcome Home"
components:
  - definition: home
    components:
      - definition: header
        properties:
          text: "{!view.properties.headerText}"
      - definition: section
        properties:
          text:
            type: "mrkdwn"
            text: "{!view.properties.bodyText}"
      - definition: divider
      - definition: actions
        components:
          - definition: button
            properties:
              label: "Click Me"
              name: "homeButton"
              value: "someData"
            events:
              onclick:
                definition: "apex__action__HandleClick"
          - definition: button
            properties:
              label: "View Opportunity"
              name: "opptyButton"
            events:
              onclick:
                definition: "apex__action__ViewRecord"
                properties:
                  objectApiName: "Opportunity"
                  recordId: "006R0000003FpnmIII"
```

**Keys**

| Key          | Type   | Required | Description                                                                           |
| ------------ | ------ | -------- | ------------------------------------------------------------------------------------- |
| `definition` | String | Yes      | The value must be `home`.                                                             |
| `components` | Array  | Yes      | An array of [layout components](/docs/platform/salesforce-slack-sdk/guide/layout.md). |

## Message

Messages are one of the basic ingredients of Slack apps. Compose them, send them, retrieve them, update them, delete them.

Send messages to a channel using `Slack.BotClient` and `Slack.UserClient`. See [Access a Slack Client](/docs/platform/salesforce-slack-sdk/guide/actions_register.md#access-a-slack-client).

:::warning
Apex SDK for Slack is subject to Slack's block limit, which is 50 blocks in a message. If you are displaying Salesforce record data that exceeds 50 blocks, we recommend that you provide a button or link that directs a user back to Salesforce for a complete view.
:::

![Message example](https://a.sfdcstatic.com/developer-website/sfdocs/salesforce-slack-sdk/media/message.png)

**Examples**

This example creates a message with a header and a section containing some text.

```yaml
components:
  - definition: message
    properties:
      text: "All your tasks are completed."
    components:
      - definition: header
        properties:
          text: "Daily Tasks"
      - definition: section
        properties:
          text:
            type: "mrkdwn"
            text: "You've completed all your tasks today. :tada:"
```

This example creates a message with a header and a button that opens a URL.

```yaml
description: "This is the app welcome message."
schema:
  properties:
    homeLink:
      type: string
      required: true
components:
  - definition: message
    properties:
      text: "This is the app welcome message."
    components:
      - definition: header
        properties:
          text: "Welcome!"
      - definition: actions
        components:
          - definition: button
            properties:
              name: "visit_home_button"
              label: "Visit the Home Page"
              url: "{!view.properties.homeLink}"
```

**Keys**

| Key               | Type                                                                           | Required | Description                                                                                                                                                                     |
| ----------------- | ------------------------------------------------------------------------------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `definition`      | String                                                                         | Yes      | The value must be `message`.                                                                                                                                                    |
| `properties`      | Object                                                                         | No       | The component's properties.                                                                                                                                                     |
| `properties.text` | String, [Expression](/docs/platform/salesforce-slack-sdk/guide/expressions.md) | No       | When you use components in a message payload, `text` becomes a fallback message displayed in notifications. Use components to define everything else about the visible message. |
| `components`      | Array                                                                          | No       | An array of [layout components](/docs/platform/salesforce-slack-sdk/guide/layout.md) to render as the message.                                                                  |

## Modal

Modals are focused spaces to request and collect data from users, or to temporarily display dynamic and interactive information.

Modals are the Slack app equivalent of alert boxes, pop-ups, or dialog boxes. They capture and maintain focus within Slack until the user submits or dismisses the modal. Compose a modal using visual and interactive components.

If you're not familiar with a modal's lifecycle in a Slack app, see [Modals: focused spaces for user interaction](https://api.slack.com/surfaces/modals).

Modals can handle these interaction payloads.

- `block_actions`—Received when a user interacts with a component
- `view_submission`—Received when a user submits a view in a modal.
- `view_closed`—Received when a user dismisses a modal. To receive these payloads, the modal view must have been created with the `notify_on_close` argument set to `true`.

Payloads include a `trigger_id` that you must use to respond back with a modal. Slack has a 3-second expiration on the `trigger_id`.

But what if you're making an API call to fetch some data? A request could exceed this 3-second timeout. To satisfy the 3-second ack rule and work with modals, use the `Slack.ActionHandler` Apex class. [`Slack.ActionHandler`](/docs/platform/salesforce-slack-sdk/guide/apex_ref_dispatchers.md#actionhandler-class) has a number of methods to help you structure your handler. You can respond to Slack with a staging modal, which is a simple **Loading...** view. At this point, app code can take time to build up the actual modal view to show.

:::warning
Apex SDK for Slack is subject to Slack's block limit, which is 100 blocks in a modal. If you are displaying Salesforce record data that exceeds 100 blocks, we recommend that you provide a button or link that directs a user back to Salesforce for a complete view.
:::

![Modal example](https://a.sfdcstatic.com/developer-website/sfdocs/salesforce-slack-sdk/media/modal.png)

**Example**

```yaml
components:
  - definition: modal
    properties:
      title: "Update Opportunity"
      submitLabel: "Update"
      closeLabel: "Cancel"
    events:
      onsubmit:
        definition: "apex__action__EditRecord"
        properties:
          recordId: "{!view.properties.recordId}"
          objectApiName: "Opportunity"
      oncancel:
        definition: "apex__action__CancelSave"
        properties:
          recordId: "{!view.properties.recordId}"
          objectApiName: "Opportunity"
    components:
      - definition: section
        properties:
          text: "Text Value"
```

**Keys**

| Key                          | Type                                                                                                                                                                          | Required | Description                                                                                                                   |
| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------- |
| `definition`                 | String                                                                                                                                                                        | Yes      | The value must be `modal`.                                                                                                    |
| `properties`                 | Object                                                                                                                                                                        | Yes      | The component's properties                                                                                                    |
| `properties.title`           | String, [Plain Text](/docs/platform/salesforce-slack-sdk/guide/composition.md#plain-text), [Expression](/docs/platform/salesforce-slack-sdk/guide/expressions.md#expressions) | Yes      | Title text for the modal                                                                                                      |
| `properties.submitLabel`     | String, [Plain Text](/docs/platform/salesforce-slack-sdk/guide/composition.md#plain-text), [Expression](/docs/platform/salesforce-slack-sdk/guide/expressions.md#expressions) | No       | A label for the submit button                                                                                                 |
| `properties.closeLabel`      | String, [Plain Text](/docs/platform/salesforce-slack-sdk/guide/composition.md#plain-text), [Expression](/docs/platform/salesforce-slack-sdk/guide/expressions.md#expressions) | No       | A label for the close button                                                                                                  |
| `components`                 | Array                                                                                                                                                                         | No       | An array of [layout components](/docs/platform/salesforce-slack-sdk/guide/layout.md) to render inside the modal.              |
| `events`                     | Object                                                                                                                                                                        | No       | The events on the modal that trigger [Actions](/docs/platform/salesforce-slack-sdk/guide/layout.md#actions) to execute.       |
| `events.onsubmit`            | Object                                                                                                                                                                        | No       | An object that defines the action to take when the `onsubmit` event fires and the properties to pass to the action.           |
| `events.onsubmit.definition` | String                                                                                                                                                                        | No       | The [action](/docs/platform/salesforce-slack-sdk/guide/layout.md#actions) that executes when a user clicks the submit button. |
| `events.onsubmit.properties` | Object                                                                                                                                                                        | No       | The properties to pass to the action.                                                                                         |
| `events.oncancel`            | Object                                                                                                                                                                        | No       | An object that defines the action to take when the `oncancel` event fires and the properties to pass to the action.           |
| `events.oncancel.definition` | String                                                                                                                                                                        | No       | The [action](/docs/platform/salesforce-slack-sdk/guide/layout.md#actions) that executes when a user clicks the cancel button. |
| `events.oncancel.properties` | Object                                                                                                                                                                        | No       | The properties to pass to the action.                                                                                         |

## See Also

- [Creating useful dialogs](https://api.slack.com/best-practices/creating-useful-dialogs)

- [Interacting with users through dialogs](https://api.slack.com/dialogs)
