mirror of
https://github.com/discordeno/discordeno.git
synced 2026-09-17 08:47:22 +00:00
feat(components): File upload component for modals (#4468)
* feat(components): File upload component for modals * Update comments upstream has been merged into the file uploads pr * reverse transform, comment typo fix
This commit is contained in:
@@ -3,6 +3,8 @@ import {
|
|||||||
type DiscordButtonComponent,
|
type DiscordButtonComponent,
|
||||||
type DiscordContainerComponent,
|
type DiscordContainerComponent,
|
||||||
type DiscordFileComponent,
|
type DiscordFileComponent,
|
||||||
|
type DiscordFileUploadComponent,
|
||||||
|
type DiscordFileUploadInteractionResponse,
|
||||||
type DiscordLabelComponent,
|
type DiscordLabelComponent,
|
||||||
type DiscordLabelInteractionResponse,
|
type DiscordLabelInteractionResponse,
|
||||||
type DiscordMediaGalleryComponent,
|
type DiscordMediaGalleryComponent,
|
||||||
@@ -69,6 +71,9 @@ export function transformComponent(bot: Bot, payload: DiscordMessageComponent |
|
|||||||
case MessageComponentTypes.Label:
|
case MessageComponentTypes.Label:
|
||||||
component = transformLabelComponent(bot, payload)
|
component = transformLabelComponent(bot, payload)
|
||||||
break
|
break
|
||||||
|
case MessageComponentTypes.FileUpload:
|
||||||
|
component = transformFileUploadComponent(bot, payload)
|
||||||
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
return bot.transformers.customizers.component(bot, payload, component)
|
return bot.transformers.customizers.component(bot, payload, component)
|
||||||
@@ -294,3 +299,23 @@ function transformLabelComponent(bot: Bot, payload: DiscordLabelComponent | Disc
|
|||||||
|
|
||||||
return label
|
return label
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function transformFileUploadComponent(bot: Bot, payload: DiscordFileUploadComponent | DiscordFileUploadInteractionResponse): Component {
|
||||||
|
const props = bot.transformers.desiredProperties.component
|
||||||
|
const fileUpload = {} as Component
|
||||||
|
|
||||||
|
if (props.type && payload.type) fileUpload.type = payload.type
|
||||||
|
if (props.id && payload.id) fileUpload.id = payload.id
|
||||||
|
if (props.customId && payload.custom_id) fileUpload.customId = payload.custom_id
|
||||||
|
|
||||||
|
// Check that this is a response
|
||||||
|
if ('values' in payload) {
|
||||||
|
if (props.values && payload.values) fileUpload.values = payload.values
|
||||||
|
} else {
|
||||||
|
if (props.minValues && payload.min_values) fileUpload.minValues = payload.min_values
|
||||||
|
if (props.maxValues && payload.max_values) fileUpload.maxValues = payload.max_values
|
||||||
|
if (props.required && payload.required) fileUpload.required = payload.required
|
||||||
|
}
|
||||||
|
|
||||||
|
return fileUpload
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import {
|
|||||||
type DiscordButtonComponent,
|
type DiscordButtonComponent,
|
||||||
type DiscordContainerComponent,
|
type DiscordContainerComponent,
|
||||||
type DiscordFileComponent,
|
type DiscordFileComponent,
|
||||||
|
type DiscordFileUploadComponent,
|
||||||
type DiscordLabelComponent,
|
type DiscordLabelComponent,
|
||||||
type DiscordMediaGalleryComponent,
|
type DiscordMediaGalleryComponent,
|
||||||
type DiscordMediaGalleryItem,
|
type DiscordMediaGalleryItem,
|
||||||
@@ -53,6 +54,8 @@ export function transformComponentToDiscordComponent(
|
|||||||
return transformThumbnailComponent(bot, payload)
|
return transformThumbnailComponent(bot, payload)
|
||||||
case MessageComponentTypes.Label:
|
case MessageComponentTypes.Label:
|
||||||
return transformLabelComponent(bot, payload)
|
return transformLabelComponent(bot, payload)
|
||||||
|
case MessageComponentTypes.FileUpload:
|
||||||
|
return transformFileUploadComponent(bot, payload)
|
||||||
case MessageComponentTypes.Separator:
|
case MessageComponentTypes.Separator:
|
||||||
case MessageComponentTypes.TextDisplay:
|
case MessageComponentTypes.TextDisplay:
|
||||||
// As of now they are compatible
|
// As of now they are compatible
|
||||||
@@ -223,3 +226,14 @@ function transformLabelComponent(bot: Bot, payload: Component): DiscordLabelComp
|
|||||||
component: bot.transformers.reverse.component(bot, payload.component!) as DiscordLabelComponent['component'],
|
component: bot.transformers.reverse.component(bot, payload.component!) as DiscordLabelComponent['component'],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function transformFileUploadComponent(bot: Bot, payload: Component): DiscordFileUploadComponent {
|
||||||
|
return {
|
||||||
|
type: MessageComponentTypes.FileUpload,
|
||||||
|
id: payload.id,
|
||||||
|
custom_id: payload.customId!,
|
||||||
|
max_values: payload.maxValues,
|
||||||
|
min_values: payload.minValues,
|
||||||
|
required: payload.required,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -39,6 +39,8 @@ export enum MessageComponentTypes {
|
|||||||
Container = 17,
|
Container = 17,
|
||||||
/** Container associating a label and description with a component */
|
/** Container associating a label and description with a component */
|
||||||
Label,
|
Label,
|
||||||
|
/** Component for uploading files */
|
||||||
|
FileUpload,
|
||||||
}
|
}
|
||||||
|
|
||||||
export type DiscordMessageComponents = DiscordMessageComponent[]
|
export type DiscordMessageComponents = DiscordMessageComponent[]
|
||||||
@@ -55,6 +57,7 @@ export type DiscordMessageComponent =
|
|||||||
| DiscordContainerComponent
|
| DiscordContainerComponent
|
||||||
| DiscordFileComponent
|
| DiscordFileComponent
|
||||||
| DiscordLabelComponent
|
| DiscordLabelComponent
|
||||||
|
| DiscordFileUploadComponent
|
||||||
|
|
||||||
export type DiscordMessageComponentFromModalInteractionResponse =
|
export type DiscordMessageComponentFromModalInteractionResponse =
|
||||||
| DiscordTextInputInteractionResponse
|
| DiscordTextInputInteractionResponse
|
||||||
@@ -547,7 +550,7 @@ export interface DiscordLabelComponent extends DiscordBaseComponent {
|
|||||||
*/
|
*/
|
||||||
description?: string
|
description?: string
|
||||||
/** The component within the label */
|
/** The component within the label */
|
||||||
component: DiscordTextInputComponent | DiscordSelectMenuComponent
|
component: DiscordTextInputComponent | DiscordSelectMenuComponent | DiscordFileUploadComponent
|
||||||
}
|
}
|
||||||
|
|
||||||
/** https://discord.com/developers/docs/components/reference#label-label-interaction-response-structure */
|
/** https://discord.com/developers/docs/components/reference#label-label-interaction-response-structure */
|
||||||
@@ -563,6 +566,50 @@ export interface DiscordLabelInteractionResponse {
|
|||||||
| DiscordRoleSelectInteractionResponseFromModal
|
| DiscordRoleSelectInteractionResponseFromModal
|
||||||
| DiscordMentionableSelectInteractionResponseFromModal
|
| DiscordMentionableSelectInteractionResponseFromModal
|
||||||
| DiscordChannelSelectInteractionResponseFromModal
|
| DiscordChannelSelectInteractionResponseFromModal
|
||||||
|
| DiscordFileUploadInteractionResponse
|
||||||
|
}
|
||||||
|
|
||||||
|
/** https://discord.com/developers/docs/components/reference#file-upload-file-upload-structure */
|
||||||
|
export interface DiscordFileUploadComponent extends DiscordBaseComponent {
|
||||||
|
type: MessageComponentTypes.FileUpload
|
||||||
|
|
||||||
|
/** The custom id for the file upload */
|
||||||
|
custom_id: string
|
||||||
|
/**
|
||||||
|
* The minimum number of files that must be uploaded
|
||||||
|
*
|
||||||
|
* @remarks
|
||||||
|
* Between 0-10
|
||||||
|
*
|
||||||
|
* @default 1
|
||||||
|
*/
|
||||||
|
min_values?: number
|
||||||
|
/** The maximum number of files that can be uploaded
|
||||||
|
*
|
||||||
|
* @remarks
|
||||||
|
* Between 1-10
|
||||||
|
*
|
||||||
|
* @default 1
|
||||||
|
*/
|
||||||
|
max_values?: number
|
||||||
|
/**
|
||||||
|
* Whether this component is required to be filled
|
||||||
|
*
|
||||||
|
* @default true
|
||||||
|
*/
|
||||||
|
required?: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
/** https://discord.com/developers/docs/components/reference#file-upload-file-upload-interaction-response-structure */
|
||||||
|
export interface DiscordFileUploadInteractionResponse {
|
||||||
|
type: MessageComponentTypes.FileUpload
|
||||||
|
|
||||||
|
/** Unique identifier for the component */
|
||||||
|
id: number
|
||||||
|
/** The custom id for the file upload */
|
||||||
|
custom_id: string
|
||||||
|
/** IDs of the uploaded files found in the resolved data */
|
||||||
|
values: string[]
|
||||||
}
|
}
|
||||||
|
|
||||||
/** https://discord.com/developers/docs/components/reference#unfurled-media-item-structure */
|
/** https://discord.com/developers/docs/components/reference#unfurled-media-item-structure */
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ export type MessageComponent =
|
|||||||
| ContainerComponent
|
| ContainerComponent
|
||||||
| FileComponent
|
| FileComponent
|
||||||
| LabelComponent
|
| LabelComponent
|
||||||
|
| FileUploadComponent
|
||||||
|
|
||||||
/** https://discord.com/developers/docs/components/reference#anatomy-of-a-component */
|
/** https://discord.com/developers/docs/components/reference#anatomy-of-a-component */
|
||||||
export interface BaseComponent {
|
export interface BaseComponent {
|
||||||
@@ -439,4 +440,32 @@ export interface LabelComponent extends BaseComponent {
|
|||||||
| RoleSelectComponent
|
| RoleSelectComponent
|
||||||
| MentionableSelectComponent
|
| MentionableSelectComponent
|
||||||
| ChannelSelectComponent
|
| ChannelSelectComponent
|
||||||
|
| FileUploadComponent
|
||||||
|
}
|
||||||
|
|
||||||
|
/** https://discord.com/developers/docs/components/reference#file-upload-file-upload-structure */
|
||||||
|
export interface FileUploadComponent extends BaseComponent {
|
||||||
|
type: MessageComponentTypes.FileUpload
|
||||||
|
|
||||||
|
/** The custom id for the file upload */
|
||||||
|
customId: string
|
||||||
|
/**
|
||||||
|
* The minimum number of files that must be uploaded
|
||||||
|
*
|
||||||
|
* @remarks
|
||||||
|
* Between 0-10
|
||||||
|
*/
|
||||||
|
minValues?: number
|
||||||
|
/** The maximum number of files that can be uploaded
|
||||||
|
*
|
||||||
|
* @remarks
|
||||||
|
* Between 1-10
|
||||||
|
*/
|
||||||
|
maxValues?: number
|
||||||
|
/**
|
||||||
|
* Whether this component is required to be filled
|
||||||
|
*
|
||||||
|
* @default true
|
||||||
|
*/
|
||||||
|
required?: boolean
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user