3
1

More than 3 years have passed since last update.

【slackアプリ】モーダルに隠しinputを入れる方法(private_metadata)

Posted at

開発環境

  • nodejs12.x
  • @slack/bolt": "^2.0.1"

やりたいこと

メッセージやモーダルのやりとりを、
「やりとりの発生したユーザーが居る部屋」という具合に可変にして送りたい。

commandなどの場合

body.channel_name に送信してきたユーザーのチャンネル名が入っているので楽勝。
これをチャンネル指定箇所に引数として渡してあげればOK。

  app.command('/aq-help', async ({ ack, body, client }) => {
    await ack()

    try {
      const result = await client.chat.postEphemeral({
        channel: body.channel_name, // ここ
        user: body.user_id,
        blocks: [
          {
// omit 

モーダルListen時(本題)

これが結構大変だった。
bodyにチャンネルの情報が入っていない。
リファレンスを漁ってもどこにもない!!

色々調べると、
speeeさんの開発している@speee-js/jsx-slackというライブラリを発見。
これはboltのblockをJSXで記述できるという素敵なライブラリだが、不思議な記述を発見。

<Modal title="modal">
  <Input type="hidden" name="foo" value="bar" />
  <Input type="hidden" name="userId" value={123} />

hiddenだって!?
そんな機能デフォルトでなかったぞ...!🤯

と、色々調べているとどうも private_metadata という機能を使用して実現している模様。
完全にリファレンス読み落としてた...

スクリーンショット 2021-07-19 13.41.23.png

見ての通りデータ型がStringで文字数制限があるので要注意。
送信時に取得した body.channel_name をここに入れてあげます。

app.command('/aq-register', async ({ ack, body, client }) => {
  const result = await client.views.open({
    trigger_id: body.trigger_id,
    private_metadata: body.channel_name,  // ここにデータを入れる
    callback_id: 'register',
   // 略

// モーダルListen側
app.view('register', async ({ ack, body, view, client }) => {
await ack()

/**
 * メッセージ送信
 */
try {
  await client.chat.postMessage({
  channel: view.private_metadata,  // ここでprivate_metadataを使用
  blocks: [
// 略

まとめ

チャンネル名だけではなく、おそらくprivate_metadata を駆使すれば送信してきたユーザ情報なども同様に取得できるものと思われます。
なぜStringなんだ。。。。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1