Slack's mobile client gives every button in an actions block its own full-width row, so the four ratings rendered as four stacked bars and the nudge filled the screen (user, with a screenshot). A select is one row and still one decision. The interactive route now resolves both shapes — a button carries `value`, a select carries it on `selected_option`. Reading only the former would have left sharing working while rating silently did nothing.
This commit is contained in:
@@ -61,7 +61,12 @@ export async function POST(req: NextRequest) {
|
|||||||
if (payload.type !== "block_actions") return new NextResponse(null, { status: 200 });
|
if (payload.type !== "block_actions") return new NextResponse(null, { status: 200 });
|
||||||
|
|
||||||
const action = payload.actions?.[0];
|
const action = payload.actions?.[0];
|
||||||
const [idStr, verb, arg] = String(action?.value ?? "").split(":");
|
// A button carries `value`; a select carries it on the chosen option. The
|
||||||
|
// ratings moved to a select because four buttons became four full-width rows
|
||||||
|
// on Slack mobile, so both shapes have to resolve or rating silently stops
|
||||||
|
// working while sharing still does.
|
||||||
|
const rawValue = action?.value ?? action?.selected_option?.value ?? "";
|
||||||
|
const [idStr, verb, arg] = String(rawValue).split(":");
|
||||||
const transactionId = Number(idStr);
|
const transactionId = Number(idStr);
|
||||||
if (!Number.isInteger(transactionId)) {
|
if (!Number.isInteger(transactionId)) {
|
||||||
return NextResponse.json({ text: "Could not tell which order that was." });
|
return NextResponse.json({ text: "Could not tell which order that was." });
|
||||||
|
|||||||
+16
-7
@@ -69,16 +69,25 @@ export function nudgeBlocks(s: NudgeState) {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
// A select, not four buttons. Slack's mobile client gives every button in
|
||||||
|
// an actions block its own full-width row, so four ratings became four
|
||||||
|
// stacked bars and the card filled the screen. One select is one row and
|
||||||
|
// still one decision; the extra tap to open it is the price of a nudge you
|
||||||
|
// can read at a glance.
|
||||||
{
|
{
|
||||||
type: "actions",
|
type: "actions",
|
||||||
block_id: "rate",
|
block_id: "rate",
|
||||||
elements: RATINGS.map((r) => ({
|
elements: [
|
||||||
type: "button",
|
{
|
||||||
action_id: `rate_${r}`,
|
type: "static_select",
|
||||||
text: { type: "plain_text", text: RATING_LABEL[r] },
|
action_id: "rate",
|
||||||
style: r === "never" ? "danger" : undefined,
|
placeholder: { type: "plain_text", text: "How was it?" },
|
||||||
value: `${s.transactionId}:rate:${r}`,
|
options: RATINGS.map((r) => ({
|
||||||
})),
|
text: { type: "plain_text", text: RATING_LABEL[r] },
|
||||||
|
value: `${s.transactionId}:rate:${r}`,
|
||||||
|
})),
|
||||||
|
},
|
||||||
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "context",
|
type: "context",
|
||||||
|
|||||||
Reference in New Issue
Block a user