Files
MeetPaprika/lib/submission-schema.ts

47 lines
1.5 KiB
TypeScript

import { z } from "zod";
const emptyToUndefined = (value: unknown) => {
if (typeof value !== "string") return value;
const trimmed = value.trim();
return trimmed.length ? trimmed : undefined;
};
const optionalString = z.preprocess(emptyToUndefined, z.string().max(4000).optional());
const optionalUrl = z.preprocess(
emptyToUndefined,
z.string().url("Enter a valid URL, including https://").max(500).optional()
);
const baseSubmissionSchema = z.object({
type: z.enum(["start", "ask"]),
name: z.string().trim().min(1, "Name is required").max(160),
email: z.string().trim().email("Enter a valid email").max(255),
linkedin: optionalUrl,
consentAccepted: z.literal(true, {
errorMap: () => ({ message: "You must acknowledge the disclaimer before submitting" })
}),
sourcePath: z.string().max(200).optional()
});
export const startSubmissionSchema = baseSubmissionSchema.extend({
type: z.literal("start"),
companyWebsite: optionalUrl,
currentRoleCompany: optionalString,
fieldOrIndustry: optionalString,
reason: z.string().trim().min(1, "Tell us what brings you to Paprika").max(4000),
existingRecognition: optionalString,
timeline: optionalString
});
export const askSubmissionSchema = baseSubmissionSchema.extend({
type: z.literal("ask"),
question: z.string().trim().min(1, "Question is required").max(4000)
});
export const submissionSchema = z.discriminatedUnion("type", [
startSubmissionSchema,
askSubmissionSchema
]);
export type SubmissionInput = z.infer<typeof submissionSchema>;