Initial Paprika Next.js implementation
This commit is contained in:
46
lib/submission-schema.ts
Normal file
46
lib/submission-schema.ts
Normal file
@@ -0,0 +1,46 @@
|
||||
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>;
|
||||
Reference in New Issue
Block a user