feat(string-prompt): Adds string prompt to menu item

This commit is contained in:
Michel Fedde 2025-06-22 14:41:18 +02:00
parent 1d73ee8a78
commit 5c7c9c9f87
6 changed files with 164 additions and 26 deletions

View file

@ -13,7 +13,8 @@ import {
inlineCode,
italic,
Snowflake,
StringSelectMenuBuilder, StringSelectMenuOptionBuilder
StringSelectMenuBuilder, StringSelectMenuOptionBuilder, TextInputBuilder,
TextInputStyle
} from "discord.js";
import {ChannelId} from "../types/DiscordTypes";
import {MessageActionRowComponentBuilder} from "@discordjs/builders";
@ -80,7 +81,24 @@ export class ConfigurationMenuHandler {
setValue: this.setValue.bind(this)
}
]
}
},
{
traversalKey: "calendar",
label: "Calendar",
description: "Provides settings for the metadata contained in the playdate exports.",
type: MenuItemType.Collection,
children: [
{
traversalKey: "title",
label: "Title",
description: "Defines how the calendar entry should be called.",
type: MenuItemType.Prompt,
getCurrentValue: this.getStringValue.bind(this),
getActionRowBuilder: this.getStringBuilder.bind(this),
setValue: this.setValue.bind(this)
}
]
},
]
}
@ -158,7 +176,29 @@ export class ConfigurationMenuHandler {
)
}
private setValue(value: FieldMenuItemSaveValue[], context: FieldMenuItemContext): void {
this.configuration.saveConfiguration(context.path.join('.'), value.join('; '));
private getStringValue(context: FieldMenuItemContext): string {
const value = this.configuration.getConfigurationByPath(context.path.join('.'));
if (!value) {
return "";
}
if (typeof value !== 'string') {
throw new TypeError(`Value of type ${typeof value} can't be used for a string value!`)
}
return value;
}
private getStringBuilder(context: FieldMenuItemContext): TextInputBuilder {
return new TextInputBuilder()
.setStyle(TextInputStyle.Short)
}
private setValue(value: FieldMenuItemSaveValue[]|string, context: FieldMenuItemContext): void {
const savedValue = typeof value !== 'string' ?
value.join('; ') :
value;
this.configuration.saveConfiguration(context.path.join('.'), savedValue);
}
}

View file

@ -15,6 +15,9 @@ export class GroupConfigurationHandler {
locale: new Intl.Locale('en-GB'),
permissions: {
allowMemberManagingPlaydates: false
},
calendar: {
title: null
}
}

View file

@ -7,6 +7,7 @@ export enum TransformerType {
Locale,
Channel,
PermissionBoolean,
String
}
type GroupConfigurationTransformer = {
@ -15,7 +16,7 @@ type GroupConfigurationTransformer = {
}
export type GroupConfigurationResult =
ChannelId | Intl.Locale | boolean
ChannelId | Intl.Locale | boolean | string
export class GroupConfigurationTransformers {
static TRANSFORMERS: GroupConfigurationTransformer[] = [
@ -34,6 +35,10 @@ export class GroupConfigurationTransformers {
{
path: ['permissions', 'allowMemberManagingPlaydates'],
type: TransformerType.PermissionBoolean
},
{
path: ['calendar', 'title'],
type: TransformerType.String
}
];
@ -50,6 +55,8 @@ export class GroupConfigurationTransformers {
return <ChannelId>configValue.value;
case TransformerType.PermissionBoolean:
return configValue.value === '1';
case TransformerType.String:
return configValue.value;
}
}

View file

@ -4,7 +4,8 @@ import {Nullable} from "../types/Nullable";
export type RuntimeGroupConfiguration = {
channels: Nullable<ChannelRuntimeGroupConfiguration>,
locale: Intl.Locale,
permissions: PermissionRuntimeGroupConfiguration
permissions: PermissionRuntimeGroupConfiguration,
calendar: CalendarRuntimeGroupConfiguration
};
export type ChannelRuntimeGroupConfiguration = {
@ -14,4 +15,8 @@ export type ChannelRuntimeGroupConfiguration = {
export type PermissionRuntimeGroupConfiguration = {
allowMemberManagingPlaydates: boolean
}
export type CalendarRuntimeGroupConfiguration = {
title: null|string
}