Skip to content

Commit 99b8436

Browse files
authored
fix(builders): text display component support for modals (#11155)
1 parent 9a60e40 commit 99b8436

File tree

2 files changed

+42
-6
lines changed

2 files changed

+42
-6
lines changed

packages/builders/src/interactions/modals/Assertions.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { s } from '@sapphire/shapeshift';
22
import { ActionRowBuilder, type ModalActionRowComponentBuilder } from '../../components/ActionRow.js';
33
import { customIdValidator } from '../../components/Assertions.js';
44
import { LabelBuilder } from '../../components/label/Label.js';
5+
import { TextDisplayBuilder } from '../../components/v2/TextDisplay.js';
56
import { isValidationEnabled } from '../../util/validation.js';
67

78
export const titleValidator = s
@@ -10,15 +11,15 @@ export const titleValidator = s
1011
.lengthLessThanOrEqual(45)
1112
.setValidationEnabled(isValidationEnabled);
1213
export const componentsValidator = s
13-
.union([s.instance(ActionRowBuilder), s.instance(LabelBuilder)])
14+
.union([s.instance(ActionRowBuilder), s.instance(LabelBuilder), s.instance(TextDisplayBuilder)])
1415
.array()
1516
.lengthGreaterThanOrEqual(1)
1617
.setValidationEnabled(isValidationEnabled);
1718

1819
export function validateRequiredParameters(
1920
customId?: string,
2021
title?: string,
21-
components?: (ActionRowBuilder<ModalActionRowComponentBuilder> | LabelBuilder)[],
22+
components?: (ActionRowBuilder<ModalActionRowComponentBuilder> | LabelBuilder | TextDisplayBuilder)[],
2223
) {
2324
customIdValidator.parse(customId);
2425
titleValidator.parse(title);

packages/builders/src/interactions/modals/Modal.ts

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ import type {
77
APIComponentInModalActionRow,
88
APILabelComponent,
99
APIModalInteractionResponseCallbackData,
10+
APITextDisplayComponent,
1011
} from 'discord-api-types/v10';
1112
import { ComponentType } from 'discord-api-types/v10';
1213
import { ActionRowBuilder, type ModalActionRowComponentBuilder } from '../../components/ActionRow.js';
1314
import { customIdValidator } from '../../components/Assertions.js';
1415
import { createComponentBuilder, resolveBuilder } from '../../components/Components.js';
1516
import { LabelBuilder } from '../../components/label/Label.js';
1617
import { TextInputBuilder } from '../../components/textInput/TextInput.js';
18+
import { TextDisplayBuilder } from '../../components/v2/TextDisplay.js';
1719
import { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';
1820
import { titleValidator, validateRequiredParameters } from './Assertions.js';
1921

@@ -29,7 +31,8 @@ export class ModalBuilder implements JSONEncodable<APIModalInteractionResponseCa
2931
/**
3032
* The components within this modal.
3133
*/
32-
public readonly components: (ActionRowBuilder<ModalActionRowComponentBuilder> | LabelBuilder)[] = [];
34+
public readonly components: (ActionRowBuilder<ModalActionRowComponentBuilder> | LabelBuilder | TextDisplayBuilder)[] =
35+
[];
3336

3437
/**
3538
* Creates a new modal from API data.
@@ -68,24 +71,31 @@ export class ModalBuilder implements JSONEncodable<APIModalInteractionResponseCa
6871
* Adds components to this modal.
6972
*
7073
* @param components - The components to add
71-
* @deprecated Use {@link ModalBuilder.addLabelComponents} or {@link ModalBuilder.addActionRowComponents} instead
74+
* @deprecated Use {@link ModalBuilder.addLabelComponents} or {@link ModalBuilder.addTextDisplayComponents} instead
7275
*/
7376
public addComponents(
7477
...components: RestOrArray<
7578
| ActionRowBuilder<ModalActionRowComponentBuilder>
7679
| APIActionRowComponent<APIComponentInModalActionRow>
7780
| APILabelComponent
81+
| APITextDisplayComponent
7882
| APITextInputComponent
7983
| LabelBuilder
84+
| TextDisplayBuilder
8085
| TextInputBuilder
8186
>
8287
) {
8388
this.components.push(
8489
...normalizeArray(components).map((component, idx) => {
85-
if (component instanceof ActionRowBuilder || component instanceof LabelBuilder) {
90+
if (
91+
component instanceof ActionRowBuilder ||
92+
component instanceof LabelBuilder ||
93+
component instanceof TextDisplayBuilder
94+
) {
8695
return component;
8796
}
8897

98+
// Deprecated support
8999
if (component instanceof TextInputBuilder) {
90100
return new ActionRowBuilder<ModalActionRowComponentBuilder>().addComponents(component);
91101
}
@@ -99,6 +109,11 @@ export class ModalBuilder implements JSONEncodable<APIModalInteractionResponseCa
99109
return new LabelBuilder(component);
100110
}
101111

112+
if (component.type === ComponentType.TextDisplay) {
113+
return new TextDisplayBuilder(component);
114+
}
115+
116+
// Deprecated, should go in a label component
102117
if (component.type === ComponentType.TextInput) {
103118
return new ActionRowBuilder<ModalActionRowComponentBuilder>().addComponents(
104119
new TextInputBuilder(component),
@@ -128,6 +143,24 @@ export class ModalBuilder implements JSONEncodable<APIModalInteractionResponseCa
128143
return this;
129144
}
130145

146+
/**
147+
* Adds text display components to this modal.
148+
*
149+
* @param components - The components to add
150+
*/
151+
public addTextDisplayComponents(
152+
...components: RestOrArray<
153+
APITextDisplayComponent | TextDisplayBuilder | ((builder: TextDisplayBuilder) => TextDisplayBuilder)
154+
>
155+
) {
156+
const normalized = normalizeArray(components);
157+
const resolved = normalized.map((row) => resolveBuilder(row, TextDisplayBuilder));
158+
159+
this.components.push(...resolved);
160+
161+
return this;
162+
}
163+
131164
/**
132165
* Adds action rows to this modal.
133166
*
@@ -211,7 +244,9 @@ export class ModalBuilder implements JSONEncodable<APIModalInteractionResponseCa
211244
* @param components - The components to set
212245
* @deprecated Use {@link ModalBuilder.setLabelComponents} instead
213246
*/
214-
public setComponents(...components: RestOrArray<ActionRowBuilder<ModalActionRowComponentBuilder> | LabelBuilder>) {
247+
public setComponents(
248+
...components: RestOrArray<ActionRowBuilder<ModalActionRowComponentBuilder> | LabelBuilder | TextDisplayBuilder>
249+
) {
215250
this.components.splice(0, this.components.length, ...normalizeArray(components));
216251
return this;
217252
}

0 commit comments

Comments
 (0)