Как отобразить ошибки проверки не входных блоков в модалах Slack - PullRequest
3 голосов
/ 14 февраля 2020

Вопрос

У меня Slack модальный с блоком section, содержащим элемент ввода. Когда пользователь отправляет мой мод без ввода значения в этот ввод, как мне сообщить об этой ошибке пользователю?

Моя попытка № 1: ответить с ошибкой проверки

Документация Slack описывает, как проверить блоки input при получении события view_submission (https://api.slack.com/surfaces/modals/using#displaying_errors). Но если я возвращаю ошибку для блока section, содержащего static_select, то Slack не отображает сообщение об ошибке (и при этом он не закрывает модальное окно).

Моя попытка # 2: установить optional field to false

input блоки имеют поле optional, которое можно использовать для проверки. Но static_select в блоке section не имеет поля optional: https://api.slack.com/reference/block-kit/block-elements#select

Моя попытка № 3: использовать input блоки

Я не могу использовать input блоки, потому что они не вызывают block_actions сообщений (задокументировано в https://api.slack.com/surfaces/modals/using#interactions). Мне нужно обновить модальный режим, когда пользователи отвечают на вопросы.

Моя попытка № 4: решение для отчаяния, которое работает

Я мог бы ответить на событие view_submission с помощью "response_action ":" update " ответ. В этом ответе выведите сообщение об ошибке, подобное этому, над входом с пропущенным значением:

{
  "type": "section",
  "text": {
    "type": "mrkdwn",
    "text": "*Please provide a start time:*"
  }
}

Мне не нравится это решение, потому что я сомневаюсь, что смогу продублировать приятный UX для обмена сообщениями об ошибках, который Slack предоставляет для input проверка блока.

Подробности

Вот упрощенная версия параметра view, который я передаю вызову views.open :

{
  "blocks": [
    {
      "block_id": "start_times",
      "type": "section",
      "text": {
        "type": "plain_text",
        "text": "Choose a start time"
      },
      "accessory": {
        "action_id": "start_times",
        "type": "static_select",
        "placeholder": {
          "type": "plain_text",
          "text": "Choose start"
        },
        "options": [
          {
            "text": {
              "type": "plain_text",
              "text": "10:27 pm"
            },
            "value":
              "{\"path\":\"bookings/new\",\"date\":\"2020-02-14 04:27:22 UTC\"}"
          },
          {
            "text": {
              "type": "plain_text",
              "text": "10:45 pm"
            },
            "value":
              "{\"path\":\"bookings/new\",\"date\":\"2020-02-14 04:45:00 UTC\"}"
          }
        ]
      }
    }
  ],
  "callback_id": "create booking",
  "private_metadata":
    "{\"channel_id\":\"C6M2A4690\",\"min_start_time\":\"2020-02-14 04:27:22 UTC\",\"path\":\"bookings/create\",\"room_id\":175128,\"selected_end_time\":null,\"selected_start_time\":null}",
  "type": "modal",
  "submit": {
    "type": "plain_text",
    "text": "Book"
  },
  "title": {
    "type": "plain_text",
    "text": "Booking room"
  }
}

Если пользователь сразу нажимает кнопку «Отправить», это мой ответ на событие view_submission:

{
  "response_action": "errors",
  "errors": {
    "start_times": "Please complete this required field"
  }
}

После получения моего ответа Слэк выключает счетчик, оставляет модальный режим открытым, но не отобразить сообщение об ошибке. Модал выглядит точно так же, как при первом открытии через views.open.

...