Slack 应用程序在之前的模态提交后打开新模态不一致,为什么?
Slack app opening new modal after previous modal submit is inconsistent, why?
我创建了一个新的免费 slack 工作区来学习 slack 机器人应用 API。我有一个动作处理程序,它侦听全局快捷方式并打开输入模式作为响应。还有另一个动作处理程序监听模态输入提交 callback_id
,做一些工作,然后使用 trigger_id
打开另一个模态。
app.view('do_thing_b.submit', async (slack) => {
try {
await slack.ack()
console.info(`Received modal submit`)
// TODO: actual work to save the data
const view = {
type: 'modal',
callback_id: 'do_thing_b.received_submission',
title: {
text: 'Thing B Done',
type: 'plain_text',
},
blocks: [
{
type: 'section',
text: {
text: 'My Plain Text',
type: 'plain_text',
emoji: true,
},
},
],
close: {
text: 'Close',
type: 'plain_text'
}
}
const openViewParams = {
trigger_id: slack.body.trigger_id,
view,
}
console.log(`Opening Done Modal with open view params ${JSON.stringify(openViewParams)}`)
const result = await slack.client.views.open(openViewParams)
console.log(`=============================== Done modal opened?`)
console.debug(result)
}
catch (err) {
console.error(`Error submitting Thing B modal:`)
console.error(err)
}
})
不一致之处在于,仅当 运行 应用程序在 SocketMode 中针对本地代码时,这才按预期工作。
当我部署应用程序并禁用套接字模式时,表单提交从未触发显示第二个模式。我能够在日志中看到与在本地 运行 时看到的代码行为相同的证据。 await slack.client.views.open(openViewParams)
调用成功,结果日志指示来自 slack 的 200 ok 响应。
我为事件和交互设置了与全局快捷方式相同的请求 URL。事实上,我还有一个斜杠命令,可以向用户发布一个短暂的帮助屏幕,类似于 /polly
命令的作用。该消息包含一个按钮,该按钮也会触发显示此模态表单。单击该按钮在本地打开模态显示完全相同的行为:当 运行 在本地使用处于套接字模式的应用程序时,它按预期工作,但在提交后从不显示后续模态。
后续问题:
如果这是不允许的,那么 slack 应用应该如何响应数据输入提交事件?我还尝试将一个新视图推到模式上,但关闭提交确认视图只是滑回原始表单,我希望它关闭整个模型。我是否需要向用户发送一条临时消息以在他们提交数据输入后跟进?
原来我不需要打开模态,我需要做的就是更新现有的模态。而不是用 trigger_id
调用 await slack.client.views.open
,我应该这样做:
app.view('do_thing_b.submit', async (slack) => {
try {
console.info(`Received modal submit`)
// TODO: actual work to save the data
const view = {
type: 'modal',
callback_id: 'do_thing_b.received_submission',
title: {
text: 'Thing B Done',
type: 'plain_text',
},
blocks: [
{
type: 'section',
text: {
text: 'My Plain Text',
type: 'plain_text',
emoji: true,
},
},
],
close: {
text: 'Close',
type: 'plain_text'
}
}
const result = await slack.ack({
response_action: 'update', view
})
}
catch (err) {
console.error(`Error submitting Thing B modal:`)
console.error(err)
}
})
我一直缺少的文档是这些:
我创建了一个新的免费 slack 工作区来学习 slack 机器人应用 API。我有一个动作处理程序,它侦听全局快捷方式并打开输入模式作为响应。还有另一个动作处理程序监听模态输入提交 callback_id
,做一些工作,然后使用 trigger_id
打开另一个模态。
app.view('do_thing_b.submit', async (slack) => {
try {
await slack.ack()
console.info(`Received modal submit`)
// TODO: actual work to save the data
const view = {
type: 'modal',
callback_id: 'do_thing_b.received_submission',
title: {
text: 'Thing B Done',
type: 'plain_text',
},
blocks: [
{
type: 'section',
text: {
text: 'My Plain Text',
type: 'plain_text',
emoji: true,
},
},
],
close: {
text: 'Close',
type: 'plain_text'
}
}
const openViewParams = {
trigger_id: slack.body.trigger_id,
view,
}
console.log(`Opening Done Modal with open view params ${JSON.stringify(openViewParams)}`)
const result = await slack.client.views.open(openViewParams)
console.log(`=============================== Done modal opened?`)
console.debug(result)
}
catch (err) {
console.error(`Error submitting Thing B modal:`)
console.error(err)
}
})
不一致之处在于,仅当 运行 应用程序在 SocketMode 中针对本地代码时,这才按预期工作。
当我部署应用程序并禁用套接字模式时,表单提交从未触发显示第二个模式。我能够在日志中看到与在本地 运行 时看到的代码行为相同的证据。 await slack.client.views.open(openViewParams)
调用成功,结果日志指示来自 slack 的 200 ok 响应。
我为事件和交互设置了与全局快捷方式相同的请求 URL。事实上,我还有一个斜杠命令,可以向用户发布一个短暂的帮助屏幕,类似于 /polly
命令的作用。该消息包含一个按钮,该按钮也会触发显示此模态表单。单击该按钮在本地打开模态显示完全相同的行为:当 运行 在本地使用处于套接字模式的应用程序时,它按预期工作,但在提交后从不显示后续模态。
后续问题:
如果这是不允许的,那么 slack 应用应该如何响应数据输入提交事件?我还尝试将一个新视图推到模式上,但关闭提交确认视图只是滑回原始表单,我希望它关闭整个模型。我是否需要向用户发送一条临时消息以在他们提交数据输入后跟进?
原来我不需要打开模态,我需要做的就是更新现有的模态。而不是用 trigger_id
调用 await slack.client.views.open
,我应该这样做:
app.view('do_thing_b.submit', async (slack) => {
try {
console.info(`Received modal submit`)
// TODO: actual work to save the data
const view = {
type: 'modal',
callback_id: 'do_thing_b.received_submission',
title: {
text: 'Thing B Done',
type: 'plain_text',
},
blocks: [
{
type: 'section',
text: {
text: 'My Plain Text',
type: 'plain_text',
emoji: true,
},
},
],
close: {
text: 'Close',
type: 'plain_text'
}
}
const result = await slack.ack({
response_action: 'update', view
})
}
catch (err) {
console.error(`Error submitting Thing B modal:`)
console.error(err)
}
})
我一直缺少的文档是这些: