



























@@ -13,6 +13,10 @@ import { truncateSlackText } from "./truncate.js";
13131414const SLACK_SECTION_TEXT_MAX = 3000;
1515const SLACK_PLAIN_TEXT_MAX = 75;
16+const SLACK_OPTION_VALUE_MAX = 75;
17+const SLACK_BUTTON_VALUE_MAX = 2000;
18+const SLACK_STATIC_SELECT_OPTIONS_MAX = 100;
19+const SLACK_ACTION_BLOCK_ELEMENTS_MAX = 25;
16201721export type SlackBlock = Block | KnownBlock;
1822@@ -36,6 +40,10 @@ function resolveSlackButtonStyle(
3640return undefined;
3741}
384243+function isWithinSlackLimit(value: string, maxLength: number): boolean {
44+return value.length <= maxLength;
45+}
46+3947export function buildSlackInteractiveBlocks(interactive?: InteractiveReply): SlackBlock[] {
4048const initialState = {
4149blocks: [] as SlackBlock[],
@@ -58,26 +66,32 @@ export function buildSlackInteractiveBlocks(interactive?: InteractiveReply): Sla
5866return state;
5967}
6068if (block.type === "buttons") {
61-const elements = block.buttons.flatMap((button, choiceIndex) => {
62-if (!button.value && !button.url) {
63-return [];
64-}
65-const style = resolveSlackButtonStyle(button.style);
66-return [
67-{
68-type: "button" as const,
69-action_id: buildSlackReplyButtonActionId(state.buttonIndex + 1, choiceIndex),
70-text: {
71-type: "plain_text" as const,
72-text: truncateSlackText(button.label, SLACK_PLAIN_TEXT_MAX),
73-emoji: true,
69+const elements = block.buttons
70+.flatMap((button, choiceIndex) => {
71+const value =
72+button.value && isWithinSlackLimit(button.value, SLACK_BUTTON_VALUE_MAX)
73+ ? button.value
74+ : undefined;
75+if (!value && !button.url) {
76+return [];
77+}
78+const style = resolveSlackButtonStyle(button.style);
79+return [
80+{
81+type: "button" as const,
82+action_id: buildSlackReplyButtonActionId(state.buttonIndex + 1, choiceIndex),
83+text: {
84+type: "plain_text" as const,
85+text: truncateSlackText(button.label, SLACK_PLAIN_TEXT_MAX),
86+emoji: true,
87+},
88+ ...(value ? { value } : {}),
89+ ...(button.url ? { url: button.url } : {}),
90+ ...(style ? { style } : {}),
7491},
75- ...(button.value ? { value: button.value } : {}),
76- ...(button.url ? { url: button.url } : {}),
77- ...(style ? { style } : {}),
78-},
79-];
80-});
92+];
93+})
94+.slice(0, SLACK_ACTION_BLOCK_ELEMENTS_MAX);
8195if (elements.length === 0) {
8296return state;
8397}
@@ -88,7 +102,10 @@ export function buildSlackInteractiveBlocks(interactive?: InteractiveReply): Sla
88102});
89103return state;
90104}
91-if (block.options.length === 0) {
105+const options = block.options
106+.filter((option) => isWithinSlackLimit(option.value, SLACK_OPTION_VALUE_MAX))
107+.slice(0, SLACK_STATIC_SELECT_OPTIONS_MAX);
108+if (options.length === 0) {
92109return state;
93110}
94111state.blocks.push({
@@ -106,7 +123,7 @@ export function buildSlackInteractiveBlocks(interactive?: InteractiveReply): Sla
106123),
107124emoji: true,
108125},
109-options: block.options.map((option, _choiceIndex) => ({
126+options: options.map((option, _choiceIndex) => ({
110127text: {
111128type: "plain_text",
112129text: truncateSlackText(option.label, SLACK_PLAIN_TEXT_MAX),
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。