モーダルの送信のリスニング
モーダルのペイロードに input
ブロックを含める場合、その入力値を受け取るためにview_submission
リクエストをリッスンする必要があります。view_submission
リクエストのリッスンには、組み込みのview()
メソッドを利用することができます。view()
の引数には、str
型または re.Pattern
型の callback_id
を指定します。
input
ブロックの値にアクセスするには state
オブジェクトを参照します。state
内には values
というオブジェクトがあり、block_id
と一意の action_id
に紐づける形で入力値を保持しています。
モーダル送信でのビューの更新
view_submission
リクエストに対してモーダルを更新するには、リクエストの確認の中で update
という response_action
と新しく作成した view
を指定します。
# モーダル送信でのビューの更新
@app.view("view_1")
def handle_submission(ack, body):
# build_new_view() method はモーダルビューを返します
# モーダルの構築には Block Kit Builder を試してみてください:
# https://app.slack.com/block-kit-builder/#%7B%22type%22:%22modal%22,%22callback_id%22:%22view_1%22,%22title%22:%7B%22type%22:%22plain_text%22,%22text%22:%22My%20App%22,%22emoji%22:true%7D,%22blocks%22:%5B%5D%7D
ack(response_action="update", view=build_new_view(body))
この例と同様に、モーダルでの送信リクエストに対して、エラーを表示するためのオプションもあります。
モーダルの送信について詳しくは、API ドキュメントを参照してください。
モーダルが閉じられたときの対応
view_closed
リクエストをリッスンするためには callback_id
を指定して、かつ notify_on_close
属性をモーダルのビューに設定する必要があります。以下のコード例をご覧ください。
よく詳しい情報は、API ドキュメントを参照してください。
client.views_open(
trigger_id=body.get("trigger_id"),
view={
"type": "modal",
"callback_id": "modal-id", # view_closed の処理時に必要
"title": {
"type": "plain_text",
"text": "Modal title"
},
"blocks": [],
"close": {
"type": "plain_text",
"text": "Cancel"
},
"notify_on_close": True, # この属性は必須
}
)
# view_closed リクエストを処理する
@app.view_closed("modal-id")
def handle_view_closed(ack, body, logger):
ack()
logger.info(body)
指定可能な引数の一覧はモジュールドキュメントを参考にしてください。
# view_submission リクエストを処理
@app.view("view_1")
def handle_submission(ack, body, client, view, logger):
# `input_c`という block_id に `dreamy_input` を持つ input ブロックがある場合
hopes_and_dreams = view["state"]["values"]["input_c"]["dreamy_input"]
user = body["user"]["id"]
# 入力値を検証
errors = {}
if hopes_and_dreams is not None and len(hopes_and_dreams) <= 5:
errors["input_c"] = "The value must be longer than 5 characters"
if len(errors) > 0:
ack(response_action="errors", errors=errors)
return
# view_submission リクエストの確認を行い、モーダルを閉じる
ack()
# 入力されたデータを使った処理を実行。このサンプルでは DB に保存する処理を行う
# そして入力値の検証結果をユーザーに送信
# ユーザーに送信するメッセージ
msg = ""
try:
# DB に保存
msg = f"Your submission of {hopes_and_dreams} was successful"
except Exception as e:
# エラーをハンドリング
msg = "There was an error with your submission"
# ユーザーにメッセージを送信
try:
client.chat_postMessage(channel=user, text=msg)
except e:
logger.exception(f"Failed to post a message {e}")