47 lines
1.5 KiB
TypeScript
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>;
|