mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-13 18:13:29 +01:00
refactor: builders (#10448)
BREAKING CHANGE: formatters export removed (prev. deprecated) BREAKING CHANGE: `SelectMenuBuilder` and `SelectMenuOptionBuilder` have been removed (prev. deprecated) BREAKING CHANGE: `EmbedBuilder` no longer takes camalCase options BREAKING CHANGE: `ActionRowBuilder` now has specialized `[add/set]X` methods as opposed to the current `[add/set]Components` BREAKING CHANGE: Removed `equals` methods BREAKING CHANGE: Sapphire -> zod for validation BREAKING CHANGE: Removed the ability to pass `null`/`undefined` to clear fields, use `clearX()` instead BREAKING CHANGE: Renamed all "slash command" symbols to instead use "chat input command" BREAKING CHANGE: Removed `ContextMenuCommandBuilder` in favor of `MessageCommandBuilder` and `UserCommandBuilder` BREAKING CHANGE: Removed support for passing the "string key"s of enums BREAKING CHANGE: Removed `Button` class in favor for specialized classes depending on the style BREAKING CHANGE: Removed nested `addX` styled-methods in favor of plural `addXs` Co-authored-by: Vlad Frangu <me@vladfrangu.dev> Co-authored-by: Almeida <github@almeidx.dev>
This commit is contained in:
@@ -1,12 +1,17 @@
|
||||
import { ComponentType, type APIMessageComponent, type APIModalComponent } from 'discord-api-types/v10';
|
||||
import {
|
||||
ActionRowBuilder,
|
||||
type AnyComponentBuilder,
|
||||
type MessageComponentBuilder,
|
||||
type ModalComponentBuilder,
|
||||
} from './ActionRow.js';
|
||||
import type { APIButtonComponent, APIMessageComponent, APIModalComponent } from 'discord-api-types/v10';
|
||||
import { ButtonStyle, ComponentType } from 'discord-api-types/v10';
|
||||
import { ActionRowBuilder } from './ActionRow.js';
|
||||
import type { AnyAPIActionRowComponent } from './Component.js';
|
||||
import { ComponentBuilder } from './Component.js';
|
||||
import { ButtonBuilder } from './button/Button.js';
|
||||
import type { BaseButtonBuilder } from './button/Button.js';
|
||||
import {
|
||||
DangerButtonBuilder,
|
||||
PrimaryButtonBuilder,
|
||||
SecondaryButtonBuilder,
|
||||
SuccessButtonBuilder,
|
||||
} from './button/CustomIdButton.js';
|
||||
import { LinkButtonBuilder } from './button/LinkButton.js';
|
||||
import { PremiumButtonBuilder } from './button/PremiumButton.js';
|
||||
import { ChannelSelectMenuBuilder } from './selectMenu/ChannelSelectMenu.js';
|
||||
import { MentionableSelectMenuBuilder } from './selectMenu/MentionableSelectMenu.js';
|
||||
import { RoleSelectMenuBuilder } from './selectMenu/RoleSelectMenu.js';
|
||||
@@ -14,6 +19,48 @@ import { StringSelectMenuBuilder } from './selectMenu/StringSelectMenu.js';
|
||||
import { UserSelectMenuBuilder } from './selectMenu/UserSelectMenu.js';
|
||||
import { TextInputBuilder } from './textInput/TextInput.js';
|
||||
|
||||
/**
|
||||
* The builders that may be used for messages.
|
||||
*/
|
||||
export type MessageComponentBuilder = ActionRowBuilder | MessageActionRowComponentBuilder;
|
||||
|
||||
/**
|
||||
* The builders that may be used for modals.
|
||||
*/
|
||||
export type ModalComponentBuilder = ActionRowBuilder | ModalActionRowComponentBuilder;
|
||||
|
||||
/**
|
||||
* Any button builder
|
||||
*/
|
||||
export type ButtonBuilder =
|
||||
| DangerButtonBuilder
|
||||
| LinkButtonBuilder
|
||||
| PremiumButtonBuilder
|
||||
| PrimaryButtonBuilder
|
||||
| SecondaryButtonBuilder
|
||||
| SuccessButtonBuilder;
|
||||
|
||||
/**
|
||||
* The builders that may be used within an action row for messages.
|
||||
*/
|
||||
export type MessageActionRowComponentBuilder =
|
||||
| ButtonBuilder
|
||||
| ChannelSelectMenuBuilder
|
||||
| MentionableSelectMenuBuilder
|
||||
| RoleSelectMenuBuilder
|
||||
| StringSelectMenuBuilder
|
||||
| UserSelectMenuBuilder;
|
||||
|
||||
/**
|
||||
* The builders that may be used within an action row for modals.
|
||||
*/
|
||||
export type ModalActionRowComponentBuilder = TextInputBuilder;
|
||||
|
||||
/**
|
||||
* Any action row component builder.
|
||||
*/
|
||||
export type AnyActionRowComponentBuilder = MessageActionRowComponentBuilder | ModalActionRowComponentBuilder;
|
||||
|
||||
/**
|
||||
* Components here are mapped to their respective builder.
|
||||
*/
|
||||
@@ -21,9 +68,9 @@ export interface MappedComponentTypes {
|
||||
/**
|
||||
* The action row component type is associated with an {@link ActionRowBuilder}.
|
||||
*/
|
||||
[ComponentType.ActionRow]: ActionRowBuilder<AnyComponentBuilder>;
|
||||
[ComponentType.ActionRow]: ActionRowBuilder;
|
||||
/**
|
||||
* The button component type is associated with a {@link ButtonBuilder}.
|
||||
* The button component type is associated with a {@link BaseButtonBuilder}.
|
||||
*/
|
||||
[ComponentType.Button]: ButtonBuilder;
|
||||
/**
|
||||
@@ -75,7 +122,7 @@ export function createComponentBuilder<ComponentBuilder extends MessageComponent
|
||||
|
||||
export function createComponentBuilder(
|
||||
data: APIMessageComponent | APIModalComponent | MessageComponentBuilder,
|
||||
): ComponentBuilder {
|
||||
): ComponentBuilder<AnyAPIActionRowComponent> {
|
||||
if (data instanceof ComponentBuilder) {
|
||||
return data;
|
||||
}
|
||||
@@ -84,7 +131,7 @@ export function createComponentBuilder(
|
||||
case ComponentType.ActionRow:
|
||||
return new ActionRowBuilder(data);
|
||||
case ComponentType.Button:
|
||||
return new ButtonBuilder(data);
|
||||
return createButtonBuilder(data);
|
||||
case ComponentType.StringSelect:
|
||||
return new StringSelectMenuBuilder(data);
|
||||
case ComponentType.TextInput:
|
||||
@@ -102,3 +149,23 @@ export function createComponentBuilder(
|
||||
throw new Error(`Cannot properly serialize component type: ${data.type}`);
|
||||
}
|
||||
}
|
||||
|
||||
function createButtonBuilder(data: APIButtonComponent): ButtonBuilder {
|
||||
switch (data.style) {
|
||||
case ButtonStyle.Primary:
|
||||
return new PrimaryButtonBuilder(data);
|
||||
case ButtonStyle.Secondary:
|
||||
return new SecondaryButtonBuilder(data);
|
||||
case ButtonStyle.Success:
|
||||
return new SuccessButtonBuilder(data);
|
||||
case ButtonStyle.Danger:
|
||||
return new DangerButtonBuilder(data);
|
||||
case ButtonStyle.Link:
|
||||
return new LinkButtonBuilder(data);
|
||||
case ButtonStyle.Premium:
|
||||
return new PremiumButtonBuilder(data);
|
||||
default:
|
||||
// @ts-expect-error This case can still occur if we get a newer unsupported button style
|
||||
throw new Error(`Cannot properly serialize button with style: ${data.style}`);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user