diff --git a/packages/builders/src/interactions/modals/Assertions.ts b/packages/builders/src/interactions/modals/Assertions.ts index 97db2cb389d2..6a3cc2645481 100644 --- a/packages/builders/src/interactions/modals/Assertions.ts +++ b/packages/builders/src/interactions/modals/Assertions.ts @@ -2,6 +2,7 @@ import { s } from '@sapphire/shapeshift'; import { ActionRowBuilder, type ModalActionRowComponentBuilder } from '../../components/ActionRow.js'; import { customIdValidator } from '../../components/Assertions.js'; import { LabelBuilder } from '../../components/label/Label.js'; +import { TextDisplayBuilder } from '../../components/v2/TextDisplay.js'; import { isValidationEnabled } from '../../util/validation.js'; export const titleValidator = s @@ -10,7 +11,7 @@ export const titleValidator = s .lengthLessThanOrEqual(45) .setValidationEnabled(isValidationEnabled); export const componentsValidator = s - .union([s.instance(ActionRowBuilder), s.instance(LabelBuilder)]) + .union([s.instance(ActionRowBuilder), s.instance(LabelBuilder), s.instance(TextDisplayBuilder)]) .array() .lengthGreaterThanOrEqual(1) .setValidationEnabled(isValidationEnabled); @@ -18,7 +19,7 @@ export const componentsValidator = s export function validateRequiredParameters( customId?: string, title?: string, - components?: (ActionRowBuilder | LabelBuilder)[], + components?: (ActionRowBuilder | LabelBuilder | TextDisplayBuilder)[], ) { customIdValidator.parse(customId); titleValidator.parse(title); diff --git a/packages/builders/src/interactions/modals/Modal.ts b/packages/builders/src/interactions/modals/Modal.ts index 49f940db960c..58c31653be5e 100644 --- a/packages/builders/src/interactions/modals/Modal.ts +++ b/packages/builders/src/interactions/modals/Modal.ts @@ -7,6 +7,7 @@ import type { APIComponentInModalActionRow, APILabelComponent, APIModalInteractionResponseCallbackData, + APITextDisplayComponent, } from 'discord-api-types/v10'; import { ComponentType } from 'discord-api-types/v10'; import { ActionRowBuilder, type ModalActionRowComponentBuilder } from '../../components/ActionRow.js'; @@ -14,6 +15,7 @@ import { customIdValidator } from '../../components/Assertions.js'; import { createComponentBuilder, resolveBuilder } from '../../components/Components.js'; import { LabelBuilder } from '../../components/label/Label.js'; import { TextInputBuilder } from '../../components/textInput/TextInput.js'; +import { TextDisplayBuilder } from '../../components/v2/TextDisplay.js'; import { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js'; import { titleValidator, validateRequiredParameters } from './Assertions.js'; @@ -29,7 +31,8 @@ export class ModalBuilder implements JSONEncodable | LabelBuilder)[] = []; + public readonly components: (ActionRowBuilder | LabelBuilder | TextDisplayBuilder)[] = + []; /** * Creates a new modal from API data. @@ -68,24 +71,31 @@ export class ModalBuilder implements JSONEncodable | APIActionRowComponent | APILabelComponent + | APITextDisplayComponent | APITextInputComponent | LabelBuilder + | TextDisplayBuilder | TextInputBuilder > ) { this.components.push( ...normalizeArray(components).map((component, idx) => { - if (component instanceof ActionRowBuilder || component instanceof LabelBuilder) { + if ( + component instanceof ActionRowBuilder || + component instanceof LabelBuilder || + component instanceof TextDisplayBuilder + ) { return component; } + // Deprecated support if (component instanceof TextInputBuilder) { return new ActionRowBuilder().addComponents(component); } @@ -99,6 +109,11 @@ export class ModalBuilder implements JSONEncodable().addComponents( new TextInputBuilder(component), @@ -128,6 +143,24 @@ export class ModalBuilder implements JSONEncodable TextDisplayBuilder) + > + ) { + const normalized = normalizeArray(components); + const resolved = normalized.map((row) => resolveBuilder(row, TextDisplayBuilder)); + + this.components.push(...resolved); + + return this; + } + /** * Adds action rows to this modal. * @@ -211,7 +244,9 @@ export class ModalBuilder implements JSONEncodable | LabelBuilder>) { + public setComponents( + ...components: RestOrArray | LabelBuilder | TextDisplayBuilder> + ) { this.components.splice(0, this.components.length, ...normalizeArray(components)); return this; }