-
-
Notifications
You must be signed in to change notification settings - Fork 4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(components): Add unsafe message component builders (#7387)
- Loading branch information
1 parent
04502ce
commit 6b6222b
Showing
12 changed files
with
566 additions
and
430 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
import type { ButtonStyle, APIMessageComponentEmoji, APIButtonComponent } from 'discord-api-types/v9'; | ||
import { | ||
buttonLabelValidator, | ||
buttonStyleValidator, | ||
customIdValidator, | ||
disabledValidator, | ||
emojiValidator, | ||
urlValidator, | ||
validateRequiredButtonParameters, | ||
} from '../Assertions'; | ||
import { UnsafeButtonComponent } from './UnsafeButton'; | ||
|
||
export class ButtonComponent extends UnsafeButtonComponent { | ||
public override setStyle(style: ButtonStyle) { | ||
return super.setStyle(buttonStyleValidator.parse(style)); | ||
} | ||
|
||
public override setURL(url: string) { | ||
return super.setURL(urlValidator.parse(url)); | ||
} | ||
|
||
public override setCustomId(customId: string) { | ||
return super.setCustomId(customIdValidator.parse(customId)); | ||
} | ||
|
||
public override setEmoji(emoji: APIMessageComponentEmoji) { | ||
return super.setEmoji(emojiValidator.parse(emoji)); | ||
} | ||
|
||
public override setDisabled(disabled: boolean) { | ||
return super.setDisabled(disabledValidator.parse(disabled)); | ||
} | ||
|
||
public override setLabel(label: string) { | ||
return super.setLabel(buttonLabelValidator.parse(label)); | ||
} | ||
|
||
public override toJSON(): APIButtonComponent { | ||
validateRequiredButtonParameters(this.style, this.label, this.emoji, this.custom_id, this.url); | ||
return super.toJSON(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
102 changes: 15 additions & 87 deletions
102
packages/builders/src/components/selectMenu/SelectMenu.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,111 +1,39 @@ | ||
import { APISelectMenuComponent, ComponentType } from 'discord-api-types/v9'; | ||
import type { APISelectMenuComponent } from 'discord-api-types/v9'; | ||
import { | ||
customIdValidator, | ||
disabledValidator, | ||
minMaxValidator, | ||
placeholderValidator, | ||
validateRequiredSelectMenuParameters, | ||
} from '../Assertions'; | ||
import type { Component } from '../Component'; | ||
import { SelectMenuOption } from './SelectMenuOption'; | ||
import { UnsafeSelectMenuComponent } from './UnsafeSelectMenu'; | ||
|
||
/** | ||
* Represents a select menu component | ||
*/ | ||
export class SelectMenuComponent implements Component { | ||
public readonly type = ComponentType.SelectMenu as const; | ||
public readonly options: SelectMenuOption[]; | ||
public readonly placeholder?: string; | ||
public readonly min_values?: number; | ||
public readonly max_values?: number; | ||
public readonly custom_id!: string; | ||
public readonly disabled?: boolean; | ||
|
||
public constructor(data?: APISelectMenuComponent & { type?: ComponentType.SelectMenu }) { | ||
this.options = data?.options.map((option) => new SelectMenuOption(option)) ?? []; | ||
this.placeholder = data?.placeholder; | ||
this.min_values = data?.min_values; | ||
this.max_values = data?.max_values; | ||
/* eslint-disable @typescript-eslint/non-nullable-type-assertion-style */ | ||
this.custom_id = data?.custom_id as string; | ||
/* eslint-enable @typescript-eslint/non-nullable-type-assertion-style */ | ||
this.disabled = data?.disabled; | ||
} | ||
|
||
/** | ||
* Sets the placeholder for this select menu | ||
* @param placeholder The placeholder to use for this select menu | ||
*/ | ||
public setPlaceholder(placeholder: string) { | ||
placeholderValidator.parse(placeholder); | ||
Reflect.set(this, 'placeholder', placeholder); | ||
return this; | ||
} | ||
|
||
/** | ||
* Sets the minimum values that must be selected in the select menu | ||
* @param minValues The minimum values that must be selected | ||
*/ | ||
public setMinValues(minValues: number) { | ||
minMaxValidator.parse(minValues); | ||
Reflect.set(this, 'min_values', minValues); | ||
return this; | ||
} | ||
|
||
/** | ||
* Sets the maximum values that must be selected in the select menu | ||
* @param minValues The maximum values that must be selected | ||
*/ | ||
public setMaxValues(maxValues: number) { | ||
minMaxValidator.parse(maxValues); | ||
Reflect.set(this, 'max_values', maxValues); | ||
return this; | ||
export class SelectMenuComponent extends UnsafeSelectMenuComponent { | ||
public override setPlaceholder(placeholder: string) { | ||
return super.setPlaceholder(placeholderValidator.parse(placeholder)); | ||
} | ||
|
||
/** | ||
* Sets the custom Id for this select menu | ||
* @param customId The custom ID to use for this select menu | ||
*/ | ||
public setCustomId(customId: string) { | ||
customIdValidator.parse(customId); | ||
Reflect.set(this, 'custom_id', customId); | ||
return this; | ||
public override setMinValues(minValues: number) { | ||
return super.setMinValues(minMaxValidator.parse(minValues)); | ||
} | ||
|
||
/** | ||
* Sets whether or not this select menu is disabled | ||
* @param disabled Whether or not this select menu is disabled | ||
*/ | ||
public setDisabled(disabled: boolean) { | ||
disabledValidator.parse(disabled); | ||
Reflect.set(this, 'disabled', disabled); | ||
return this; | ||
public override setMaxValues(maxValues: number) { | ||
return super.setMaxValues(minMaxValidator.parse(maxValues)); | ||
} | ||
|
||
/** | ||
* Adds options to this select menu | ||
* @param options The options to add to this select menu | ||
* @returns | ||
*/ | ||
public addOptions(...options: SelectMenuOption[]) { | ||
this.options.push(...options); | ||
return this; | ||
public override setCustomId(customId: string) { | ||
return super.setCustomId(customIdValidator.parse(customId)); | ||
} | ||
|
||
/** | ||
* Sets the options on this select menu | ||
* @param options The options to set on this select menu | ||
*/ | ||
public setOptions(options: SelectMenuOption[]) { | ||
Reflect.set(this, 'options', [...options]); | ||
return this; | ||
public override setDisabled(disabled: boolean) { | ||
return super.setDisabled(disabledValidator.parse(disabled)); | ||
} | ||
|
||
public toJSON(): APISelectMenuComponent { | ||
public override toJSON(): APISelectMenuComponent { | ||
validateRequiredSelectMenuParameters(this.options, this.custom_id); | ||
return { | ||
...this, | ||
options: this.options.map((option) => option.toJSON()), | ||
}; | ||
return super.toJSON(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.