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;