Skip to main content
Version: Next

Modal

The Modal component allows you to create interactive forms that appear as popups in Discord. Modals are useful for collecting user input in a structured way.

Basic Usage

import {
Modal,
ShortInput,
ParagraphInput,
OnModalKitSubmit,
} from 'commandkit';

const handleSubmit: OnModalKitSubmit = async (interaction, context) => {
const name = interaction.fields.getTextInputValue('name');
const description = interaction.fields.getTextInputValue('description');

await interaction.reply({
content: `Name: ${name}\nDescription: ${description}`,
});

context.dispose();
};

const modal = (
<Modal title="User Profile" onSubmit={handleSubmit}>
<ShortInput
customId="name"
label="Name"
placeholder="Enter your name"
required
/>
<ParagraphInput
customId="description"
label="Description"
placeholder="Tell us about yourself"
/>
</Modal>
);

Input Types

Short Input

For single-line text input.

<ShortInput
customId="username"
label="Username"
placeholder="Enter username"
required
minLength={3}
maxLength={20}
/>

Paragraph Input

For multi-line text input.

<ParagraphInput
customId="bio"
label="Biography"
placeholder="Write your bio here..."
required
minLength={10}
maxLength={1000}
/>

Showing the Modal

import { Modal, ShortInput } from 'commandkit';

export async function chatInput(ctx: ChatInputCommandContext) {
const modal = (
<Modal title="Feedback" onSubmit={handleSubmit}>
<ShortInput
customId="feedback"
label="Your Feedback"
placeholder="What do you think?"
required
/>
</Modal>
);

await ctx.interaction.showModal(modal);
}

Important Notes

  • Modals can have up to 5 input fields
  • Each input field must have a unique customId
  • Input fields can be marked as required using the required prop
  • You can set minimum and maximum lengths for text inputs
  • Modals can only be shown in response to an interaction
  • The modal title must be between 1 and 45 characters
  • Input labels must be between 1 and 45 characters
  • Placeholders are optional but recommended for better UX
  • Always dispose of the context after handling the submission