Anketのメッセージをjsx-slackを使ってBlock Kitベースへ変更しました

Block Kit は 今年の2月に発表されたツールセットです。
これを使うことで今までよりもリッチに情報を表示したりSlack Appの対話性が向上するようです。

japan.zdnet.com

実際に見てみるのが早いです。
Block Kit Builder というプロトタイピングツールが提供されているのでこれを使用すると Block Kit を使用した時にどんなことができるのかを試すことができます!!

まずは今回 Anket に適用してどうかわったのかを見ていきます。

before after

ヘルプの before after

/anket help とチャンネルで入力するとAnket ではヘルプメッセージを返信します。

before

f:id:hatappi1225:20190310001433p:plain

after

f:id:hatappi1225:20190310001501p:plain

afterのほうを見ていただくとヘルプメッセージの他に画面の右のほうにaccessoryという画面が表示されていたり、線がひいてあるのがわかると思います。
なんかそれっぽい!!

アンケート作成の before after

次は /anket 好きな色は? のようにタイトルだけ入力した時に細かい設定を作成する時に使用するメッセージのbefore, afterです。

before . f:id:hatappi1225:20190310085132p:plain

after f:id:hatappi1225:20190310085153p:plain

今回 Block Kit を使用した中で大抵は見た目をリッチにする部分が多かったのですがこの質問作成のメッセージではユーザー体験をよくするための機能が使われてます。
それが DatePicker です。

個人的には今回の Block Kit で追加された一番嬉しい機能です!!!
というのも今までのAnketはアンケートの期限を設定する時の日時をフリーテキストで入力してました。
システム的にはバリデーションをかけていたので 「ほげ」みたいな入力は通らないのですが、ユーザー観点からすると面倒。。。
Slackの仕様上しかたないとはいえモヤモヤしていたのですが今回の Block Kit で DatePicker が使えるようになったのでモヤモヤが晴れました☀️

f:id:hatappi1225:20190310090053p:plain

アンケート回答の before after

最後は一番ユーザーの目にふれるアンケートに回答するためのメッセージ

before f:id:hatappi1225:20190310090202p:plain

after f:id:hatappi1225:20190310090217p:plain

今回見た目を一番いじったのはこのメッセージだと思います。
特にこうしたかったという変更でこの形になったわけではなく折角 Block Kit 使うのだから回答の選択肢の横に回答するボタンおいてみようとか配置していったらこんな形になりましたww

技術的な話

Anket で使用している botkit は 0.7.3 から Block Kit をサポートしています。

github.com

コードは↓な感じで指定していきます。

const content = {
  blocks: [
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "This is a mrkdwn section block :ghost: *this is bold*, and ~this is crossed out~, and <https://google.com|this is a link>"
      }
    }
  ]
};

bot.reply(message, content);

単にメッセージを通知するだけなら Block Kit Builder を使って通知したいメッセージを作成してJSONをペタッてはれば良いと思います。
ただ Anket のように ユーザーのアクションによってメッセージの中身を変更したり細かい挙動の切り替えが必要になった時やメッセージの中身が大きくなってくと JSON で作成していくのが面倒になります。

そこで今回使用したのが次に紹介する jsx-slack です。

jsx-slack

github.com

jsx-slack は block kit のためのメッセージ作成を jsx で作成することができる package です。
Reactとかで jsx を使っている方は描き馴染みのあるフォーマットで block kit のメッセージを構築することができます。

例えばこんな感じで jsx で書きます。

<Block>
  <Section>
    <p>好きな色は?</p>
  </Section>
  <Divider />
  <Actions>
    <Button actionId="red">赤</Button>
    <Button actionId="blue">青</Button>
  </Actions>
</Block>

すると実際にはこんな感じの JSON が生成されます。

[
  {
    "type": "section",
    "text": {
      "text": "好きな色は?",
      "type": "mrkdwn",
      "verbatim": true
    }
  },
  {
    "type": "divider"
  },
  {
    "type": "actions",
    "elements": [
      {
        "type": "button",
        "text": {
          "type": "plain_text",
          "text": "",
          "emoji": true
        },
        "action_id": "red"
      },
      {
        "type": "button",
        "text": {
          "type": "plain_text",
          "text": "",
          "emoji": true
        },
        "action_id": "blue"
      }
    ]
  }
]

これが Slack 上でみると次のように見えます。

f:id:hatappi1225:20190310110440p:plain

詳細な使い方は jsx-slackのREADME.md がどんなコンポーネントがあるかなどが丁寧に書いてあるのでそっちを見ると良いです。
さらに jsx-slack は REPL も提供していて実際にコンポーネントを配置した時にどんな block kit 用のJSONが出力されるかを確認することができます。

speee-jsx-slack.netlify.com

便利だ!!

最後に

今回は Anket のメッセージを jsx-slack を使用して block kit ベースへと変更しました!
まだまだβ版ですが良かったら使ってみてください。

anket-hq.slack.com