2023-07-27 07:31:52 +02:00
|
|
|
/*
|
2024-02-13 16:59:27 +01:00
|
|
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
2023-07-27 07:31:52 +02:00
|
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
*/
|
|
|
|
|
2024-05-27 13:54:53 +02:00
|
|
|
import * as Misskey from 'misskey-js';
|
|
|
|
|
2024-01-06 10:43:28 +01:00
|
|
|
type EnumItem = string | {
|
|
|
|
label: string;
|
|
|
|
value: string;
|
|
|
|
};
|
|
|
|
|
2024-05-27 13:54:53 +02:00
|
|
|
type Hidden = boolean | ((v: any) => boolean);
|
|
|
|
|
2020-07-11 03:13:11 +02:00
|
|
|
export type FormItem = {
|
|
|
|
label?: string;
|
|
|
|
type: 'string';
|
|
|
|
default: string | null;
|
2024-02-28 10:26:38 +01:00
|
|
|
description?: string;
|
|
|
|
required?: boolean;
|
2024-05-27 13:54:53 +02:00
|
|
|
hidden?: Hidden;
|
2020-07-11 03:13:11 +02:00
|
|
|
multiline?: boolean;
|
2024-02-28 10:26:38 +01:00
|
|
|
treatAsMfm?: boolean;
|
2020-07-11 03:13:11 +02:00
|
|
|
} | {
|
|
|
|
label?: string;
|
|
|
|
type: 'number';
|
|
|
|
default: number | null;
|
2024-02-28 10:26:38 +01:00
|
|
|
description?: string;
|
|
|
|
required?: boolean;
|
2024-05-27 13:54:53 +02:00
|
|
|
hidden?: Hidden;
|
2020-07-11 03:13:11 +02:00
|
|
|
step?: number;
|
|
|
|
} | {
|
|
|
|
label?: string;
|
|
|
|
type: 'boolean';
|
|
|
|
default: boolean | null;
|
2024-02-28 10:26:38 +01:00
|
|
|
description?: string;
|
2024-05-27 13:54:53 +02:00
|
|
|
hidden?: Hidden;
|
2020-07-11 03:13:11 +02:00
|
|
|
} | {
|
|
|
|
label?: string;
|
|
|
|
type: 'enum';
|
|
|
|
default: string | null;
|
2024-02-28 10:26:38 +01:00
|
|
|
required?: boolean;
|
2024-05-27 13:54:53 +02:00
|
|
|
hidden?: Hidden;
|
2023-07-06 13:23:54 +02:00
|
|
|
enum: EnumItem[];
|
2022-01-08 12:30:01 +01:00
|
|
|
} | {
|
|
|
|
label?: string;
|
|
|
|
type: 'radio';
|
|
|
|
default: unknown | null;
|
2024-02-28 10:26:38 +01:00
|
|
|
required?: boolean;
|
2024-05-27 13:54:53 +02:00
|
|
|
hidden?: Hidden;
|
2022-01-08 12:30:01 +01:00
|
|
|
options: {
|
|
|
|
label: string;
|
|
|
|
value: unknown;
|
|
|
|
}[];
|
2024-01-06 10:43:28 +01:00
|
|
|
} | {
|
|
|
|
label?: string;
|
|
|
|
type: 'range';
|
|
|
|
default: number | null;
|
2024-02-28 10:26:38 +01:00
|
|
|
description?: string;
|
|
|
|
required?: boolean;
|
|
|
|
step?: number;
|
2024-01-06 10:43:28 +01:00
|
|
|
min: number;
|
|
|
|
max: number;
|
2024-02-28 10:26:38 +01:00
|
|
|
textConverter?: (value: number) => string;
|
2024-05-27 13:54:53 +02:00
|
|
|
hidden?: Hidden;
|
2022-01-08 12:30:01 +01:00
|
|
|
} | {
|
|
|
|
label?: string;
|
|
|
|
type: 'object';
|
|
|
|
default: Record<string, unknown> | null;
|
2024-05-27 13:54:53 +02:00
|
|
|
hidden: Hidden;
|
2020-08-22 03:06:17 +02:00
|
|
|
} | {
|
|
|
|
label?: string;
|
|
|
|
type: 'array';
|
|
|
|
default: unknown[] | null;
|
2024-05-27 13:54:53 +02:00
|
|
|
hidden: Hidden;
|
2024-02-28 10:26:38 +01:00
|
|
|
} | {
|
|
|
|
type: 'button';
|
|
|
|
content?: string;
|
2024-05-27 13:54:53 +02:00
|
|
|
hidden?: Hidden;
|
2024-02-28 10:26:38 +01:00
|
|
|
action: (ev: MouseEvent, v: any) => void;
|
2024-05-27 13:54:53 +02:00
|
|
|
} | {
|
|
|
|
type: 'drive-file';
|
|
|
|
defaultFileId?: string | null;
|
|
|
|
hidden?: Hidden;
|
|
|
|
validate?: (v: Misskey.entities.DriveFile) => Promise<boolean>;
|
2020-07-11 03:13:11 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
export type Form = Record<string, FormItem>;
|
2022-01-08 12:30:01 +01:00
|
|
|
|
|
|
|
type GetItemType<Item extends FormItem> =
|
|
|
|
Item['type'] extends 'string' ? string :
|
|
|
|
Item['type'] extends 'number' ? number :
|
|
|
|
Item['type'] extends 'boolean' ? boolean :
|
|
|
|
Item['type'] extends 'radio' ? unknown :
|
2024-01-06 10:43:28 +01:00
|
|
|
Item['type'] extends 'range' ? number :
|
2022-01-08 12:30:01 +01:00
|
|
|
Item['type'] extends 'enum' ? string :
|
|
|
|
Item['type'] extends 'array' ? unknown[] :
|
2024-05-27 13:54:53 +02:00
|
|
|
Item['type'] extends 'object' ? Record<string, unknown> :
|
|
|
|
Item['type'] extends 'drive-file' ? Misskey.entities.DriveFile | undefined :
|
|
|
|
never;
|
2022-01-08 12:30:01 +01:00
|
|
|
|
|
|
|
export type GetFormResultType<F extends Form> = {
|
|
|
|
[P in keyof F]: GetItemType<F[P]>;
|
|
|
|
};
|