76 lines
1.8 KiB
TypeScript
76 lines
1.8 KiB
TypeScript
import { z } from "zod";
|
|
|
|
/** Serializable custom field blocks for a user-authored method card (wizard step 3). */
|
|
export type CustomMethodCardFieldBlock =
|
|
| {
|
|
kind: "text";
|
|
id: string;
|
|
blockTitle: string;
|
|
placeholderText: string;
|
|
}
|
|
| {
|
|
kind: "badges";
|
|
id: string;
|
|
blockTitle: string;
|
|
options: string[];
|
|
}
|
|
| {
|
|
kind: "upload";
|
|
id: string;
|
|
blockTitle: string;
|
|
fileName?: string;
|
|
}
|
|
| {
|
|
kind: "proportion";
|
|
id: string;
|
|
blockTitle: string;
|
|
defaultPercent: number;
|
|
};
|
|
|
|
const customMethodTextBlockSchema = z
|
|
.object({
|
|
kind: z.literal("text"),
|
|
id: z.string().max(80),
|
|
blockTitle: z.string().max(200),
|
|
placeholderText: z.string().max(8000),
|
|
})
|
|
.strict();
|
|
|
|
const customMethodBadgesBlockSchema = z
|
|
.object({
|
|
kind: z.literal("badges"),
|
|
id: z.string().max(80),
|
|
blockTitle: z.string().max(200),
|
|
options: z.array(z.string().max(200)).max(50),
|
|
})
|
|
.strict();
|
|
|
|
const customMethodUploadBlockSchema = z
|
|
.object({
|
|
kind: z.literal("upload"),
|
|
id: z.string().max(80),
|
|
blockTitle: z.string().max(200),
|
|
fileName: z.string().max(500).optional(),
|
|
})
|
|
.strict();
|
|
|
|
const customMethodProportionBlockSchema = z
|
|
.object({
|
|
kind: z.literal("proportion"),
|
|
id: z.string().max(80),
|
|
blockTitle: z.string().max(200),
|
|
defaultPercent: z.number().int().min(1).max(100),
|
|
})
|
|
.strict();
|
|
|
|
export const customMethodCardFieldBlockSchema = z.discriminatedUnion("kind", [
|
|
customMethodTextBlockSchema,
|
|
customMethodBadgesBlockSchema,
|
|
customMethodUploadBlockSchema,
|
|
customMethodProportionBlockSchema,
|
|
]);
|
|
|
|
export const customMethodCardFieldBlocksByIdSchema = z
|
|
.record(z.string().max(80), z.array(customMethodCardFieldBlockSchema).max(30))
|
|
.optional();
|