refactor: make public builder props getters (#7422)

Co-authored-by: Jiralite <33201955+Jiralite@users.noreply.github.com>
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
This commit is contained in:
Suneet Tipirneni
2022-02-13 07:06:11 -05:00
committed by GitHub
parent 3ae6f3c313
commit e8252ed3b9
17 changed files with 370 additions and 233 deletions

View File

@@ -1,28 +1,54 @@
import { ComponentType, type APISelectMenuComponent } from 'discord-api-types/v9';
import type { Component } from '../Component';
import { SelectMenuOption } from './SelectMenuOption';
import { Component } from '../Component';
import { UnsafeSelectMenuOption } from './UnsafeSelectMenuOption';
/**
* Represents a non-validated select menu component
*/
export class UnsafeSelectMenuComponent 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;
export class UnsafeSelectMenuComponent extends Component<
Partial<Omit<APISelectMenuComponent, 'options'>> & { type: ComponentType.SelectMenu }
> {
public readonly options: UnsafeSelectMenuOption[];
public constructor(data?: APISelectMenuComponent) {
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;
public constructor(data?: Partial<APISelectMenuComponent>) {
const { options, ...initData } = data ?? {};
super({ type: ComponentType.SelectMenu, ...initData });
this.options = options?.map((o) => new UnsafeSelectMenuOption(o)) ?? [];
}
/**
* The placeholder for this select menu
*/
public get placeholder() {
return this.data.placeholder;
}
/**
* The maximum amount of options that can be selected
*/
public get maxValues() {
return this.data.max_values;
}
/**
* The minimum amount of options that must be selected
*/
public get minValues() {
return this.data.min_values;
}
/**
* The custom id of this select menu
*/
public get customId() {
return this.data.custom_id;
}
/**
* Whether this select menu is disabled
*/
public get disabled() {
return this.data.disabled;
}
/**
@@ -30,34 +56,34 @@ export class UnsafeSelectMenuComponent implements Component {
* @param placeholder The placeholder to use for this select menu
*/
public setPlaceholder(placeholder: string) {
Reflect.set(this, 'placeholder', placeholder);
this.data.placeholder = placeholder;
return this;
}
/**
* Sets thes minimum values that must be selected in the select menu
* 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) {
Reflect.set(this, 'min_values', minValues);
this.data.min_values = minValues;
return this;
}
/**
* Sets thes maximum values that must be selected in the select menu
* 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) {
Reflect.set(this, 'max_values', maxValues);
this.data.max_values = maxValues;
return this;
}
/**
* Sets the custom Id for this select menu
* @param customId The custom ID to use for this select menu
* @param customId The custom id to use for this select menu
*/
public setCustomId(customId: string) {
Reflect.set(this, 'custom_id', customId);
this.data.custom_id = customId;
return this;
}
@@ -66,7 +92,7 @@ export class UnsafeSelectMenuComponent implements Component {
* @param disabled Whether or not this select menu is disabled
*/
public setDisabled(disabled: boolean) {
Reflect.set(this, 'disabled', disabled);
this.data.disabled = disabled;
return this;
}
@@ -75,7 +101,7 @@ export class UnsafeSelectMenuComponent implements Component {
* @param options The options to add to this select menu
* @returns
*/
public addOptions(...options: SelectMenuOption[]) {
public addOptions(...options: UnsafeSelectMenuOption[]) {
this.options.push(...options);
return this;
}
@@ -84,15 +110,16 @@ export class UnsafeSelectMenuComponent implements Component {
* 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]);
public setOptions(options: UnsafeSelectMenuOption[]) {
this.options.splice(0, this.options.length, ...options);
return this;
}
public toJSON(): APISelectMenuComponent {
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
return {
...this,
options: this.options.map((option) => option.toJSON()),
};
...this.data,
options: this.options.map((o) => o.toJSON()),
} as APISelectMenuComponent;
}
}