diff --git a/packages/frontend/src/components/MkDialog.vue b/packages/frontend/src/components/MkDialog.vue index fe8384a4be..6887405713 100644 --- a/packages/frontend/src/components/MkDialog.vue +++ b/packages/frontend/src/components/MkDialog.vue @@ -75,6 +75,8 @@ type Select = { default: string | null; }; +type Result = string | number | true | null; + const props = withDefaults(defineProps<{ type?: 'success' | 'error' | 'warning' | 'info' | 'question' | 'waiting'; title?: string; @@ -101,7 +103,7 @@ const props = withDefaults(defineProps<{ }); const emit = defineEmits<{ - (ev: 'done', v: { canceled: boolean; result: any }): void; + (ev: 'done', v: { canceled: true } | { canceled: false, result: Result }): void; (ev: 'closed'): void; }>(); @@ -127,8 +129,11 @@ const okButtonDisabledReason = computed; export function inputText(props: { type?: 'text' | 'email' | 'password' | 'url'; title?: string; @@ -291,7 +306,21 @@ export function inputText(props: { }): Promise<{ canceled: true; result: undefined; } | { - canceled: false; result: string; + canceled: false; result: string | null; +}>; +export function inputText(props: { + type?: 'text' | 'email' | 'password' | 'url'; + title?: string; + text?: string; + placeholder?: string | null; + autocomplete?: string; + default?: string | null; + minLength?: number; + maxLength?: number; +}): Promise<{ + canceled: true; result: undefined; +} | { + canceled: false; result: string | null; }> { return new Promise(resolve => { popup(MkDialog, { @@ -313,6 +342,18 @@ export function inputText(props: { }); } +// default が指定されていたら result は null になり得ないことを保証する overload function +export function inputNumber(props: { + title?: string; + text?: string; + placeholder?: string | null; + autocomplete?: string; + default: number; +}): Promise<{ + canceled: true; result: undefined; +} | { + canceled: false; result: number; +}>; export function inputNumber(props: { title?: string; text?: string; @@ -322,7 +363,18 @@ export function inputNumber(props: { }): Promise<{ canceled: true; result: undefined; } | { - canceled: false; result: number; + canceled: false; result: number | null; +}>; +export function inputNumber(props: { + title?: string; + text?: string; + placeholder?: string | null; + autocomplete?: string; + default?: number | null; +}): Promise<{ + canceled: true; result: undefined; +} | { + canceled: false; result: number | null; }> { return new Promise(resolve => { popup(MkDialog, { @@ -383,6 +435,20 @@ export function authenticateDialog(): Promise<{ }); } +// default が指定されていたら result は null になり得ないことを保証する overload function +export function select(props: { + title?: string; + text?: string; + default: string; + items: { + value: C; + text: string; + }[]; +}): Promise<{ + canceled: true; result: undefined; +} | { + canceled: false; result: C; +}>; export function select(props: { title?: string; text?: string; @@ -394,7 +460,20 @@ export function select(props: { }): Promise<{ canceled: true; result: undefined; } | { - canceled: false; result: C; + canceled: false; result: C | null; +}>; +export function select(props: { + title?: string; + text?: string; + default?: string | null; + items: { + value: C; + text: string; + }[]; +}): Promise<{ + canceled: true; result: undefined; +} | { + canceled: false; result: C | null; }> { return new Promise(resolve => { popup(MkDialog, { diff --git a/packages/frontend/src/pages/emoji-edit-dialog.vue b/packages/frontend/src/pages/emoji-edit-dialog.vue index 2682c487ee..310f52f6af 100644 --- a/packages/frontend/src/pages/emoji-edit-dialog.vue +++ b/packages/frontend/src/pages/emoji-edit-dialog.vue @@ -135,7 +135,7 @@ async function addRole() { const { canceled, result: role } = await os.select({ items: roles.filter(r => r.isPublic).filter(r => !currentRoleIds.includes(r.id)).map(r => ({ text: r.name, value: r })), }); - if (canceled) return; + if (canceled || role == null) return; rolesThatCanBeUsedThisEmojiAsReaction.value.push(role); } diff --git a/packages/frontend/src/pages/settings/preferences-backups.vue b/packages/frontend/src/pages/settings/preferences-backups.vue index ea9c5949ab..ffa38a788a 100644 --- a/packages/frontend/src/pages/settings/preferences-backups.vue +++ b/packages/frontend/src/pages/settings/preferences-backups.vue @@ -203,6 +203,7 @@ async function saveNew(): Promise { const { canceled, result: name } = await os.inputText({ title: ts._preferencesBackups.inputName, + default: '', }); if (canceled) return; @@ -371,6 +372,7 @@ async function rename(id: string): Promise { const { canceled: cancel1, result: name } = await os.inputText({ title: ts._preferencesBackups.inputName, + default: '', }); if (cancel1 || profiles.value[id].name === name) return;