slack: dispatch the four intake taps on action_id (plan §11 C5)
intake_use_candidate / intake_create / intake_grocery / intake_meal carry JSON
{batch_id, ...} rather than <id>:<verb>, so they branch before the order-nudge
parse. They act on the persisted batch: enrich the chosen transaction, create
ING-10-style (statement_id NULL, owner_id from shared_by, source/source_ref
make a second press a no-op), or remember the merchant's kind and route. A tap
on an already-resolved batch returns its current card and writes nothing. Card
updates go to response_url, as the existing handlers do.
This commit is contained in:
@@ -6,6 +6,8 @@ import {
|
||||
slackUserForParticipant,
|
||||
} from "@/lib/slack-verify";
|
||||
import { nudgeBlocks, detailsModal, partnerNudgeBlocks } from "@/lib/slack-blocks";
|
||||
import { handleIntakeAction, isIntakeAction, parseActionValue } from "@/lib/intake-actions";
|
||||
import { pantryForwarder } from "@/lib/intake-pantry";
|
||||
import { completeSplit } from "@/lib/splits";
|
||||
import {
|
||||
RATINGS,
|
||||
@@ -73,6 +75,22 @@ export async function POST(req: NextRequest) {
|
||||
if (payload.type !== "block_actions") return new NextResponse(null, { status: 200 });
|
||||
|
||||
const action = payload.actions?.[0];
|
||||
|
||||
// Intake taps (plan §11 C5) act on a persisted batch, not a transaction, so
|
||||
// their `value` is JSON `{batch_id, ...}` rather than `<id>:<verb>`. They are
|
||||
// dispatched on action_id before the order-nudge parse below, which would
|
||||
// otherwise read the JSON as a non-numeric transaction id and give up.
|
||||
if (isIntakeAction(action?.action_id)) {
|
||||
const reply = await handleIntakeAction(action.action_id, parseActionValue(action?.value), { pantry: pantryForwarder() });
|
||||
await updateMessage(
|
||||
payload.response_url,
|
||||
reply.replace
|
||||
? { replace_original: true, blocks: reply.blocks, text: reply.text }
|
||||
: { response_type: "ephemeral", replace_original: false, text: reply.text }
|
||||
);
|
||||
return NextResponse.json({ blocks: reply.blocks, text: reply.text });
|
||||
}
|
||||
|
||||
// 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
|
||||
|
||||
Reference in New Issue
Block a user