import { type APIActionRowComponent, ComponentType, APIMessageActionRowComponent, APIModalActionRowComponent, APIActionRowComponentTypes, } from 'discord-api-types/v10'; import { ComponentBuilder } from './Component'; import { createComponentBuilder } from './Components'; import type { ButtonBuilder } from './button/Button'; import type { SelectMenuBuilder } from './selectMenu/SelectMenu'; import type { TextInputBuilder } from './textInput/TextInput'; import { normalizeArray, type RestOrArray } from '../util/normalizeArray'; export type MessageComponentBuilder = | MessageActionRowComponentBuilder | ActionRowBuilder; export type ModalComponentBuilder = ModalActionRowComponentBuilder | ActionRowBuilder; export type MessageActionRowComponentBuilder = ButtonBuilder | SelectMenuBuilder; export type ModalActionRowComponentBuilder = TextInputBuilder; export type AnyComponentBuilder = MessageActionRowComponentBuilder | ModalActionRowComponentBuilder; /** * Represents an action row component * * @typeParam T - The types of components this action row holds */ export class ActionRowBuilder extends ComponentBuilder< APIActionRowComponent > { /** * The components within this action row */ public readonly components: T[]; public constructor({ components, ...data }: Partial> = {}) { super({ type: ComponentType.ActionRow, ...data }); this.components = (components?.map((c) => createComponentBuilder(c)) ?? []) as T[]; } /** * Adds components to this action row. * * @param components - The components to add to this action row. */ public addComponents(...components: RestOrArray) { this.components.push(...normalizeArray(components)); return this; } /** * Sets the components in this action row * * @param components - The components to set this row to */ public setComponents(...components: RestOrArray) { this.components.splice(0, this.components.length, ...normalizeArray(components)); return this; } /** * {@inheritDoc ComponentBuilder.toJSON} */ public toJSON(): APIActionRowComponent> { // eslint-disable-next-line @typescript-eslint/consistent-type-assertions return { ...this.data, components: this.components.map((component) => component.toJSON()), } as APIActionRowComponent>; } }